summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.clang-format13
-rw-r--r--Android.bp36
-rw-r--r--Android.mk46
-rw-r--r--BoardConfig-common.mk390
-rw-r--r--CleanSpec.mk91
-rw-r--r--NOTICE190
-rw-r--r--OWNERS5
-rw-r--r--aosp_common.mk55
-rw-r--r--bluetooth/bluetooth.mk4
-rw-r--r--compatibility_matrix.xml84
-rw-r--r--component-overrides.xml23
-rw-r--r--conf/Android.bp75
-rw-r--r--conf/egl.cfg1
-rw-r--r--conf/fstab.gs101.in22
-rw-r--r--conf/fstab.persist4
-rw-r--r--conf/fstab.postinstall4
-rw-r--r--conf/init.aoc.daemon.rc1
-rw-r--r--conf/init.aoc.nodaemon.rc3
-rw-r--r--conf/init.debug.rc30
-rw-r--r--conf/init.exynos.nanohub.rc20
-rw-r--r--conf/init.factory.rc25
-rw-r--r--conf/init.gs101.rc1020
-rw-r--r--conf/init.gs101.usb.rc199
-rw-r--r--conf/init.recovery.device.rc19
-rw-r--r--conf/nomodem/Android.bp81
-rw-r--r--conf/recovery.wipe3
-rw-r--r--conf/soundtrigger_conf.h109
-rw-r--r--conf/ueventd.gs101.rc216
-rw-r--r--confirmationui/confirmationui.mk9
-rw-r--r--default-permissions.xml170
-rw-r--r--device-common.mk53
-rw-r--r--device-shipping-common.mk22
-rw-r--r--device.mk1203
-rw-r--r--device_framework_matrix_product.xml197
-rw-r--r--device_framework_matrix_product_wireless.xml10
-rwxr-xr-xdisable_contaminant_detection.sh3
-rw-r--r--display/display_colordata_cal0.pbbin0 -> 56705 bytes
-rw-r--r--dumpstate/Android.mk47
-rw-r--r--dumpstate/DumpstateDevice.cpp1307
-rw-r--r--dumpstate/DumpstateDevice.h91
-rw-r--r--dumpstate/android.hardware.dumpstate@1.1-service.gs101.rc6
-rw-r--r--dumpstate/service.cpp43
-rw-r--r--edgetpu/OWNERS6
-rw-r--r--edgetpu/edgetpu.mk32
-rw-r--r--factory/framework/Android.bp15
-rw-r--r--factory/framework/AndroidManifest.xml24
-rw-r--r--factory/framework/res/drawable-nodpi/default_wallpaper.pngbin0 -> 22697 bytes
-rw-r--r--factory/launcher3/Android.bp15
-rw-r--r--factory/launcher3/AndroidManifest.xml25
-rw-r--r--factory/launcher3/res/xml/default_workspace_5x5.xml71
-rw-r--r--factory/settings/Android.bp15
-rw-r--r--factory/settings/AndroidManifest.xml25
-rw-r--r--factory/settings/res/values/defaults.xml26
-rw-r--r--factory_common.mk82
-rw-r--r--fingerprint/extension/Android.bp15
-rw-r--r--fingerprint/extension/fingerprint.extension.mk11
-rw-r--r--fingerprint/extension/fingerprint.extension.sh63
-rw-r--r--fingerprint/extension/init.fingerprint.extension.rc19
-rw-r--r--fingerprint/fpc1540/fp_tool/Android.bp28
-rw-r--r--fingerprint/fpc1540/fp_tool/fp_test.cpp200
-rw-r--r--fingerprint/fpc1540/fp_tool/fp_test.h16
-rw-r--r--fingerprint/fpc1540/sw33/fingerprint_aidl_config.mk18
-rw-r--r--fingerprint/fpc1540/sw33/fingerprint_hidl_config_factory.mk20
-rw-r--r--fingerprint/fpc1540/sw33/fpc1540.mk30
-rw-r--r--fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk26
-rw-r--r--fingerprint/fpc1540/sw35/fingerprint_hidl_config_factory.mk20
-rw-r--r--fingerprint/fpc1540/sw35/fpc1540.mk30
-rw-r--r--fingerprint/fpc1540/sw42/fingerprint_aidl_config.mk28
-rw-r--r--fingerprint/fpc1540/sw42/fingerprint_hidl_config_factory.mk18
-rw-r--r--fingerprint/fpc1540/sw42/fpc1540.mk30
-rw-r--r--fingerprint/udfps_common.mk38
-rw-r--r--fingerprint/udfps_factory.mk23
-rw-r--r--fingerprint/udfps_shipping.mk18
-rw-r--r--fingerprint/vendor.goodix.hardware.biometrics.fingerprint@2.1-service.xml11
-rw-r--r--firmware/BCM.btaddr1
-rw-r--r--firmware/BCM4362A2_001.003.006.0027.0033.hcdbin0 -> 84460 bytes
-rw-r--r--firmware/BCM4389C0_003.001.010.0101.0000_Google_eval_USI_ES10.hcdbin0 -> 493788 bytes
-rw-r--r--firmware/BCM4389C1_003.002.009.0050.0000_Google_eval_USI_ES10_ePA_Updated.hcdbin0 -> 285777 bytes
-rw-r--r--gnss/47765/Android.bp232
-rw-r--r--gnss/47765/android.hardware.gnss@2.1-service-brcm.xml7
-rwxr-xr-xgnss/47765/bin/android.hardware.gnss@2.1-impl-google.sobin0 -> 452944 bytes
-rwxr-xr-xgnss/47765/bin/android.hardware.gnss@2.1-service-brcmbin0 -> 100544 bytes
-rwxr-xr-xgnss/47765/bin/flp.default.sobin0 -> 141256 bytes
-rwxr-xr-xgnss/47765/bin/gps.default.sobin0 -> 231592 bytes
-rwxr-xr-xgnss/47765/bin/gpsdbin0 -> 9603272 bytes
-rwxr-xr-xgnss/47765/bin/lhdbin0 -> 307032 bytes
-rwxr-xr-xgnss/47765/bin/scdbin0 -> 144936 bytes
-rw-r--r--gnss/47765/config/gps.cer161
-rw-r--r--gnss/47765/config/gps.xml99
-rw-r--r--gnss/47765/config/gps.xml.oriole99
-rw-r--r--gnss/47765/config/gps.xml.raven99
-rw-r--r--gnss/47765/config/gps_user.xml98
-rw-r--r--gnss/47765/config/gps_user.xml.oriole98
-rw-r--r--gnss/47765/config/gps_user.xml.raven98
-rw-r--r--gnss/47765/config/lhd.conf34
-rw-r--r--gnss/47765/config/lhd_user.conf32
-rw-r--r--gnss/47765/config/scd.conf6
-rw-r--r--gnss/47765/config/scd_user.conf5
-rw-r--r--gnss/47765/firmware/SensorHub.patch7050
-rw-r--r--gnss/Android.mk40
-rw-r--r--gnss/device-gnss.mk49
-rw-r--r--gnss/gps_dummy.c158
-rw-r--r--health/Android.bp61
-rw-r--r--health/Health.cpp263
-rw-r--r--health/android.hardware.health-service.gs101.rc16
-rw-r--r--health/android.hardware.health-service.gs101.xml7
-rw-r--r--health/android.hardware.health-service.gs101_recovery.rc7
-rw-r--r--init.hardware.wlc.rc.userdebug24
-rw-r--r--init.insmod.gs101.cfg12
-rwxr-xr-xinit.insmod.sh78
-rw-r--r--interfaces/boot/1.0/Android.bp66
-rw-r--r--interfaces/boot/1.0/BootControl.cpp272
-rw-r--r--interfaces/boot/1.0/BootControl.h59
-rw-r--r--interfaces/boot/1.0/GptUtils.cpp199
-rw-r--r--interfaces/boot/1.0/GptUtils.h79
-rw-r--r--interfaces/boot/1.0/android.hardware.boot@1.0-service-gs101.rc4
-rw-r--r--interfaces/boot/1.0/service.cpp47
-rw-r--r--interfaces/boot/1.2/Android.bp81
-rw-r--r--interfaces/boot/1.2/BootControl.cpp437
-rw-r--r--interfaces/boot/1.2/BootControl.h69
-rw-r--r--interfaces/boot/1.2/DevInfo.h61
-rw-r--r--interfaces/boot/1.2/GptUtils.cpp193
-rw-r--r--interfaces/boot/1.2/GptUtils.h79
-rw-r--r--interfaces/boot/1.2/android.hardware.boot@1.2-service-gs101.rc7
-rw-r--r--interfaces/boot/1.2/service.cpp50
-rw-r--r--manifest.xml163
-rw-r--r--manifest_64.xml146
-rw-r--r--manifest_media.xml12
-rw-r--r--manifest_media_aosp.xml11
-rw-r--r--media_codecs.xml82
-rw-r--r--media_codecs_aosp_c2.xml234
-rw-r--r--media_codecs_bo_c2.xml52
-rw-r--r--media_codecs_performance.xml18
-rw-r--r--media_codecs_performance_c2.xml254
-rw-r--r--media_profiles.xml895
-rw-r--r--modem/user.mk4
-rw-r--r--modem/userdebug.mk4
-rw-r--r--neuralnetwork/neuralnetwork.mk2
-rw-r--r--overlay-factory/frameworks/base/packages/SettingsProvider/res/values/defaults.xml23
-rw-r--r--overlay-factory/vendor/google/apps/PixelLogger/res/values/arrays.xml7
-rw-r--r--overlay-factory/vendor/google/apps/PixelLogger/res/values/config.xml10
-rw-r--r--overlay-factory/vendor/google/apps/PixelLogger/res/values/configmessages.xml19
-rw-r--r--overlay-vendor/vendor/google/apps/ModemService/res/values/config.xml21
-rw-r--r--overlay-vendor/vendor/google/apps/PixelLogger/res/values/arrays.xml6
-rw-r--r--overlay-vendor/vendor/google/apps/PixelLogger/res/values/config.xml5
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/drawable-ldrtl/deferred_setup_closing_img.xml119
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/drawable-nodpi/placeholder.pngbin0 -> 4645 bytes
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/deferred_setup_closing_img.xml121
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/deferred_setup_welcome_img.xml167
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_deferred_setup_icon.xml35
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_language.xml26
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_logo_googleg.xml35
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_network_signal.xml39
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/layout/esim_intro_activity.xml55
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/layout/items_esim.xml74
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/layout/sim_missing_activity.xml80
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/layout/welcome_activity.xml124
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/layout/welcome_activity_pre_transition.xml23
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/raw/esim_illustration.mp4bin0 -> 84148 bytes
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/raw/sim_illustration.mp4bin0 -> 48632 bytes
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/raw/welcome_bg.mp4bin0 -> 787739 bytes
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/transition/welcome_enter.xml27
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-af/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-am/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ar/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-as/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-az/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-b+sr+Latn/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-be/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-bg/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-bn/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-bs/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ca/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-cs/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-da/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-de/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-el/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rAU/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rCA/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rGB/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rIN/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rXC/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-es-rUS/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-es/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-et/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-eu/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-fa/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-fi/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-fr-rCA/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-fr/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-gl/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-gu/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-hi/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-hr/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-hu/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-hy/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-in/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-is/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-it/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-iw/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ja/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ka/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-kk/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-km/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-kn/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ko/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ky/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-lo/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-lt/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-lv/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc204-mnc04/config.xml23
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc310-mnc004/config.xml23
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc311-mnc480/config.xml23
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-mk/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ml/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-mn/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-mr/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ms/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-my/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-nb/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ne/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-nl/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-or/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-pa/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-pl/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt-rBR/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt-rPT/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ro/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ru/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-si/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-sk/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-sl/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-sq/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-sr/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-sv/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-sw/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ta/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-te/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-th/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-tl/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-tr/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-uk/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-ur/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-uz/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-vi/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rCN/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rHK/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rTW/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values-zu/strings.xml22
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values/config.xml40
-rw-r--r--overlay-vendor/vendor/google/apps/SetupWizard/res/values/strings.xml24
-rw-r--r--overlay/frameworks/base/core/res/res/values/arrays.xml37
-rw-r--r--overlay/frameworks/base/core/res/res/values/config.xml280
-rw-r--r--overlay/frameworks/base/core/res/res/values/dimens.xml21
-rw-r--r--overlay/frameworks/base/packages/SettingsLib/res/drawable-mcc310-mnc004/ic_5g_plus_mobiledata.xml36
-rw-r--r--overlay/frameworks/base/packages/SettingsLib/res/drawable-mcc311-mnc480/ic_5g_plus_mobiledata.xml36
-rw-r--r--overlay/frameworks/base/packages/SettingsLib/res/values-mcc310-mnc004/strings.xml22
-rw-r--r--overlay/frameworks/base/packages/SettingsLib/res/values-mcc311-mnc480/strings.xml22
-rw-r--r--overlay/frameworks/base/packages/SettingsLib/res/values-mcc440-mnc20/config.xml26
-rw-r--r--overlay/frameworks/base/packages/SystemUI/res/drawable/rounded.xml24
-rw-r--r--overlay/frameworks/base/packages/SystemUI/res/values/config.xml46
-rw-r--r--overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml32
-rwxr-xr-xoverlay/packages/apps/Settings/res/values/bools.xml20
-rwxr-xr-xoverlay/packages/apps/Settings/res/values/config.xml25
-rw-r--r--overlay/packages/services/Telephony/res/values/config.xml39
-rw-r--r--pixelstats/Android.bp42
-rw-r--r--pixelstats/pixelstats-vendor.gs101.rc8
-rw-r--r--pixelstats/service.cpp79
-rw-r--r--pkvm/Android.bp31
-rw-r--r--pkvm/pkvm_enabler.c75
-rw-r--r--pkvm/pkvm_enabler.gs101.rc5
-rw-r--r--pkvm/pkvm_experiment.rc13
-rw-r--r--powerhint_a0.json343
-rw-r--r--powerhint_a1.json397
-rw-r--r--powerstats/Android.bp47
-rw-r--r--powerstats/Gs101CommonDataProviders.cpp712
-rw-r--r--powerstats/include/Gs101CommonDataProviders.h25
-rw-r--r--radio/config/Pixel_Default.cfg1
-rw-r--r--radio/config/Pixel_Default.nprfbin0 -> 9444 bytes
-rw-r--r--radio/config/Pixel_Default_metrics.xml190
-rw-r--r--radio/config/Pixel_stability.cfg1
-rw-r--r--radio/config/Pixel_stability.nprfbin0 -> 9472 bytes
-rw-r--r--radio/config/default.cfg1
-rw-r--r--radio/config/default.nprfbin0 -> 10428 bytes
-rw-r--r--radio/config/default_NAS_RRC.cfg1
-rw-r--r--radio/config/default_NAS_RRC.nprfbin0 -> 10381 bytes
-rw-r--r--radio/config/default_metrics.xml190
-rw-r--r--radio/config/default_network.cfg1
-rw-r--r--radio/config/default_network.nprfbin0 -> 10210 bytes
-rw-r--r--radio/config/default_stability.cfg1
-rw-r--r--radio/config/default_stability.nprfbin0 -> 9629 bytes
-rw-r--r--radio/config/logging.conf1
-rw-r--r--radio/config/teamfood_default.cfg1
-rw-r--r--radio/config/teamfood_default.nprfbin0 -> 10217 bytes
-rw-r--r--radio/config/teamfood_default_metrics.xml190
-rw-r--r--radio/gnss_blanking.csv4
-rw-r--r--rro_overlays/ConnectivityOverlay/Android.bp9
-rw-r--r--rro_overlays/ConnectivityOverlay/AndroidManifest.xml27
-rw-r--r--rro_overlays/ConnectivityOverlay/res/values-mcc204-mnc04/config.xml28
-rw-r--r--rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc004/config.xml24
-rw-r--r--rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc590/config.xml24
-rw-r--r--rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc599/config.xml24
-rw-r--r--rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc270/config.xml24
-rw-r--r--rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc280/config.xml24
-rw-r--r--rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc480/config.xml24
-rw-r--r--rro_overlays/ConnectivityOverlay/res/values/config.xml30
-rw-r--r--rro_overlays/EuiccSupportPixelOverlay/Android.bp18
-rw-r--r--rro_overlays/EuiccSupportPixelOverlay/AndroidManifest.xml26
-rw-r--r--rro_overlays/EuiccSupportPixelOverlay/res/values/config.xml37
-rw-r--r--rro_overlays/WifiOverlay/Android.bp18
-rw-r--r--rro_overlays/WifiOverlay/AndroidManifest.xml27
-rw-r--r--rro_overlays/WifiOverlay/OWNERS5
-rw-r--r--rro_overlays/WifiOverlay/res/values/config.xml147
-rw-r--r--sensorhal/sensorlist.cpp578
-rw-r--r--sensors/Android.mk34
-rw-r--r--sensors/sensors_dummy.c409
-rw-r--r--sepolicy/OWNERS3
-rw-r--r--sepolicy/ambient/exo_app.te (renamed from ambient/exo_app.te)0
-rw-r--r--sepolicy/ambient/seapp_contexts (renamed from ambient/seapp_contexts)0
-rw-r--r--sepolicy/bluetooth/device.te (renamed from bluetooth/device.te)0
-rw-r--r--sepolicy/bluetooth/file_contexts (renamed from bluetooth/file_contexts)0
-rw-r--r--sepolicy/bluetooth/genfs_contexts (renamed from bluetooth/genfs_contexts)0
-rw-r--r--sepolicy/bluetooth/hal_bluetooth_btlinux.te (renamed from bluetooth/hal_bluetooth_btlinux.te)0
-rw-r--r--sepolicy/bluetooth/hwservice.te (renamed from bluetooth/hwservice.te)0
-rw-r--r--sepolicy/bluetooth/hwservice_contexts (renamed from bluetooth/hwservice_contexts)0
-rw-r--r--sepolicy/confirmationui/device.te (renamed from confirmationui/device.te)0
-rw-r--r--sepolicy/confirmationui/file_contexts (renamed from confirmationui/file_contexts)0
-rw-r--r--sepolicy/confirmationui/hal_confirmationui.te (renamed from confirmationui/hal_confirmationui.te)0
-rw-r--r--sepolicy/confirmationui/securedpud.slider.te (renamed from confirmationui/securedpud.slider.te)0
-rw-r--r--sepolicy/display/common/file.te (renamed from display/common/file.te)0
-rw-r--r--sepolicy/display/common/file_contexts (renamed from display/common/file_contexts)0
-rw-r--r--sepolicy/display/gs101/genfs_contexts (renamed from display/gs101/genfs_contexts)0
-rw-r--r--sepolicy/display/gs101/hal_graphics_composer_default.te (renamed from display/gs101/hal_graphics_composer_default.te)0
-rw-r--r--sepolicy/edgetpu/device.te (renamed from edgetpu/device.te)0
-rw-r--r--sepolicy/edgetpu/edgetpu_app_service.te (renamed from edgetpu/edgetpu_app_service.te)0
-rw-r--r--sepolicy/edgetpu/edgetpu_logging.te (renamed from edgetpu/edgetpu_logging.te)0
-rw-r--r--sepolicy/edgetpu/edgetpu_vendor_service.te (renamed from edgetpu/edgetpu_vendor_service.te)0
-rw-r--r--sepolicy/edgetpu/file.te (renamed from edgetpu/file.te)0
-rw-r--r--sepolicy/edgetpu/file_contexts (renamed from edgetpu/file_contexts)0
-rw-r--r--sepolicy/edgetpu/genfs_contexts (renamed from edgetpu/genfs_contexts)0
-rw-r--r--sepolicy/edgetpu/hal_neuralnetworks_darwinn.te (renamed from edgetpu/hal_neuralnetworks_darwinn.te)0
-rw-r--r--sepolicy/edgetpu/priv_app.te (renamed from edgetpu/priv_app.te)0
-rw-r--r--sepolicy/edgetpu/property.te (renamed from edgetpu/property.te)0
-rw-r--r--sepolicy/edgetpu/property_contexts (renamed from edgetpu/property_contexts)0
-rw-r--r--sepolicy/edgetpu/service.te (renamed from edgetpu/service.te)0
-rw-r--r--sepolicy/edgetpu/service_contexts (renamed from edgetpu/service_contexts)0
-rw-r--r--sepolicy/edgetpu/untrusted_app_all.te (renamed from edgetpu/untrusted_app_all.te)0
-rw-r--r--sepolicy/edgetpu/vendor_init.te (renamed from edgetpu/vendor_init.te)0
-rw-r--r--sepolicy/gs101-sepolicy.mk (renamed from gs101-sepolicy.mk)0
-rw-r--r--sepolicy/health/file_contexts (renamed from health/file_contexts)0
-rw-r--r--sepolicy/modem/user/dmd.te (renamed from modem/user/dmd.te)0
-rw-r--r--sepolicy/modem/user/file.te (renamed from modem/user/file.te)0
-rw-r--r--sepolicy/modem/user/file_contexts (renamed from modem/user/file_contexts)0
-rw-r--r--sepolicy/modem/user/property.te (renamed from modem/user/property.te)0
-rw-r--r--sepolicy/modem/user/property_contexts (renamed from modem/user/property_contexts)0
-rw-r--r--sepolicy/modem/userdebug/file_contexts (renamed from modem/userdebug/file_contexts)0
-rw-r--r--sepolicy/modem/userdebug/vcd.te (renamed from modem/userdebug/vcd.te)0
-rw-r--r--sepolicy/neuralnetworks/file_contexts (renamed from neuralnetworks/file_contexts)0
-rw-r--r--sepolicy/neuralnetworks/hal_neuralnetworks_armnn.te (renamed from neuralnetworks/hal_neuralnetworks_armnn.te)0
-rw-r--r--sepolicy/pkvm/file_contexts (renamed from pkvm/file_contexts)0
-rw-r--r--sepolicy/pkvm/vendor_misc_writer.te (renamed from pkvm/vendor_misc_writer.te)0
-rw-r--r--sepolicy/private/dex2oat.te (renamed from private/dex2oat.te)0
-rw-r--r--sepolicy/private/fsverity_init.te (renamed from private/fsverity_init.te)0
-rw-r--r--sepolicy/private/gmscore_app.te (renamed from private/gmscore_app.te)0
-rw-r--r--sepolicy/private/hal_dumpstate_default.te (renamed from private/hal_dumpstate_default.te)0
-rw-r--r--sepolicy/private/incidentd.te (renamed from private/incidentd.te)0
-rw-r--r--sepolicy/private/lpdumpd.te (renamed from private/lpdumpd.te)0
-rw-r--r--sepolicy/private/permissioncontroller_app.te (renamed from private/permissioncontroller_app.te)0
-rw-r--r--sepolicy/private/postinstall_dexopt.te (renamed from private/postinstall_dexopt.te)0
-rw-r--r--sepolicy/private/priv_app.te (renamed from private/priv_app.te)0
-rw-r--r--sepolicy/private/radio.te (renamed from private/radio.te)0
-rw-r--r--sepolicy/private/service_contexts (renamed from private/service_contexts)0
-rw-r--r--sepolicy/private/untrusted_app_25.te (renamed from private/untrusted_app_25.te)0
-rw-r--r--sepolicy/private/wait_for_keymaster.te (renamed from private/wait_for_keymaster.te)0
-rw-r--r--sepolicy/system_ext/private/platform_app.te (renamed from system_ext/private/platform_app.te)0
-rw-r--r--sepolicy/system_ext/private/property_contexts (renamed from system_ext/private/property_contexts)0
-rw-r--r--sepolicy/system_ext/public/property.te (renamed from system_ext/public/property.te)0
-rw-r--r--sepolicy/telephony/pktrouter/device.te (renamed from telephony/pktrouter/device.te)0
-rw-r--r--sepolicy/telephony/pktrouter/file_contexts (renamed from telephony/pktrouter/file_contexts)0
-rw-r--r--sepolicy/telephony/pktrouter/netutils_wrapper.te (renamed from telephony/pktrouter/netutils_wrapper.te)0
-rw-r--r--sepolicy/telephony/pktrouter/pktrouter.te (renamed from telephony/pktrouter/pktrouter.te)0
-rw-r--r--sepolicy/telephony/pktrouter/property.te (renamed from telephony/pktrouter/property.te)0
-rw-r--r--sepolicy/telephony/pktrouter/property_contexts (renamed from telephony/pktrouter/property_contexts)0
-rw-r--r--sepolicy/telephony/pktrouter/vendor_init.te (renamed from telephony/pktrouter/vendor_init.te)0
-rw-r--r--sepolicy/telephony/user/file_contexts (renamed from telephony/user/file_contexts)0
-rw-r--r--sepolicy/telephony/user/init_radio.te (renamed from telephony/user/init_radio.te)0
-rw-r--r--sepolicy/tracking_denials/dumpstate.te (renamed from tracking_denials/dumpstate.te)0
-rw-r--r--sepolicy/tracking_denials/hal_drm_default.te (renamed from tracking_denials/hal_drm_default.te)0
-rw-r--r--sepolicy/tracking_denials/hal_fingerprint_default.te (renamed from tracking_denials/hal_fingerprint_default.te)0
-rw-r--r--sepolicy/tracking_denials/hal_neuralnetworks_armnn.te (renamed from tracking_denials/hal_neuralnetworks_armnn.te)0
-rw-r--r--sepolicy/tracking_denials/hal_power_default.te (renamed from tracking_denials/hal_power_default.te)0
-rw-r--r--sepolicy/tracking_denials/incidentd.te (renamed from tracking_denials/incidentd.te)0
-rw-r--r--sepolicy/tracking_denials/init-insmod-sh.te (renamed from tracking_denials/init-insmod-sh.te)0
-rw-r--r--sepolicy/tracking_denials/kernel.te (renamed from tracking_denials/kernel.te)0
-rw-r--r--sepolicy/tracking_denials/rebalance_interrupts_vendor.te (renamed from tracking_denials/rebalance_interrupts_vendor.te)0
-rw-r--r--sepolicy/tracking_denials/surfaceflinger.te (renamed from tracking_denials/surfaceflinger.te)0
-rw-r--r--sepolicy/tracking_denials/untrusted_app.te (renamed from tracking_denials/untrusted_app.te)0
-rw-r--r--sepolicy/tracking_denials/update_engine.te (renamed from tracking_denials/update_engine.te)0
-rw-r--r--sepolicy/tracking_denials/uwb_vendor_app.te (renamed from tracking_denials/uwb_vendor_app.te)0
-rw-r--r--sepolicy/tracking_denials/vendor_init.te (renamed from tracking_denials/vendor_init.te)0
-rw-r--r--sepolicy/trusty_metricsd/file_contexts (renamed from trusty_metricsd/file_contexts)0
-rw-r--r--sepolicy/trusty_metricsd/trusty_metricsd.te (renamed from trusty_metricsd/trusty_metricsd.te)0
-rw-r--r--sepolicy/usf/file.te (renamed from usf/file.te)0
-rw-r--r--sepolicy/usf/file_contexts (renamed from usf/file_contexts)0
-rw-r--r--sepolicy/usf/sensor_hal.te (renamed from usf/sensor_hal.te)0
-rw-r--r--sepolicy/usf/te_macros (renamed from usf/te_macros)0
-rw-r--r--sepolicy/whitechapel/vendor/google/aocd.te (renamed from whitechapel/vendor/google/aocd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/aocdump.te (renamed from whitechapel/vendor/google/aocdump.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/attributes (renamed from whitechapel/vendor/google/attributes)0
-rw-r--r--sepolicy/whitechapel/vendor/google/audioserver.te (renamed from whitechapel/vendor/google/audioserver.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/bipchmgr.te (renamed from whitechapel/vendor/google/bipchmgr.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/bluetooth.te (renamed from whitechapel/vendor/google/bluetooth.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/bootanim.te (renamed from whitechapel/vendor/google/bootanim.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/bootdevice_sysdev.te (renamed from whitechapel/vendor/google/bootdevice_sysdev.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/bug_map (renamed from whitechapel/vendor/google/bug_map)0
-rw-r--r--sepolicy/whitechapel/vendor/google/cbd.te (renamed from whitechapel/vendor/google/cbd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/cbrs_setup.te (renamed from whitechapel/vendor/google/cbrs_setup.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/cccdk_timesync_app.te (renamed from whitechapel/vendor/google/cccdk_timesync_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/certs/EuiccSupportPixel.x509.pem (renamed from whitechapel/vendor/google/certs/EuiccSupportPixel.x509.pem)0
-rw-r--r--sepolicy/whitechapel/vendor/google/certs/com_google_mds.x509.pem (renamed from whitechapel/vendor/google/certs/com_google_mds.x509.pem)0
-rw-r--r--sepolicy/whitechapel/vendor/google/certs/com_qorvo_uwb.x509.pem (renamed from whitechapel/vendor/google/certs/com_qorvo_uwb.x509.pem)0
-rw-r--r--sepolicy/whitechapel/vendor/google/charger_vendor.te (renamed from whitechapel/vendor/google/charger_vendor.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/chre.te (renamed from whitechapel/vendor/google/chre.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/con_monitor.te (renamed from whitechapel/vendor/google/con_monitor.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/device.te (renamed from whitechapel/vendor/google/device.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/disable-contaminant-detection-sh.te (renamed from whitechapel/vendor/google/disable-contaminant-detection-sh.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/dmd.te (renamed from whitechapel/vendor/google/dmd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/domain.te (renamed from whitechapel/vendor/google/domain.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/dumpstate.te (renamed from whitechapel/vendor/google/dumpstate.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/e2fs.te (renamed from whitechapel/vendor/google/e2fs.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/euiccpixel_app.te (renamed from whitechapel/vendor/google/euiccpixel_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/exo_camera_injection/dumpstate.te (renamed from whitechapel/vendor/google/exo_camera_injection/dumpstate.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/exo_camera_injection/exo_app.te (renamed from whitechapel/vendor/google/exo_camera_injection/exo_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/exo_camera_injection/file_contexts (renamed from whitechapel/vendor/google/exo_camera_injection/file_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/exo_camera_injection/hal_exo_camera_injection.te (renamed from whitechapel/vendor/google/exo_camera_injection/hal_exo_camera_injection.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/exo_camera_injection/hwservice.te (renamed from whitechapel/vendor/google/exo_camera_injection/hwservice.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/exo_camera_injection/hwservice_contexts (renamed from whitechapel/vendor/google/exo_camera_injection/hwservice_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/fastbootd.te (renamed from whitechapel/vendor/google/fastbootd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/file.te (renamed from whitechapel/vendor/google/file.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/file_contexts (renamed from whitechapel/vendor/google/file_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/fsck.te (renamed from whitechapel/vendor/google/fsck.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/genfs_contexts (renamed from whitechapel/vendor/google/genfs_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/gpsd.te (renamed from whitechapel/vendor/google/gpsd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/grilservice_app.te (renamed from whitechapel/vendor/google/grilservice_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_audio_default.te (renamed from whitechapel/vendor/google/hal_audio_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_audiometricext_default.te (renamed from whitechapel/vendor/google/hal_audiometricext_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_bootctl_default.te (renamed from whitechapel/vendor/google/hal_bootctl_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_camera_default.te (renamed from whitechapel/vendor/google/hal_camera_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_contexthub.te (renamed from whitechapel/vendor/google/hal_contexthub.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_drm_clearkey.te (renamed from whitechapel/vendor/google/hal_drm_clearkey.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_drm_default.te (renamed from whitechapel/vendor/google/hal_drm_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_dumpstate_default.te (renamed from whitechapel/vendor/google/hal_dumpstate_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_fingerprint_default.te (renamed from whitechapel/vendor/google/hal_fingerprint_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_gnss_default.te (renamed from whitechapel/vendor/google/hal_gnss_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_graphics_allocator_default.te (renamed from whitechapel/vendor/google/hal_graphics_allocator_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_graphics_composer_default.te (renamed from whitechapel/vendor/google/hal_graphics_composer_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_health_default.te (renamed from whitechapel/vendor/google/hal_health_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_health_storage_default.te (renamed from whitechapel/vendor/google/hal_health_storage_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_input_processor_default.te (renamed from whitechapel/vendor/google/hal_input_processor_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_memtrack_default.te (renamed from whitechapel/vendor/google/hal_memtrack_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_nfc_default.te (renamed from whitechapel/vendor/google/hal_nfc_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_power_default.te (renamed from whitechapel/vendor/google/hal_power_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_power_stats_default.te (renamed from whitechapel/vendor/google/hal_power_stats_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_radioext_default.te (renamed from whitechapel/vendor/google/hal_radioext_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_secure_element_default.te (renamed from whitechapel/vendor/google/hal_secure_element_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_secure_element_st33spi.te (renamed from whitechapel/vendor/google/hal_secure_element_st33spi.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_secure_element_st54spi.te (renamed from whitechapel/vendor/google/hal_secure_element_st54spi.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_tetheroffload_default.te (renamed from whitechapel/vendor/google/hal_tetheroffload_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_thermal_default.te (renamed from whitechapel/vendor/google/hal_thermal_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_usb_gadget_impl.te (renamed from whitechapel/vendor/google/hal_usb_gadget_impl.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_usb_impl.te (renamed from whitechapel/vendor/google/hal_usb_impl.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_uwb_vendor.te (renamed from whitechapel/vendor/google/hal_uwb_vendor.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_uwb_vendor_default.te (renamed from whitechapel/vendor/google/hal_uwb_vendor_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_vendor_hwcservice_default.te (renamed from whitechapel/vendor/google/hal_vendor_hwcservice_default.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_wifi.te (renamed from whitechapel/vendor/google/hal_wifi.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_wifi_ext.te (renamed from whitechapel/vendor/google/hal_wifi_ext.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hal_wlc.te (renamed from whitechapel/vendor/google/hal_wlc.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hardware_info_app.te (renamed from whitechapel/vendor/google/hardware_info_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hbmsvmanager_app.te (renamed from whitechapel/vendor/google/hbmsvmanager_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hwservice.te (renamed from whitechapel/vendor/google/hwservice.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hwservice_contexts (renamed from whitechapel/vendor/google/hwservice_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/hwservicemanager.te (renamed from whitechapel/vendor/google/hwservicemanager.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/incident.te (renamed from whitechapel/vendor/google/incident.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/init-insmod-sh.te (renamed from whitechapel/vendor/google/init-insmod-sh.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/init.te (renamed from whitechapel/vendor/google/init.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/installd.te (renamed from whitechapel/vendor/google/installd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/kernel.te (renamed from whitechapel/vendor/google/kernel.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/keys.conf (renamed from whitechapel/vendor/google/keys.conf)0
-rw-r--r--sepolicy/whitechapel/vendor/google/lhd.te (renamed from whitechapel/vendor/google/lhd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/logd.te (renamed from whitechapel/vendor/google/logd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/logger_app.te (renamed from whitechapel/vendor/google/logger_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/mac_permissions.xml (renamed from whitechapel/vendor/google/mac_permissions.xml)0
-rw-r--r--sepolicy/whitechapel/vendor/google/mediacodec.te (renamed from whitechapel/vendor/google/mediacodec.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/mediaprovider.te (renamed from whitechapel/vendor/google/mediaprovider.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/modem_diagnostics.te (renamed from whitechapel/vendor/google/modem_diagnostics.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/modem_logging_control.te (renamed from whitechapel/vendor/google/modem_logging_control.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/modem_svc_sit.te (renamed from whitechapel/vendor/google/modem_svc_sit.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/nfc.te (renamed from whitechapel/vendor/google/nfc.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/oemrilservice_app.te (renamed from whitechapel/vendor/google/oemrilservice_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/ofl_app.te (renamed from whitechapel/vendor/google/ofl_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/omadm.te (renamed from whitechapel/vendor/google/omadm.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/pixelstats_vendor.te (renamed from whitechapel/vendor/google/pixelstats_vendor.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/platform_app.te (renamed from whitechapel/vendor/google/platform_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/property.te (renamed from whitechapel/vendor/google/property.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/property_contexts (renamed from whitechapel/vendor/google/property_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/radio.te (renamed from whitechapel/vendor/google/radio.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/ramdump_app.te (renamed from whitechapel/vendor/google/ramdump_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/recovery.te (renamed from whitechapel/vendor/google/recovery.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/rfsd.te (renamed from whitechapel/vendor/google/rfsd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/ril_config_service.te (renamed from whitechapel/vendor/google/ril_config_service.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/rild.te (renamed from whitechapel/vendor/google/rild.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/rlsservice.te (renamed from whitechapel/vendor/google/rlsservice.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/scd.te (renamed from whitechapel/vendor/google/scd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/sced.te (renamed from whitechapel/vendor/google/sced.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/seapp_contexts (renamed from whitechapel/vendor/google/seapp_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/secure_element.te (renamed from whitechapel/vendor/google/secure_element.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/service.te (renamed from whitechapel/vendor/google/service.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/service_contexts (renamed from whitechapel/vendor/google/service_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/servicemanager.te (renamed from whitechapel/vendor/google/servicemanager.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/shell.te (renamed from whitechapel/vendor/google/shell.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/ssr_detector.te (renamed from whitechapel/vendor/google/ssr_detector.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/storageproxyd.te (renamed from whitechapel/vendor/google/storageproxyd.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/system_app.te (renamed from whitechapel/vendor/google/system_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/system_server.te (renamed from whitechapel/vendor/google/system_server.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/tcpdump_logger.te (renamed from whitechapel/vendor/google/tcpdump_logger.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/toolbox.te (renamed from whitechapel/vendor/google/toolbox.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/trusty_apploader.te (renamed from whitechapel/vendor/google/trusty_apploader.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/untrusted_app_all.te (renamed from whitechapel/vendor/google/untrusted_app_all.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/update_engine.te (renamed from whitechapel/vendor/google/update_engine.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/uwb_vendor_app.te (renamed from whitechapel/vendor/google/uwb_vendor_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vendor_ims_app.te (renamed from whitechapel/vendor/google/vendor_ims_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vendor_init.te (renamed from whitechapel/vendor/google/vendor_init.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vendor_rcs_app.te (renamed from whitechapel/vendor/google/vendor_rcs_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vendor_shell.te (renamed from whitechapel/vendor/google/vendor_shell.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vendor_telephony_app.te (renamed from whitechapel/vendor/google/vendor_telephony_app.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vendor_uwb_init.te (renamed from whitechapel/vendor/google/vendor_uwb_init.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vndservice.te (renamed from whitechapel/vendor/google/vndservice.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vndservice_contexts (renamed from whitechapel/vendor/google/vndservice_contexts)0
-rw-r--r--sepolicy/whitechapel/vendor/google/vold.te (renamed from whitechapel/vendor/google/vold.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/wifi_sniffer.te (renamed from whitechapel/vendor/google/wifi_sniffer.te)0
-rw-r--r--sepolicy/whitechapel/vendor/google/wlcfwupdate.te (renamed from whitechapel/vendor/google/wlcfwupdate.te)0
-rw-r--r--task_profiles.json293
-rw-r--r--telephony/pktrouter.mk3
-rw-r--r--telephony/user.mk2
-rw-r--r--thermal/Android.mk0
-rw-r--r--thermal/thermal.c0
-rw-r--r--trusty_metricsd/trusty_metricsd.mk6
-rw-r--r--tts/de-de/de-de-x-multi-r35.zvoicebin0 -> 12934788 bytes
-rw-r--r--tts/es-es/es-es-x-multi-r35.zvoicebin0 -> 6865768 bytes
-rw-r--r--tts/fr-fr/fr-fr-x-multi-r35.zvoicebin0 -> 15418397 bytes
-rw-r--r--tts/it-it/it-it-x-multi-r32.zvoicebin0 -> 9048760 bytes
-rw-r--r--tts/ja-jp/ja-jp-x-multi-r34.zvoicebin0 -> 23868374 bytes
-rw-r--r--tts/voice_packs.mk22
-rw-r--r--usb/gadget/Android.bp52
-rw-r--r--usb/gadget/UsbGadget.cpp514
-rw-r--r--usb/gadget/UsbGadget.h130
-rw-r--r--usb/gadget/android.hardware.usb.gadget-service.gs101.rc24
-rw-r--r--usb/gadget/android.hardware.usb.gadget@1.2-service.gs101.xml11
-rw-r--r--usb/gadget/service_gadget.cpp50
-rw-r--r--usb/usb/Android.bp61
-rw-r--r--usb/usb/Usb.cpp1034
-rw-r--r--usb/usb/Usb.h99
-rw-r--r--usb/usb/android.hardware.usb-service.rc69
-rw-r--r--usb/usb/android.hardware.usb-service.xml10
-rw-r--r--usb/usb/service.cpp37
-rw-r--r--uwb/calibration/UWB-calibration-am.conf1
-rw-r--r--uwb/calibration/UWB-calibration-ar.conf1
-rw-r--r--uwb/calibration/UWB-calibration-az.conf1
-rw-r--r--uwb/calibration/UWB-calibration-by.conf1
-rw-r--r--uwb/calibration/UWB-calibration-id.conf1
-rw-r--r--uwb/calibration/UWB-calibration-jp.conf34
-rw-r--r--uwb/calibration/UWB-calibration-kg.conf1
-rw-r--r--uwb/calibration/UWB-calibration-kz.conf1
-rw-r--r--uwb/calibration/UWB-calibration-np.conf1
-rw-r--r--uwb/calibration/UWB-calibration-pk.conf1
-rw-r--r--uwb/calibration/UWB-calibration-py.conf1
-rw-r--r--uwb/calibration/UWB-calibration-ru.conf1
-rw-r--r--uwb/calibration/UWB-calibration-sb.conf1
-rw-r--r--uwb/calibration/UWB-calibration-tj.conf1
-rw-r--r--uwb/calibration/UWB-calibration-tm.conf1
-rw-r--r--uwb/calibration/UWB-calibration-tw.conf2
-rw-r--r--uwb/calibration/UWB-calibration-ua.conf1
-rw-r--r--uwb/calibration/UWB-calibration-uz.conf1
-rwxr-xr-xuwb/calibration/country_conf_gen.sh31
-rw-r--r--uwb/calibration/init.uwb.calib.sh57
-rw-r--r--uwb/calibration/init.uwb.calib.xtal.sh25
-rw-r--r--uwb/calibration/uwb_country.conf21
-rw-r--r--uwb/uwb.mk42
-rw-r--r--vibrator/Android.mk17
-rw-r--r--wifi/BoardConfig-wifi.mk33
-rw-r--r--wifi/coex_table.xml357
-rw-r--r--wifi/p2p_supplicant_overlay.conf10
-rw-r--r--wifi/wpa_supplicant_overlay.conf10
594 files changed, 29995 insertions, 3 deletions
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 00000000..361ce945
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,13 @@
+BasedOnStyle: Google
+AccessModifierOffset: -2
+AllowShortFunctionsOnASingleLine: Inline
+ColumnLimit: 100
+CommentPragmas: NOLINT:.*
+DerivePointerAlignment: false
+IndentWidth: 4
+ContinuationIndentWidth: 8
+PointerAlignment: Right
+TabWidth: 4
+UseTab: Never
+AllowShortIfStatementsOnASingleLine: false
+SpacesBeforeTrailingComments: 2
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 00000000..57ebe85b
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,36 @@
+soong_namespace {
+ imports: [
+ "hardware/google/interfaces",
+ "hardware/google/pixel",
+ ],
+}
+
+package {
+ default_applicable_licenses: ["device_google_gs101_license"],
+}
+
+// Added automatically by a large-scale-change that took the approach of
+// 'apply every license found to every target'. While this makes sure we respect
+// every license restriction, it may not be entirely correct.
+//
+// e.g. GPL in an MIT project might only apply to the contrib/ directory.
+//
+// Please consider splitting the single license below into multiple licenses,
+// taking care not to lose any license_kind information, and overriding the
+// default license using the 'licenses: [...]' property on targets as needed.
+//
+// For unused files, consider creating a 'fileGroup' with "//visibility:private"
+// to attach the license to, and including a comment whether the files may be
+// used in the current project.
+// See: http://go/android-license-faq
+license {
+ name: "device_google_gs101_license",
+ visibility: [":__subpackages__"],
+ license_kinds: [
+ "SPDX-license-identifier-Apache-2.0",
+ "SPDX-license-identifier-BSD",
+ ],
+ license_text: [
+ "NOTICE",
+ ],
+}
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 00000000..de54c3a4
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,46 @@
+#
+# Copyright (C) 2011 The Android Open-Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# WARNING: Everything listed here will be built on ALL platforms,
+# including x86, the universal, and the SDK. Modules must be uniquely
+# named (liblights.panda), and must build everywhere, or limit themselves
+# to only building on ARM if they include assembly. Individual makefiles
+# are responsible for having their own logic, for fine-grained control.
+
+LOCAL_PATH := $(call my-dir)
+
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,default-permissions.xml,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,libnfc-nci.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,fstab.postinstall,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,ueventd.rc,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,wpa_supplicant.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,hals.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,media_profiles_V1_0.xml,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,media_codecs_performance.xml,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,device_state_configuration.xml,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,task_profiles.json,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,p2p_supplicant_overlay.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,wpa_supplicant.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+$(eval $(call declare-copy-files-license-metadata,device/google/gs101,wpa_supplicant_overlay.conf,SPDX-license-identifier-Apache-2.0,notice,build/soong/licenses/LICENSE,))
+
+$(eval $(call declare-1p-copy-files,device/google/gs101,audio_policy_configuration.xml))
+
+# if some modules are built directly from this directory (not subdirectories),
+# their rules should be written here.
+
+ifeq ($(USES_DEVICE_GOOGLE_GS101),true)
+ include $(call first-makefiles-under,$(LOCAL_PATH))
+endif
diff --git a/BoardConfig-common.mk b/BoardConfig-common.mk
new file mode 100644
index 00000000..0538b86c
--- /dev/null
+++ b/BoardConfig-common.mk
@@ -0,0 +1,390 @@
+#
+# Copyright (C) 2019 The Android Open-Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+include build/make/target/board/BoardConfigMainlineCommon.mk
+include build/make/target/board/BoardConfigPixelCommon.mk
+
+# Should be uncommented after fixing vndk-sp violation is fixed.
+PRODUCT_FULL_TREBLE_OVERRIDE := true
+
+# HACK : To fix up after bring up multimedia devices.
+TARGET_SOC := gs101
+
+TARGET_SOC_NAME := google
+
+USES_DEVICE_GOOGLE_GS101 := true
+
+TARGET_ARCH := arm64
+TARGET_ARCH_VARIANT := armv8-2a
+TARGET_CPU_ABI := arm64-v8a
+TARGET_CPU_VARIANT := cortex-a55
+TARGET_CPU_VARIANT_RUNTIME := cortex-a55
+
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifneq ($(DEVICE_IS_64BIT_ONLY),true)
+TARGET_2ND_ARCH := arm
+TARGET_2ND_ARCH_VARIANT := armv8-a
+TARGET_2ND_CPU_ABI := armeabi-v7a
+TARGET_2ND_CPU_ABI2 := armeabi
+TARGET_2ND_CPU_VARIANT := generic
+TARGET_2ND_CPU_VARIANT_RUNTIME := cortex-a53
+endif
+
+BOARD_KERNEL_CMDLINE += dyndbg=\"func alloc_contig_dump_pages +p\"
+BOARD_KERNEL_CMDLINE += earlycon=exynos4210,0x10A00000 console=ttySAC0,115200 androidboot.console=ttySAC0 printk.devkmsg=on
+BOARD_KERNEL_CMDLINE += cma_sysfs.experimental=Y
+BOARD_KERNEL_CMDLINE += swiotlb=noforce
+BOARD_BOOTCONFIG += androidboot.boot_devices=14700000.ufs
+
+TARGET_NO_BOOTLOADER := true
+TARGET_NO_RADIOIMAGE := true
+BOARD_PREBUILT_BOOTIMAGE := $(wildcard $(TARGET_KERNEL_DIR)/boot.img)
+ifneq (,$(BOARD_PREBUILT_BOOTIMAGE))
+TARGET_NO_KERNEL := true
+else
+TARGET_NO_KERNEL := false
+endif
+BOARD_USES_GENERIC_KERNEL_IMAGE := true
+BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
+BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
+TARGET_RECOVERY_WIPE := device/google/gs101/conf/recovery.wipe
+
+# This is the fstab file that will be included in the recovery image. Note that
+# recovery doesn't care about the encryption settings, so it doesn't matter
+# whether we use the normal or the fips fstab here.
+TARGET_RECOVERY_FSTAB_GENRULE = gen_fstab.gs101
+
+TARGET_RECOVERY_PIXEL_FORMAT := ABGR_8888
+TARGET_RECOVERY_UI_MARGIN_HEIGHT := 165
+TARGET_RECOVERY_UI_LIB := \
+ librecovery_ui_pixel \
+ libfstab
+
+AB_OTA_UPDATER := true
+
+AB_OTA_PARTITIONS += \
+ system \
+ system_ext \
+ product \
+ vbmeta_system
+
+ifneq ($(PRODUCT_BUILD_BOOT_IMAGE),false)
+AB_OTA_PARTITIONS += boot
+endif
+ifneq ($(PRODUCT_BUILD_VENDOR_BOOT_IMAGE),false)
+AB_OTA_PARTITIONS += vendor_boot
+AB_OTA_PARTITIONS += dtbo
+endif
+ifneq ($(PRODUCT_BUILD_VBMETA_IMAGE),false)
+AB_OTA_PARTITIONS += vbmeta
+endif
+
+# EMULATOR common modules
+BOARD_EMULATOR_COMMON_MODULES := liblight
+
+OVERRIDE_RS_DRIVER := libRSDriverArm.so
+BOARD_EGL_CFG := device/google/gs101/conf/egl.cfg
+#BOARD_USES_HGL := true
+USE_OPENGL_RENDERER := true
+NUM_FRAMEBUFFER_SURFACE_BUFFERS := 3
+BOARD_USES_EXYNOS5_COMMON_GRALLOC := true
+BOARD_USES_ALIGN_RESTRICTION := false
+BOARD_USES_GRALLOC_ION_SYNC := true
+
+# This should be the same value as USE_SWIFTSHADER in device.mk
+BOARD_USES_SWIFTSHADER := false
+
+# Gralloc4
+ifeq ($(BOARD_USES_SWIFTSHADER),true)
+$(call soong_config_set,arm_gralloc,gralloc_arm_no_external_afbc,true)
+$(call soong_config_set,arm_gralloc,mali_gpu_support_afbc_basic,false)
+$(call soong_config_set,arm_gralloc,mali_gpu_support_afbc_wideblk,false)
+$(call soong_config_set,arm_gralloc,gralloc_init_afbc,false)
+$(call soong_config_set,arm_gralloc,dpu_support_1010102_afbc,false)
+else
+$(call soong_config_set,arm_gralloc,gralloc_arm_no_external_afbc,false)
+$(call soong_config_set,arm_gralloc,mali_gpu_support_afbc_basic,true)
+$(call soong_config_set,arm_gralloc,mali_gpu_support_afbc_wideblk,true)
+$(call soong_config_set,arm_gralloc,gralloc_init_afbc,true)
+$(call soong_config_set,arm_gralloc,dpu_support_1010102_afbc,true)
+endif # ifeq ($(BOARD_USES_SWIFTSHADER),true)
+$(call soong_config_set,arm_gralloc,gralloc_ion_sync_on_lock,$(BOARD_USES_GRALLOC_ION_SYNC))
+
+# Graphics
+#BOARD_USES_EXYNOS_DATASPACE_FEATURE := true
+
+# Enable chain partition for system.
+BOARD_AVB_VBMETA_SYSTEM := system system_ext product
+BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
+BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048
+BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
+BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1
+
+# Enable chained vbmeta for boot images
+BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
+BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA2048
+BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
+BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
+
+TARGET_USERIMAGES_USE_EXT4 := true
+TARGET_USERIMAGES_USE_F2FS := true
+BOARD_USERDATAIMAGE_PARTITION_SIZE := 11796480000
+BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE := f2fs
+PRODUCT_FS_COMPRESSION := 1
+BOARD_FLASH_BLOCK_SIZE := 4096
+BOARD_MOUNT_SDCARD_RW := true
+
+# product.img
+BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE := ext4
+TARGET_COPY_OUT_PRODUCT := product
+
+# system_ext.img
+BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE := ext4
+TARGET_COPY_OUT_SYSTEM_EXT := system_ext
+
+########################
+# Video Codec
+########################
+# 1. Exynos C2
+BOARD_USE_CSC_FILTER := false
+BOARD_USE_DEC_SW_CSC := true
+BOARD_USE_ENC_SW_CSC := true
+BOARD_SUPPORT_MFC_ENC_RGB := true
+BOARD_USE_BLOB_ALLOCATOR := false
+BOARD_SUPPORT_MFC_ENC_BT2020 := true
+
+########################
+
+BOARD_SUPER_PARTITION_SIZE := 8531214336
+BOARD_SUPER_PARTITION_GROUPS := google_dynamic_partitions
+# Set size to BOARD_SUPER_PARTITION_SIZE - overhead (4MiB) (b/182237294)
+BOARD_GOOGLE_DYNAMIC_PARTITIONS_SIZE := 8527020032
+BOARD_GOOGLE_DYNAMIC_PARTITIONS_PARTITION_LIST := \
+ system \
+ system_ext \
+ product \
+ vendor \
+ vendor_dlkm
+
+# Set error limit to BOARD_SUPER_PARTITON_SIZE - 500MB
+BOARD_SUPER_PARTITION_ERROR_LIMIT := 8006926336
+
+# Testing related defines
+BOARD_PERFSETUP_SCRIPT := platform_testing/scripts/perf-setup/r4o6-setup.sh
+
+#
+# AUDIO & VOICE
+#
+BOARD_USES_GENERIC_AUDIO := true
+
+$(call soong_config_set,aoc_audio_func,ext_hidl,true)
+
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+$(call soong_config_set,aoc_audio_func,dump_usecase_data,true)
+$(call soong_config_set,aoc_audio_func,hal_socket_control,true)
+$(call soong_config_set,aoc_audio_func,record_tunning_keys,true)
+endif
+
+ifneq (,$(filter aosp_%,$(TARGET_PRODUCT)))
+$(call soong_config_set,aoc_audio_func,aosp_build,true)
+endif
+
+$(call soong_config_set,haptics,actuator_model,$(ACTUATOR_MODEL))
+
+# Primary AudioHAL Configuration
+#BOARD_USE_COMMON_AUDIOHAL := true
+#BOARD_USE_CALLIOPE_AUDIOHAL := false
+#BOARD_USE_AUDIOHAL := true
+
+# Compress Offload Configuration
+#BOARD_USE_OFFLOAD_AUDIO := true
+#BOARD_USE_OFFLOAD_EFFECT := false
+
+# SoundTriggerHAL Configuration
+#BOARD_USE_SOUNDTRIGGER_HAL := false
+
+# HWComposer
+BOARD_HWC_VERSION := libhwc2.1
+TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK := false
+BOARD_HDMI_INCAPABLE := true
+TARGET_USES_HWC2 := true
+HWC_SKIP_VALIDATE := true
+HWC_SUPPORT_RENDER_INTENT := true
+HWC_SUPPORT_COLOR_TRANSFORM := true
+#BOARD_USES_DISPLAYPORT := true
+# if AFBC is enabled, must set ro.vendor.ddk.set.afbc=1
+BOARD_USES_EXYNOS_AFBC_FEATURE := true
+#BOARD_USES_HDRUI_GLES_CONVERSION := true
+
+BOARD_LIBACRYL_DEFAULT_COMPOSITOR := fimg2d_gs101
+BOARD_LIBACRYL_G2D_HDR_PLUGIN := libacryl_hdr_plugin
+
+# HWCServices
+BOARD_USES_HWC_SERVICES := true
+
+# WiFiDisplay
+# BOARD_USES_VIRTUAL_DISPLAY := true
+# BOARD_USES_VDS_EXYNOS_HWC := true
+# BOARD_USES_WIFI_DISPLAY:= true
+# BOARD_USES_EGL_SURFACE_FOR_COMPOSITION_MIXED := true
+# BOARD_USES_VDS_YUV420SPM := true
+# BOARD_USES_VDS_OTHERFORMAT := true
+# BOARD_USES_VDS_DEBUG_FLAG := true
+# BOARD_USES_DISABLE_COMPOSITIONTYPE_GLES := true
+# BOARD_USES_SECURE_ENCODER_ONLY := true
+# BOARD_USES_TSMUX := true
+
+# SCALER
+BOARD_USES_DEFAULT_CSC_HW_SCALER := true
+BOARD_DEFAULT_CSC_HW_SCALER := 4
+BOARD_USES_SCALER_M2M1SHOT := true
+
+# Device Tree
+BOARD_USES_DT := true
+BOARD_INCLUDE_DTB_IN_BOOTIMG := true
+BOARD_PREBUILT_DTBIMAGE_DIR := $(TARGET_KERNEL_DIR)
+BOARD_PREBUILT_DTBOIMAGE := $(BOARD_PREBUILT_DTBIMAGE_DIR)/dtbo.img
+
+# PLATFORM LOG
+TARGET_USES_LOGD := true
+
+# LIBHWJPEG
+#TARGET_USES_UNIVERSAL_LIBHWJPEG := true
+#LIBHWJPEG_HWSCALER_ID := 0
+
+#Keymaster
+#BOARD_USES_KEYMASTER_VER1 := true
+
+#FMP
+#BOARD_USES_FMP_DM_CRYPT := true
+#BOARD_USES_FMP_FSCRYPTO := true
+BOARD_USES_METADATA_PARTITION := true
+
+# SKIA
+#BOARD_USES_SKIA_MULTITHREADING := true
+#BOARD_USES_FIMGAPI_V5X := true
+
+# SECCOMP Policy
+BOARD_SECCOMP_POLICY = device/google/gs101/seccomp_policy
+
+#CURL
+BOARD_USES_CURL := true
+
+# Sensor HAL
+BOARD_USES_EXYNOS_SENSORS_DUMMY := true
+
+# VISION
+# Exynos vision framework (EVF)
+#TARGET_USES_EVF := true
+# HW acceleration
+#TARGET_USES_VPU_KERNEL := true
+#TARGET_USES_SCORE_KERNEL := true
+#TARGET_USES_CL_KERNEL := false
+
+# exynos RIL
+TARGET_EXYNOS_RIL_SOURCE := true
+ENABLE_VENDOR_RIL_SERVICE := true
+
+# GNSS
+# BOARD_USES_EXYNOS_GNSS_DUMMY := true
+
+# Bluetooth defines
+# TODO(b/123695868): Remove the need for this
+BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := \
+ build/make/target/board/mainline_arm64/bluetooth
+
+#VNDK
+BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED := true
+BOARD_VNDK_VERSION := current
+
+# H/W align restriction of MM IPs
+BOARD_EXYNOS_S10B_FORMAT_ALIGN := 64
+
+# NeuralNetworks
+GPU_SOURCE_PRESENT := $(wildcard vendor/arm/mali/valhall)
+GPU_PREBUILD_PRESENT := $(wildcard vendor/google_devices/gs101/prebuilts/gpu/libs)
+ifneq (,$(strip $(GPU_SOURCE_PRESENT) $(GPU_PREBUILD_PRESENT)))
+ARMNN_COMPUTE_CL_ENABLE := 1
+else
+ARMNN_COMPUTE_CL_ENABLE := 0
+endif
+ARMNN_COMPUTE_NEON_ENABLE := 1
+
+# Boot.img
+BOARD_RAMDISK_USE_LZ4 := true
+#BOARD_KERNEL_BASE := 0x80000000
+#BOARD_KERNEL_PAGESIZE := 2048
+#BOARD_KERNEL_OFFSET := 0x80000
+#BOARD_RAMDISK_OFFSET := 0x4000000
+BOARD_BOOT_HEADER_VERSION := 4
+BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOT_HEADER_VERSION)
+
+BOARD_VENDOR_RAMDISK_FRAGMENTS := dlkm
+BOARD_VENDOR_RAMDISK_FRAGMENT.dlkm.KERNEL_MODULE_DIRS := top
+
+# Enable AVB2.0
+BOARD_AVB_ENABLE := true
+BOARD_BOOTIMAGE_PARTITION_SIZE := 0x04000000
+BOARD_VENDOR_BOOTIMAGE_PARTITION_SIZE := 0x04000000
+BOARD_DTBOIMG_PARTITION_SIZE := 0x01000000
+
+# System As Root
+BOARD_BUILD_SYSTEM_ROOT_IMAGE := false
+
+# Vendor ramdisk image for kernel development
+BOARD_BUILD_VENDOR_RAMDISK_IMAGE := true
+
+KERNEL_MODULE_DIR := $(TARGET_KERNEL_DIR)
+KERNEL_MODULES := $(wildcard $(KERNEL_MODULE_DIR)/*.ko)
+
+BOARD_VENDOR_KERNEL_MODULES_BLOCKLIST_FILE := $(KERNEL_MODULE_DIR)/vendor_dlkm.modules.blocklist
+
+# Prebuilt kernel modules that are *not* listed in vendor_boot.modules.load
+BOARD_PREBUILT_VENDOR_RAMDISK_KERNEL_MODULES = fips140/fips140.ko
+BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD_EXTRA = $(foreach k,$(BOARD_PREBUILT_VENDOR_RAMDISK_KERNEL_MODULES),$(if $(wildcard $(KERNEL_MODULE_DIR)/$(k)), $(k)))
+KERNEL_MODULES += $(addprefix $(KERNEL_MODULE_DIR)/, $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD_EXTRA))
+
+# Kernel modules that are listed in vendor_boot.modules.load
+BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD_FILE := $(strip $(shell cat $(KERNEL_MODULE_DIR)/vendor_boot.modules.load))
+ifndef BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD_FILE
+$(error vendor_boot.modules.load not found or empty)
+endif
+BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD_EXTRA)
+BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD += $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD_FILE)
+BOARD_VENDOR_RAMDISK_KERNEL_MODULES := $(addprefix $(KERNEL_MODULE_DIR)/, $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD_EXTRA))
+BOARD_VENDOR_RAMDISK_KERNEL_MODULES += $(addprefix $(KERNEL_MODULE_DIR)/, $(notdir $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD_FILE)))
+
+BOARD_VENDOR_KERNEL_MODULES_LOAD := $(strip $(shell cat $(KERNEL_MODULE_DIR)/vendor_dlkm.modules.load))
+ifndef BOARD_VENDOR_KERNEL_MODULES_LOAD
+$(error vendor_dlkm.modules.load not found or empty)
+endif
+BOARD_VENDOR_KERNEL_MODULES := $(KERNEL_MODULES)
+
+# Using BUILD_COPY_HEADERS
+BUILD_BROKEN_USES_BUILD_COPY_HEADERS := true
+
+include device/google/gs101-sepolicy/gs101-sepolicy.mk
+
+# Battery options
+BOARD_KERNEL_CMDLINE += at24.write_timeout=100
+
+# Enable larger logbuf
+BOARD_KERNEL_CMDLINE += log_buf_len=1024K
+
+# Protected VM firmware
+BOARD_PVMFWIMAGE_PARTITION_SIZE := 0x00100000
+
+-include vendor/google_devices/gs-common/proprietary/BoardConfigVendor.mk
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 00000000..e4165fbb
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,91 @@
+# 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.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list. These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+# $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list. E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+$(call add-clean-step, find $(PRODUCT_OUT) -name "*.apk" | xargs rm)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libsurfaceflinger_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libui_intermediates)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/root/default.prop)
+$(call add-clean-step, rm -f $(TARGET_OUT)/build.prop)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/system/etc/mixer_paths_lb.xml)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/system/etc/permissions/android.hardware.camera.xml)
+
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/root/*)
+# Power HAL 1.0
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/init/android.hardware.power@1.0-service.rc)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.power@1.0-service)
+# Power HAL HIDL
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/init/android.hardware.power@1.3-service.pixel-libperfmgr.rc)
+
+# Health storage HAL
+$(call add-clean-step, find $(PRODUCT_OUT) -type f -name "*android.hardware.health.storage@1.0*" -print0 | xargs -0 rm -f)
+
+# USB HAL to AIDL
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.usb-service.gs101)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.usb.gadget-service.gs101)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.usb-service.rc)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.usb.gadget-service-gs101.rc)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.usb-service.xml)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.usb.gadget@1.2-service.gs101.xml)
+
+# Power Stats HAL 1.0 to AIDL
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.power.stats@1.0-service.gs101)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/init/android.hardware.power.stats@1.0-service.gs101.rc)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.power.stats@1.0-service.gs101.xml)
+
+# Keymaster to KeyMint
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.keymaster@4.0-service.trusty)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/init/android.hardware.keymaster@4.0-service.trusty.rc)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/etc/vintf/manifest/android.hardware.keymaster@4.0-service.trusty.xml)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/vendor/bin/hw/wait_for_strongbox)
+
+# Health HAL to AIDL
+$(call add-clean-step, find $(PRODUCT_OUT)/system -type f -name "*charger*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/vendor -type f -name "*health@*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/recovery/root -type f -name "*charger*" -print0 | xargs -0 rm -f)
+$(call add-clean-step, find $(PRODUCT_OUT)/recovery/root -type f -name "*health@*" -print0 | xargs -0 rm -f)
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 00000000..316b4eb5
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/OWNERS b/OWNERS
index 791abb4a..4d9cf6e4 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,3 +1,2 @@
-include platform/system/sepolicy:/OWNERS
-
-rurumihong@google.com
+per-file powerhint.json = wvw@google.com,joaodias@google.com,jenhaochen@google.com,rkganesh@google.com,jychen@google.com
+per-file powerhint.json = wvw@google.com,joaodias@google.com,jenhaochen@google.com,rkganesh@google.com,jychen@google.com
diff --git a/aosp_common.mk b/aosp_common.mk
new file mode 100644
index 00000000..5ba98821
--- /dev/null
+++ b/aosp_common.mk
@@ -0,0 +1,55 @@
+#
+# Copyright 2020 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.
+#
+
+#
+# All components inherited here go to system image
+#
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk)
+else
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
+endif
+
+$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_system.mk)
+
+# Enable CSI checking
+PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
+
+#
+# All components inherited here go to system_ext image
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_system_ext.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_system_ext.mk)
+
+#
+# All components inherited here go to product image
+#
+$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_product.mk)
+
+#
+# All components inherited here go to vendor image
+#
+# TODO(b/136525499): move *_vendor.mk into the vendor makefile later
+$(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_vendor.mk)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_vendor.mk)
+
+#$(call inherit-product, device/google/gs101/device.mk)
+#$(call inherit-product-if-exists, vendor/google_devices/gs101/proprietary/device-vendor.mk)
+
+# TODO: fix
+# PRODUCT_RESTRICT_VENDOR_FILES := all
diff --git a/bluetooth/bluetooth.mk b/bluetooth/bluetooth.mk
new file mode 100644
index 00000000..f2036106
--- /dev/null
+++ b/bluetooth/bluetooth.mk
@@ -0,0 +1,4 @@
+PRODUCT_PACKAGES += \
+ android.hardware.bluetooth@1.1-service.bcmbtlinux
+
+BOARD_SEPOLICY_DIRS += device/google/gs101-sepolicy/bluetooth
diff --git a/compatibility_matrix.xml b/compatibility_matrix.xml
new file mode 100644
index 00000000..264e8547
--- /dev/null
+++ b/compatibility_matrix.xml
@@ -0,0 +1,84 @@
+<!--
+ Autogenerated skeleton compatibility matrix.
+ Use with caution. Modify it to suit your needs.
+ All HALs are set to optional.
+ Many entries other than HALs are zero-filled and
+ require human attention.
+-->
+<compatibility-matrix version="1.0" type="device">
+ <hal format="hidl" optional="true">
+ <name>android.frameworks.displayservice</name>
+ <version>1.0</version>
+ <interface>
+ <name>IDisplayService</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.frameworks.schedulerservice</name>
+ <version>1.0</version>
+ <interface>
+ <name>ISchedulingPolicyService</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.frameworks.sensorservice</name>
+ <version>1.0</version>
+ <interface>
+ <name>ISensorManager</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.hardware.graphics.composer</name>
+ <version>2.1</version>
+ <interface>
+ <name>IComposer</name>
+ <instance>vr</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.hidl.allocator</name>
+ <version>1.0</version>
+ <interface>
+ <name>IAllocator</name>
+ <instance>ashmem</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.hidl.manager</name>
+ <version>1.0</version>
+ <interface>
+ <name>IServiceManager</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.hidl.memory</name>
+ <version>1.0</version>
+ <interface>
+ <name>IMapper</name>
+ <instance>ashmem</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.hidl.token</name>
+ <version>1.0</version>
+ <interface>
+ <name>ITokenManager</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.system.wifi.keystore</name>
+ <version>1.0</version>
+ <interface>
+ <name>IKeystore</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <vndk>
+ <version>0.0.0</version>
+ </vndk>
+</compatibility-matrix>
diff --git a/component-overrides.xml b/component-overrides.xml
new file mode 100644
index 00000000..9aa38e78
--- /dev/null
+++ b/component-overrides.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2020 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.
+-->
+<config>
+ <component-override package="com.android.bluetooth" >
+ <component class=".sap.SapService" enabled="true" />
+ </component-override>
+ <component-override package="com.google.android.apps.tips" >
+ <component class=".TipsMain" enabled="true" />
+ </component-override>
+</config>
diff --git a/conf/Android.bp b/conf/Android.bp
new file mode 100644
index 00000000..45e6b6fa
--- /dev/null
+++ b/conf/Android.bp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+// By default this device uses hardware-wrapped keys for storage encryption,
+// which is intended to offer increased security over the traditional method
+// (software keys). However, hardware-wrapped keys aren't compatible with
+// FIPS-140 certification of the encryption hardware, and hence we have to
+// disable the use of them in FIPS mode. This requires having two fstab files:
+// one for the default mode, and one for FIPS mode selectable via
+// androidboot.fstab_suffix on the kernel command line. These fstabs should be
+// identical with the exception of the encryption settings, so to keep them in
+// sync the rules below generate them from a template file.
+
+soong_namespace {
+ imports: [
+ "device/google/gs101",
+ ],
+}
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["device_google_gs101_license"],
+}
+
+filegroup {
+ name: "gs101_srcs",
+ srcs: ["fstab.gs101.in"],
+}
+
+genrule {
+ name: "gen_fstab.gs101",
+ srcs: ["fstab.gs101.in"],
+ out: ["fstab.gs101"],
+ cmd: "sed -e s/@fileencryption@/::inlinecrypt_optimized+wrappedkey_v0/" +
+ " -e s/@metadata_encryption@/:wrappedkey_v0/ $(in) > $(out)",
+}
+
+genrule {
+ name: "gen_fstab.gs101-fips",
+ srcs: ["fstab.gs101.in"],
+ out: ["fstab.gs101-fips"],
+ cmd: "sed -e s/@fileencryption@/aes-256-xts/" +
+ " -e s/@metadata_encryption@/aes-256-xts/ $(in) > $(out)",
+}
+
+prebuilt_etc {
+ name: "fstab.gs101",
+ src: ":gen_fstab.gs101",
+ vendor: true,
+ vendor_ramdisk_available: true,
+}
+
+prebuilt_etc {
+ name: "fstab.gs101-fips",
+ src: ":gen_fstab.gs101-fips",
+ vendor: true,
+ vendor_ramdisk_available: true,
+}
diff --git a/conf/egl.cfg b/conf/egl.cfg
new file mode 100644
index 00000000..4515dfd6
--- /dev/null
+++ b/conf/egl.cfg
@@ -0,0 +1 @@
+0 1 mali
diff --git a/conf/fstab.gs101.in b/conf/fstab.gs101.in
new file mode 100644
index 00000000..ef84e9b6
--- /dev/null
+++ b/conf/fstab.gs101.in
@@ -0,0 +1,22 @@
+# Android fstab file.
+#
+# The filesystem that contains the filesystem checker binary (typically /system) cannot
+# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
+#
+#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
+system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
+system_ext /system_ext ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
+product /product ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount,readahead_size_kb=128
+vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_vendor,logical,first_stage_mount,readahead_size_kb=128
+vendor_dlkm /vendor_dlkm ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount
+/dev/block/platform/14700000.ufs/by-name/boot /boot emmc defaults slotselect,avb=boot,first_stage_mount
+/dev/block/platform/14700000.ufs/by-name/efs /mnt/vendor/efs ext4 defaults,noatime,rw wait,check,formattable
+/dev/block/platform/14700000.ufs/by-name/efs_backup /mnt/vendor/efs_backup ext4 defaults,noatime,rw wait,check,formattable
+/dev/block/platform/14700000.ufs/by-name/modem_userdata /mnt/vendor/modem_userdata ext4 defaults,noatime,rw wait,check,formattable
+/dev/block/platform/14700000.ufs/by-name/modem /mnt/vendor/modem_img ext4 ro,defaults,context=u:object_r:modem_img_file:s0,barrier=1 wait,slotselect
+/dev/block/platform/14700000.ufs/by-name/misc /misc emmc defaults wait
+/dev/block/platform/14700000.ufs/by-name/metadata /metadata ext4 noatime,nosuid,nodev,data=journal,commit=1 wait,check,formattable,first_stage_mount,metadata_csum
+/dev/block/platform/14700000.ufs/by-name/pvmfw /pvmfw emmc defaults wait,slotselect,avb=pvmfw,first_stage_mount
+/dev/block/platform/14700000.ufs/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier,inlinecrypt,atgc,checkpoint_merge latemount,wait,check,quota,formattable,sysfs_path=/dev/sys/block/bootdevice,checkpoint=fs,reservedsize=128M,fileencryption=@fileencryption@,metadata_encryption=@metadata_encryption@,keydirectory=/metadata/vold/metadata_encryption,fscompress,readahead_size_kb=128
+/dev/block/platform/14700000.ufs/by-name/vbmeta /vbmeta emmc defaults slotselect,first_stage_mount
+/devices/platform/11110000.usb* auto vfat defaults voldmanaged=usb:auto
diff --git a/conf/fstab.persist b/conf/fstab.persist
new file mode 100644
index 00000000..779a05d5
--- /dev/null
+++ b/conf/fstab.persist
@@ -0,0 +1,4 @@
+# Android fstab file.
+# <src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
+# Keep persist in an fstab file, since we need to run fsck on it after abnormal shutdown.
+/dev/block/platform/14700000.ufs/by-name/persist /mnt/vendor/persist ext4 noatime,nosuid,nodev,data=journal,commit=1 wait,check,formattable,metadata_csum
diff --git a/conf/fstab.postinstall b/conf/fstab.postinstall
new file mode 100644
index 00000000..955fba71
--- /dev/null
+++ b/conf/fstab.postinstall
@@ -0,0 +1,4 @@
+# Android fstab file.
+#
+#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
+system /postinstall ext4 ro,nosuid,nodev,noexec slotselect_other,logical,avb_keys=/product/etc/security/avb/system_other.avbpubkey
diff --git a/conf/init.aoc.daemon.rc b/conf/init.aoc.daemon.rc
new file mode 100644
index 00000000..1cf204e1
--- /dev/null
+++ b/conf/init.aoc.daemon.rc
@@ -0,0 +1 @@
+# AoC firmware will be loaded by Daemon \ No newline at end of file
diff --git a/conf/init.aoc.nodaemon.rc b/conf/init.aoc.nodaemon.rc
new file mode 100644
index 00000000..329d7d34
--- /dev/null
+++ b/conf/init.aoc.nodaemon.rc
@@ -0,0 +1,3 @@
+# Load AoC firmware and boot
+on property:vendor.all.modules.ready=1
+ write /sys/devices/platform/19000000.aoc/firmware aoc.bin \ No newline at end of file
diff --git a/conf/init.debug.rc b/conf/init.debug.rc
new file mode 100644
index 00000000..e8039e08
--- /dev/null
+++ b/conf/init.debug.rc
@@ -0,0 +1,30 @@
+# SJTAG
+on init
+ chown system system /sys/devices/platform/sjtag_ap/interface/access_lvl
+ chown system system /sys/devices/platform/sjtag_ap/interface/auth
+ chown system system /sys/devices/platform/sjtag_ap/interface/begin
+ chown system system /sys/devices/platform/sjtag_ap/interface/dbg_domain
+ chown system system /sys/devices/platform/sjtag_ap/interface/dbg_itvl
+ chown system system /sys/devices/platform/sjtag_ap/interface/end
+ chown system system /sys/devices/platform/sjtag_ap/interface/pubkey
+ chown system system /sys/devices/platform/sjtag_gsa/interface/access_lvl
+ chown system system /sys/devices/platform/sjtag_gsa/interface/auth
+ chown system system /sys/devices/platform/sjtag_gsa/interface/begin
+ chown system system /sys/devices/platform/sjtag_gsa/interface/dbg_domain
+ chown system system /sys/devices/platform/sjtag_gsa/interface/dbg_itvl
+ chown system system /sys/devices/platform/sjtag_gsa/interface/end
+ chown system system /sys/devices/platform/sjtag_gsa/interface/pubkey
+
+# Bluetooth
+on post-fs-data
+ chown bluetooth system /dev/logbuffer_btlpm
+ chown bluetooth system /dev/logbuffer_tty16
+
+on property:vendor.debug.ramdump.force_crash=true
+ write /sys/kernel/pixel_debug/trigger "null"
+
+on property:power.battery_input.suspended=true
+ write /sys/kernel/debug/google_charger/input_suspend 1
+
+on property:power.battery_input.suspended=false
+ write /sys/kernel/debug/google_charger/input_suspend 0
diff --git a/conf/init.exynos.nanohub.rc b/conf/init.exynos.nanohub.rc
new file mode 100644
index 00000000..9a582298
--- /dev/null
+++ b/conf/init.exynos.nanohub.rc
@@ -0,0 +1,20 @@
+on post-fs
+## ensure correct calibration file permissions
+ chown root system /mnt/vendor/persist/sensorcal.json
+ chmod 0640 /mnt/vendor/persist/sensorcal.json
+ start vendor.flash-nanohub-fw
+
+on post-fs-data
+ mkdir /data/vendor/sensor
+ chown root system /data/vendor/sensor
+ chmod 0770 /data/vendor/sensor
+
+service vendor.flash-nanohub-fw /vendor/bin/nanoapp_cmd download
+ oneshot
+ disabled
+ user root
+ group system
+
+on post-fs-data
+ mkdir /data/system/nanohub_lock/
+ restorecon /data/system/nanohub_lock
diff --git a/conf/init.factory.rc b/conf/init.factory.rc
new file mode 100644
index 00000000..1eba34c2
--- /dev/null
+++ b/conf/init.factory.rc
@@ -0,0 +1,25 @@
+# Factory specific init.rc
+
+on early-init
+ mount debugfs /sys/kernel/debug /sys/kernel/debug
+
+on init
+ export PATH /product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin:/vendor/bin/factory
+
+ # Set UDFPS default calibration to LHBM
+ setprop persist.vendor.sensors.fingerprint.ghbm 0
+
+on post-fs-data
+ # HBM mode for UDFPS factory apk
+ chmod 666 /d/dri/0/DSI-1/panel/reg/payload
+ chmod 666 /d/dri/0/DSI-1/panel/hbm_mode
+ chmod 666 /sys/class/backlight/panel0-backlight/local_hbm_max_timeout
+ chmod 666 /sys/class/backlight/panel0-backlight/local_hbm_mode
+ chmod 666 /sys/class/backlight/panel0-backlight/hbm_mode
+
+on boot
+ # FTM log folder
+ mkdir /data/ftmlog 0775 system system
+
+ # Audio test folder
+ mkdir /data/AudioTest 0775 system system
diff --git a/conf/init.gs101.rc b/conf/init.gs101.rc
new file mode 100644
index 00000000..267a1815
--- /dev/null
+++ b/conf/init.gs101.rc
@@ -0,0 +1,1020 @@
+import /vendor/etc/init/hw/init.gs101.usb.rc
+import android.hardware.drm@1.2-service.widevine.rc
+import init.exynos.sensorhub.rc
+import /vendor/etc/init/hw/init.aoc.rc
+
+on early-init
+ mount_all /vendor/etc/fstab.persist --early
+
+on init
+ # CPU0 cannot be offline
+ chmod 0444 /sys/devices/system/cpu/cpu0/online
+
+ # Set teo as cpu idle governor
+ write /sys/devices/system/cpu/cpuidle/current_governor teo
+
+ # Boot time fs tuning
+ write /sys/block/sda/queue/iostats 0
+ write /sys/block/sda/queue/scheduler bfq
+ write /sys/block/sda/queue/iosched/slice_idle 0
+ write /sys/block/sda/queue/nr_requests 256
+ write /dev/sys/fs/by-name/userdata/data_io_flag 56
+ write /dev/sys/fs/by-name/userdata/node_io_flag 56
+
+ chown system system /proc/vendor_sched/set_task_group_bg
+ chown system system /proc/vendor_sched/set_task_group_cam
+ chown system system /proc/vendor_sched/set_task_group_fg
+ chown system system /proc/vendor_sched/set_task_group_nnapi
+ chown system system /proc/vendor_sched/set_task_group_sys
+ chown system system /proc/vendor_sched/set_task_group_sysbg
+ chown system system /proc/vendor_sched/set_task_group_ta
+ chown system system /proc/vendor_sched/set_task_group_rt
+ chown system system /proc/vendor_sched/set_task_group_sf
+ chown system system /proc/vendor_sched/set_task_group_dex2oat
+ chown system system /proc/vendor_sched/set_task_group_cam_power
+ chown system system /proc/vendor_sched/set_task_group_ota
+ chown system system /proc/vendor_sched/set_proc_group_bg
+ chown system system /proc/vendor_sched/set_proc_group_cam
+ chown system system /proc/vendor_sched/set_proc_group_fg
+ chown system system /proc/vendor_sched/set_proc_group_nnapi
+ chown system system /proc/vendor_sched/set_proc_group_sys
+ chown system system /proc/vendor_sched/set_proc_group_sysbg
+ chown system system /proc/vendor_sched/set_proc_group_ta
+ chown system system /proc/vendor_sched/set_proc_group_rt
+ chown system system /proc/vendor_sched/set_proc_group_sf
+ chown system system /proc/vendor_sched/set_proc_group_dex2oat
+ chown system system /proc/vendor_sched/set_proc_group_cam_power
+ chown system system /proc/vendor_sched/set_proc_group_ota
+ chown system system /proc/vendor_sched/prefer_idle_set
+ chown system system /proc/vendor_sched/prefer_idle_clear
+ chown system system /proc/vendor_sched/pmu_poll_enable
+ chown system system /proc/vendor_sched/pmu_poll_time
+ chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/lcpi_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/spc_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/limit_frequency
+ chown system system /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/pmu_limit_enable
+ chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/lcpi_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/spc_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/limit_frequency
+ chown system system /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/pmu_limit_enable
+ chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/lcpi_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/spc_threshold
+ chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/limit_frequency
+ chown system system /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/pmu_limit_enable
+
+ chmod 0220 /proc/vendor_sched/set_task_group_bg
+ chmod 0220 /proc/vendor_sched/set_task_group_cam
+ chmod 0220 /proc/vendor_sched/set_task_group_fg
+ chmod 0220 /proc/vendor_sched/set_task_group_nnapi
+ chmod 0220 /proc/vendor_sched/set_task_group_sys
+ chmod 0220 /proc/vendor_sched/set_task_group_sysbg
+ chmod 0220 /proc/vendor_sched/set_task_group_ta
+ chmod 0220 /proc/vendor_sched/set_task_group_rt
+ chmod 0220 /proc/vendor_sched/set_task_group_sf
+ chmod 0220 /proc/vendor_sched/set_task_group_dex2oat
+ chmod 0220 /proc/vendor_sched/set_task_group_cam_power
+ chmod 0220 /proc/vendor_sched/set_task_group_ota
+ chmod 0220 /proc/vendor_sched/set_proc_group_bg
+ chmod 0220 /proc/vendor_sched/set_proc_group_cam
+ chmod 0220 /proc/vendor_sched/set_proc_group_fg
+ chmod 0220 /proc/vendor_sched/set_proc_group_nnapi
+ chmod 0220 /proc/vendor_sched/set_proc_group_sys
+ chmod 0220 /proc/vendor_sched/set_proc_group_sysbg
+ chmod 0220 /proc/vendor_sched/set_proc_group_ta
+ chmod 0220 /proc/vendor_sched/set_proc_group_rt
+ chmod 0220 /proc/vendor_sched/set_proc_group_sf
+ chmod 0220 /proc/vendor_sched/set_proc_group_dex2oat
+ chmod 0220 /proc/vendor_sched/set_proc_group_cam_power
+ chmod 0220 /proc/vendor_sched/set_proc_group_ota
+ chmod 0220 /proc/vendor_sched/prefer_idle_set
+ chmod 0220 /proc/vendor_sched/prefer_idle_clear
+ chmod 0220 /proc/vendor_sched/pmu_poll_enable
+ chmod 0220 /proc/vendor_sched/pmu_poll_time
+
+ wait /dev/block/platform/${ro.boot.boot_devices}
+ symlink /dev/block/platform/${ro.boot.boot_devices} /dev/block/bootdevice
+
+ # to access UFS/eMMC sysfs directly
+ symlink /sys/devices/platform/${ro.boot.boot_devices} /dev/sys/block/bootdevice
+
+ # Disable UFS powersaving
+ write /dev/sys/block/bootdevice/clkgate_enable 0
+
+ start vendor.keymaster-3-0
+
+ # ZRAM setup
+ write /sys/block/zram0/comp_algorithm lz77eh
+ write /proc/sys/vm/page-cluster 0
+
+ # Some user code relies on ro.boot.hardware.revision
+ setprop ro.boot.hardware.revision ${ro.revision}
+
+ # Allow PAI targeting per hardware SKU
+ setprop ro.oem.key1 ${ro.boot.hardware.sku}
+
+ # Property used by vintf for sku specific manifests
+ # Property used by NFC for sku specific configurations
+ setprop ro.boot.product.hardware.sku ${ro.boot.hardware.sku}
+
+ # Support legacy paths
+ symlink /data/app /factory
+
+ # Apply network parameters for high data performance.
+ write /proc/sys/net/core/rmem_default 327680
+ write /proc/sys/net/core/rmem_max 8388608
+ write /proc/sys/net/core/wmem_default 327680
+ write /proc/sys/net/core/wmem_max 8388608
+ write /proc/sys/net/core/optmem_max 20480
+ write /proc/sys/net/core/netdev_max_backlog 10000
+ write /proc/sys/net/ipv4/tcp_rmem "2097152 4194304 8388608"
+ write /proc/sys/net/ipv4/tcp_wmem "262144 524288 8388608"
+ write /proc/sys/net/ipv4/tcp_mem "44259 59012 88518"
+ write /proc/sys/net/ipv4/udp_mem "88518 118025 177036"
+
+ write /sys/class/net/rmnet0/queues/rx-0/rps_cpus fe
+ write /sys/class/net/rmnet1/queues/rx-0/rps_cpus fe
+ write /sys/class/net/rmnet2/queues/rx-0/rps_cpus fe
+ write /sys/class/net/rmnet3/queues/rx-0/rps_cpus fe
+ write /sys/class/net/rmnet4/queues/rx-0/rps_cpus fe
+ write /sys/class/net/rmnet5/queues/rx-0/rps_cpus fe
+ write /sys/class/net/rmnet6/queues/rx-0/rps_cpus fe
+ write /sys/class/net/rmnet7/queues/rx-0/rps_cpus fe
+
+ # Create UDS structure for base VR services.
+ mkdir /dev/socket/pdx 0775 system system
+ mkdir /dev/socket/pdx/system 0775 system system
+ mkdir /dev/socket/pdx/system/buffer_hub 0775 system system
+ mkdir /dev/socket/pdx/system/performance 0775 system system
+ mkdir /dev/socket/pdx/system/vr 0775 system system
+ mkdir /dev/socket/pdx/system/vr/display 0775 system system
+ mkdir /dev/socket/pdx/system/vr/pose 0775 system system
+ mkdir /dev/socket/pdx/system/vr/sensors 0775 system system
+
+ # Boot time 183626384
+ write /proc/vendor_sched/ta_uclamp_min 1024
+ write /proc/vendor_sched/ta_prefer_idle 1
+ write /proc/vendor_sched/fg_uclamp_min 1024
+ write /proc/vendor_sched/fg_prefer_idle 1
+ write /proc/vendor_sched/sys_uclamp_min 1024
+ write /proc/vendor_sched/sys_prefer_idle 1
+
+ # governor setting
+ write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor sched_pixel
+ write /sys/devices/system/cpu/cpu0/cpufreq/sched_pixel/up_rate_limit_us 500
+ write /sys/devices/system/cpu/cpu0/cpufreq/sched_pixel/down_rate_limit_us 5000
+ write /sys/devices/system/cpu/cpu0/cpufreq/sched_pixel/down_rate_limit_scale_pow 2
+ write /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor sched_pixel
+ write /sys/devices/system/cpu/cpu4/cpufreq/sched_pixel/up_rate_limit_us 500
+ write /sys/devices/system/cpu/cpu4/cpufreq/sched_pixel/down_rate_limit_us 20000
+ write /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor sched_pixel
+ write /sys/devices/system/cpu/cpu6/cpufreq/sched_pixel/up_rate_limit_us 500
+ write /sys/devices/system/cpu/cpu6/cpufreq/sched_pixel/down_rate_limit_us 20000
+
+ # RT uclamp setting
+ write /proc/sys/kernel/sched_util_clamp_min_rt_default 0
+
+ # change permissions and default values for camera-daemon cpu controller
+ chown system system /dev/cpuctl/camera-daemon/cpu.uclamp.min
+ chown system system /dev/cpuctl/camera-daemon/cpu.uclamp.max
+ chown root root /dev/cpuctl/camera-daemon/cpu.uclamp.latency_sensitive
+ chown system system /dev/cpuctl/camera-daemon/cgroup.procs
+
+ mkdir /dev/cpuset/camera-daemon-high-group
+ write /dev/cpuset/camera-daemon-high-group/cpus 0-7
+ write /dev/cpuset/camera-daemon-high-group/mems 0
+ chown system system /dev/cpuset/camera-daemon-high-group/tasks
+ chmod 0664 /dev/cpuset/camera-daemon-high-group/tasks
+
+ mkdir /dev/cpuset/camera-daemon-mid-group
+ write /dev/cpuset/camera-daemon-mid-group/cpus 0-7
+ write /dev/cpuset/camera-daemon-mid-group/mems 0
+ chown system system /dev/cpuset/camera-daemon-mid-group/tasks
+ chmod 0664 /dev/cpuset/camera-daemon-mid-group/tasks
+
+ mkdir /dev/cpuset/camera-daemon-mid-high-group
+ write /dev/cpuset/camera-daemon-mid-high-group/cpus 0-7
+ write /dev/cpuset/camera-daemon-mid-high-group/mems 0
+ chown system system /dev/cpuset/camera-daemon-mid-high-group/tasks
+ chmod 0664 /dev/cpuset/camera-daemon-mid-high-group/tasks
+
+ write /proc/vendor_sched/cam_prefer_idle 1
+ write /proc/vendor_sched/cam_uclamp_min 1
+
+ chown system system /dev/cpuset/cgroup.procs
+
+ # nanohub sensor
+ chmod 0664 /dev/nanohub
+ chmod 0664 /dev/nanohub_comms
+ chown system system /dev/nanohub
+ chown system system /dev/nanohub_comms
+
+ # logbuffer
+ chown system system /dev/logbuffer_maxfg
+ chown system system /dev/logbuffer_maxfg_base
+ chown system system /dev/logbuffer_maxfg_flip
+ chown system system /dev/logbuffer_maxfg_monitor
+ chown system system /dev/logbuffer_maxfg_base_monitor
+ chown system system /dev/logbuffer_maxfg_flip_monitor
+ chown system system /dev/logbuffer_maxq
+ chown system system /dev/logbuffer_google,cpm
+ chown system system /dev/logbuffer_rtx
+ chown system system /dev/logbuffer_ssoc
+ chown system system /dev/logbuffer_ttf
+ chown system system /dev/logbuffer_tcpm
+ chown system system /dev/logbuffer_usbpd
+ chown system system /dev/logbuffer_pogo_transport
+ chown system system /dev/logbuffer_wireless
+ chown system system /dev/logbuffer_pca9468
+ chown system system /dev/logbuffer_cpm
+ chown system system /dev/logbuffer_bd
+
+ # Dump maxfg
+ chown system system /sys/class/power_supply/maxfg/m5_model_state
+ chown system system /sys/class/power_supply/maxfg_base/m5_model_state
+
+ # Dump eeprom
+ chown system system /sys/devices/platform/10970000.hsi2c/i2c-8/8-0050/eeprom
+ chown system system /sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom
+ chown system system /sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom
+ chown system system /sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom
+ chown system system /sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom
+ chown system system /dev/battery_history
+
+ # Modem temperature driver
+ chown radio system /sys/devices/platform/cp-tm1/cp_temp
+
+ # Loading common kernel modules in background
+ start insmod_sh_common
+
+ # Charge stats (write 0)
+ chown system system /sys/class/power_supply/battery/charge_stats
+
+ # Pca Charge stats (write 0)
+ chown system system /sys/class/power_supply/pca9468-mains/device/chg_stats
+
+ # Wireless Charge stats (write 0)
+ chown system system /sys/class/power_supply/wireless/device/charge_stats
+
+ # Thermal Charge stats (write 0)
+ chown system system /sys/devices/platform/google,charger/thermal_stats
+
+ # Google Charger stats (write 0)
+ chown system system /sys/devices/platform/google,charger/charge_stats
+
+ # Permission for wireless charging fan
+ chown system system /sys/devices/platform/google,charger/thermal_dc_fan_alarm
+ chown system system /sys/devices/platform/google,cpm/thermal_mdis_fan_alarm
+
+ # Permission for wireless charging
+ chown system system /sys/class/power_supply/wireless/capacity
+ chown system system /sys/class/power_supply/wireless/device/rtx
+ chown system system /sys/class/power_supply/wireless/device/rxdata
+ chown system system /sys/class/power_supply/wireless/device/txdata
+ chown system system /sys/class/power_supply/wireless/device/rxlen
+ chown system system /sys/class/power_supply/wireless/device/txlen
+ chown system system /sys/class/power_supply/wireless/device/ccreset
+ chown system system /sys/class/power_supply/wireless/device/status
+ chown system system /sys/class/power_supply/wireless/device/version
+ chown system system /sys/class/power_supply/wireless/device/features
+ chown system system /sys/class/power_supply/wireless/device/authtype
+
+ # Adaptive charge
+ chown system system /sys/class/power_supply/battery/charge_deadline
+
+ # Battery Defender
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/bd_trickle_cnt
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/bd_trickle_dry_run
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/bd_trickle_enable
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/bd_trickle_recharge_soc
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/bd_trickle_reset_sec
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/bd_clear
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/health_safety_margin
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/aacr_state
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/aacr_cycle_max
+ chown system system /sys/devices/platform/google,battery/power_supply/battery/aacr_cycle_grace
+ chown system system /sys/devices/platform/google,charger/bd_drainto_soc
+ chown system system /sys/devices/platform/google,charger/bd_recharge_soc
+ chown system system /sys/devices/platform/google,charger/bd_recharge_voltage
+ chown system system /sys/devices/platform/google,charger/bd_resume_abs_temp
+ chown system system /sys/devices/platform/google,charger/bd_resume_soc
+ chown system system /sys/devices/platform/google,charger/bd_resume_temp
+ chown system system /sys/devices/platform/google,charger/bd_resume_time
+ chown system system /sys/devices/platform/google,charger/bd_temp_dry_run
+ chown system system /sys/devices/platform/google,charger/bd_temp_enable
+ chown system system /sys/devices/platform/google,charger/bd_trigger_temp
+ chown system system /sys/devices/platform/google,charger/bd_trigger_time
+ chown system system /sys/devices/platform/google,charger/bd_trigger_voltage
+ chown system system /sys/devices/platform/google,charger/bd_clear
+ chown system system /sys/devices/platform/google,charger/charge_start_level
+ chown system system /sys/devices/platform/google,charger/charge_stop_level
+ chown system system /sys/devices/platform/google,cpm/dc_ctl
+ # Important to include dd_state as it's used in battery defender in charger mode
+ chown system system /sys/devices/platform/google,charger/dd_state
+ chown system system /sys/devices/platform/google,charger/dd_settings
+
+ # Power Stats HAL
+ chown system system /dev/bbd_pwrstat
+
+ # start watchdogd
+ start watchdogd
+
+ # Add a boost for NNAPI HAL
+ write /proc/vendor_sched/nnapi_prefer_idle 0
+ write /proc/vendor_sched/nnapi_uclamp_min 512
+
+ # Add memlat governor settings
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu0_memlat@17000010/polling_interval 10
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu1_memlat@17000010/polling_interval 10
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu2_memlat@17000010/polling_interval 10
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu3_memlat@17000010/polling_interval 10
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu4_memlat@17000010/polling_interval 10
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu5_memlat@17000010/polling_interval 10
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu6_memlat@17000010/polling_interval 10
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu7_memlat@17000010/polling_interval 10
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu0_memlat@17000010/mem_latency/ratio_ceil 400
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu1_memlat@17000010/mem_latency/ratio_ceil 400
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu2_memlat@17000010/mem_latency/ratio_ceil 400
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu3_memlat@17000010/mem_latency/ratio_ceil 400
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu4_memlat@17000010/mem_latency/ratio_ceil 2700
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu5_memlat@17000010/mem_latency/ratio_ceil 2700
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu6_memlat@17000010/mem_latency/ratio_ceil 3200
+ write /sys/class/devfreq/gs_memlat_devfreq:devfreq_mif_cpu7_memlat@17000010/mem_latency/ratio_ceil 3200
+
+on init && property:ro.boot.hw.soc.rev=0
+ setprop vendor.powerhal.config powerhint_a0.json
+
+on init && property:ro.boot.hw.soc.rev=1
+ setprop vendor.powerhal.config powerhint_a1.json
+
+on init && property:ro.boot.hw.soc.rev=0
+ # STOPSHIP b/177967147 disable SICD
+ write /sys/devices/platform/cpupm/cpupm/sicd 0
+
+on init && property:ro.boot.hw.soc.rev=1
+ # STOPSHIP b/177967147 disable SICD
+ write /sys/devices/platform/cpupm/cpupm/sicd 0
+
+on late-fs
+ # Start bootanimation class before mount
+ start bootanim
+ class_start animation
+
+ # Mount RW partitions which need run fsck
+ mount_all --late
+
+on post-fs-data
+ # Log data folder
+ mkdir /data/vendor 0771 radio system
+ mkdir /data/vendor/log 0771 radio system
+ mkdir /data/vendor/log/cbd 0771 radio system
+ mkdir /data/vendor/log/rfsd 0771 radio system
+
+ mkdir /data/exynos/log 0771 radio system
+ mkdir /data/vendor/rild 0771 radio system
+ mkdir /data/vendor/dump 0771 radio system
+ mkdir /data/vendor/slog 0771 system system
+
+ # PixelLogger log paths.
+ mkdir /data/vendor/radio 773 system radio
+ mkdir /data/vendor/radio/logs 773 system radio
+ mkdir /data/vendor/radio/logs/always-on 777 system radio
+
+ # Modem extended log folder
+ mkdir /data/vendor/radio/extended_logs 0770 radio system
+
+ # Modem MDS log folder
+ mkdir /data/vendor/radio/mds 0771 radio system
+
+ # Unzipped modem images folder
+ mkdir /data/vendor/radio/image 0771 radio system
+
+ # Modem stat folder
+ mkdir /data/vendor/modem_stat 0771 radio system
+ write /data/vendor/modem_stat/debug.txt ""
+ chown radio system /data/vendor/modem_stat/debug.txt
+ chmod 0664 /data/vendor/modem_stat/debug.txt
+
+ # Modem replay folder
+ mkdir /mnt/vendor/modem_userdata/replay 0775 radio system
+
+ # Write display MIPI frequency from Modem
+ chown system system /sys/devices/platform/1c2c0000.drmdsim/hs_clock
+ chown system system /sys/devices/platform/1c2d0000.drmdsim/hs_clock
+ chmod 0664 /sys/devices/platform/1c2c0000.drmdsim/hs_clock
+ chmod 0664 /sys/devices/platform/1c2d0000.drmdsim/hs_clock
+
+ setprop vold.post_fs_data_done 1
+ setprop wifi.direct.interface p2p-dev-wlan0
+ setprop wifi.aware.interface aware_nmi0
+
+# IPSEC PIDDIR for VoWiFi
+ mkdir /data/vendor/misc 0771 root system
+ mkdir /data/vendor/misc/vpn 0771 root system
+
+# Permissions Camera
+ mkdir /data/vendor/camera 0770 system camera
+ mkdir /data/vendor/camera/catpipe 0770 system camera
+ chmod 0755 /sys/kernel/debug/tracing
+ restorecon /sys/kernel/debug/tracing/trace_marker
+
+ # ranging sensor
+ chown system system /dev/stmvl53l1_ranging
+ chmod 0660 /dev/stmvl53l1_ranging
+
+ # Factory calibration files
+ chmod 0771 /mnt/vendor/persist/camera
+ chmod 0771 /mnt/vendor/persist/camera/OTP_calibration
+ chmod 0771 /mnt/vendor/persist/camera/pdaf_calibration_data
+ chmod 0771 /mnt/vendor/persist/camera/rear
+
+# Audio dump and debug
+ mkdir /data/vendor/audio 0770 audio audio
+
+# Create the directories for Darwinn HAL.
+ mkdir /data/vendor/hal_neuralnetworks_darwinn 0770 system system
+ mkdir /data/vendor/hal_neuralnetworks_darwinn/checksum_cache 0770 system system
+ mkdir /data/vendor/edgetpu 0770 system system
+ mkdir /data/vendor/edgetpu/cache 0770 system system
+
+# Compatibility path for TPU
+ symlink /dev/abrolhos /dev/edgetpu
+
+on zygote-start
+ # For PixelLogger configuration file.
+ chmod 0771 /data/vendor/wifi
+ write /proc/vendor_sched/sys_uclamp_min 0
+
+on post-fs-data
+ # Create the directories used by the Wireless subsystem
+ mkdir /data/vendor/wifi 0771 wifi wifi
+ mkdir /data/vendor/wifi/wpa 0770 wifi wifi
+ mkdir /data/vendor/wifi/wpa/sockets 0770 wifi wifi
+
+# Gatekeeper data
+ mkdir /data/vendor/gk 0771 system system
+
+# HWC data
+ mkdir /data/vendor/log/hwc 0771 system graphics
+
+# Video data
+ mkdir /data/vendor/media 0700 mediacodec mediacodec
+
+on post-fs-data
+ # GPS
+ mkdir /data/vendor/gps 0771 system system
+ chown system system /data/vendor/gps
+ rm /data/vendor/gps/gps_started
+ rm /data/vendor/gps/glonass_started
+ rm /data/vendor/gps/beidou_started
+ rm /data/vendor/gps/smd_started
+ rm /data/vendor/gps/sv_cno.info
+
+ chown gps system /sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby
+ chmod 0664 /dev/ttyBCM
+ chown gps system /dev/ttyBCM
+ chmod 0664 /dev/bbd_control
+ chown gps system /dev/bbd_control
+ chmod 0664 /dev/bbd_patch
+ chown gps system /dev/bbd_patch
+ chmod 0664 /dev/bbd_sensor
+ chown gps system /dev/bbd_sensor
+
+on early-boot
+ # Wait for insmod_sh to finish all common modules
+ wait_for_prop vendor.common.modules.ready 1
+
+ # Permission for Health Storage HAL
+ chown system system /dev/sys/block/bootdevice/manual_gc
+
+ # Permission for Pixelstats
+ chown system system /dev/sys/block/bootdevice/slowio_read_cnt
+ chown system system /dev/sys/block/bootdevice/slowio_write_cnt
+ chown system system /dev/sys/block/bootdevice/slowio_unmap_cnt
+ chown system system /dev/sys/block/bootdevice/slowio_sync_cnt
+
+on boot
+
+ # Allow to access debugfs for system:system
+ chmod 0755 /sys/kernel/debug
+ chown system system /sys/kernel/debug
+
+ #setprop ro.radio.noril no
+
+ # default country code
+ setprop ro.boot.wificountrycode 00
+
+ # Set up kernel tracing, but disable it by default
+ chmod 0222 /sys/kernel/debug/tracing/trace_marker
+ write /sys/kernel/debug/tracing/tracing_on 0
+
+ # Change permission for A-Box firmware logs file & GPR dump
+ chown audioserver system /sys/devices/platform/17c50000.abox/reset
+ chown audioserver system /sys/devices/platform/17c50000.abox/service
+ chown audioserver system /sys/devices/platform/17c50000.abox/0.abox_debug/gpr
+ chown audioserver system /sys/devices/platform/17c50000.abox/0.abox_debug/calliope_sram
+ chown audioserver system /sys/devices/platform/17c50000.abox/0.abox_debug/calliope_dram
+ chown audioserver system /sys/devices/platform/17c50000.abox/0.abox_debug/calliope_iva
+ chown audioserver system /sys/kernel/debug/abox/log-00
+
+# Permission for USB SELECT
+ chown system system /sys/class/android_usb/android0/enable
+ chmod 0660 /sys/class/android_usb/android0/enable
+ chown system system /sys/class/android_usb/android0/idVendor
+ chmod 0660 /sys/class/android_usb/android0/idVendor
+ chown system system /sys/class/android_usb/android0/idProduct
+ chmod 0660 /sys/class/android_usb/android0/idProduct
+ chown system system /sys/class/android_usb/android0/f_diag/clients
+ chmod 0660 /sys/class/android_usb/android0/f_diag/clients
+ chown system system /sys/class/android_usb/android0/functions
+ chmod 0660 /sys/class/android_usb/android0/functions
+ chown system system /sys/class/android_usb/android0/bDeviceClass
+ chmod 0660 /sys/class/android_usb/android0/bDeviceClass
+
+# Permission for UART SWITCH
+ chmod 0660 /sys/class/sec/switch/uart_sel
+ chown system system /sys/class/sec/switch/uart_sel
+
+# VTS sysfs file permission
+ chown audioserver system /sys/devices/platform/13810000.vts/vts_svoice_model
+ chown audioserver system /sys/devices/platform/13810000.vts/vts_google_model
+ chmod 0660 /sys/devices/platform/13810000.vts/vts_svoice_model
+ chmod 0660 /sys/devices/platform/13810000.vts/vts_google_model
+
+# WLAN firmware/driver path
+ chown wifi wifi /sys/module/bcmdhd/parameters/nvram_path
+ chown wifi wifi /sys/module/bcmdhd/parameters/firmware_path
+
+on property:persist.vendor.radio.no_modem_board=1
+ setprop ro.radio.noril yes
+
+on fs
+ mount_all --early
+ restorecon_recursive /mnt/vendor/efs
+ chown radio system /mnt/vendor/efs
+ restorecon_recursive /mnt/vendor/efs_backup
+ chown radio system /mnt/vendor/efs_backup
+ restorecon_recursive /mnt/vendor/modem_userdata
+ chown radio system /mnt/vendor/modem_userdata
+
+ # for cycle count backup
+ mkdir /mnt/vendor/persist/battery 0700 system system
+
+ restorecon_recursive /mnt/vendor/persist
+ restorecon_recursive /mnt/vendor/persist/aoc
+ restorecon_recursive /mnt/vendor/persist/audio
+ restorecon_recursive /mnt/vendor/persist/sensors
+ restorecon_recursive /mnt/vendor/persist/battery
+ restorecon_recursive /mnt/vendor/persist/modem
+ # Set up display-related directories and permissions
+ # Add restorecon_recursive command to make sure the restorecon label is persist_display_file.
+ restorecon_recursive /mnt/vendor/persist/display
+ mkdir /mnt/vendor/persist/data/sfs 0700 system system
+ mkdir /mnt/vendor/persist/data/tz 0700 system system
+ mkdir /mnt/vendor/persist/touch 0770 system system
+ mkdir /mnt/vendor/persist/audio 0770 system system
+ chown media audio /mnt/vendor/persist/audio
+
+# Permissions for ION
+ chmod 0660 /sys/class/ion_cma/ion_video_ext/isolated
+ chown system system /sys/class/ion_cma/ion_video_ext/isolated
+
+# Permissions for hwcomposer
+ chown system system /sys/class/backlight/panel0-backlight/als_table
+ chown system system /sys/class/backlight/panel0-backlight/brightness
+ chown system system /sys/class/backlight/panel0-backlight/dimming_on
+ chown system system /sys/class/backlight/panel0-backlight/hbm_mode
+ chown system system /sys/class/backlight/panel0-backlight/local_hbm_mode
+ chown system system /sys/devices/platform/exynos-drm/primary-panel/gamma
+ chown system system /sys/devices/platform/exynos-drm/primary-panel/min_vrefresh
+ chown system system /sys/devices/platform/exynos-drm/primary-panel/idle_delay_ms
+ chown system system /sys/devices/platform/exynos-drm/primary-panel/panel_need_handle_idle_exit
+ chown system system /sys/module/drm/parameters/vblankoffdelay
+ chown system system /sys/class/dqe0/atc/ambient_light
+ chown system system /sys/class/dqe0/atc/st
+ chown system system /sys/class/dqe0/atc/en
+ chown system system /sys/class/dqe0/atc/lt
+ chown system system /sys/class/dqe0/atc/ns
+ chown system system /sys/class/dqe0/atc/dither
+ chown system system /sys/class/dqe0/atc/pl_w1
+ chown system system /sys/class/dqe0/atc/pl_w2
+ chown system system /sys/class/dqe0/atc/ctmode
+ chown system system /sys/class/dqe0/atc/pp_en
+ chown system system /sys/class/dqe0/atc/upgrade_on
+ chown system system /sys/class/dqe0/atc/tdr_max
+ chown system system /sys/class/dqe0/atc/tdr_min
+ chown system system /sys/class/dqe0/atc/back_light
+ chown system system /sys/class/dqe0/atc/dstep
+ chown system system /sys/class/dqe0/atc/scale_mode
+ chown system system /sys/class/dqe0/atc/threshold_1
+ chown system system /sys/class/dqe0/atc/threshold_2
+ chown system system /sys/class/dqe0/atc/threshold_3
+ chown system system /sys/class/dqe0/atc/gain_limit
+ chown system system /sys/class/dqe0/atc/lt_calc_ab_shift
+ chown system system /sys/devices/platform/1c300000.drmdecon/early_wakeup
+ chmod 0660 /sys/devices/platform/1c300000.drmdecon/early_wakeup
+ chown system system /sys/devices/platform/1c302000.drmdecon/early_wakeup
+ chmod 0660 /sys/devices/platform/1c302000.drmdecon/early_wakeup
+
+# Copy DRM Key
+# copy /system/app/wv.keys /factory/wv.keys
+
+# Permission for DRM Key
+# chmod 0644 /factory/wv.keys
+
+# Permission for flashlight control for HAL3.3
+# The Istor espresso board does not have the flash led h/w, So the below permission line are blocked.
+# If you want to test the flashlight in board which have the flash led h/w, Enable the below blocked lines.
+ chmod 0660 /sys/class/camera/flash/rear_torch_flash
+ chown system camera /sys/class/camera/flash/rear_torch_flash
+#load ecd firmware
+ write /proc/ecd/load_firmware 1
+
+service abox /vendor/bin/main_abox 17c50000.abox
+ class late_start
+ user audioserver
+ group audioserver
+ seclabel u:r:abox:s0
+
+# GPS
+service lhd /vendor/bin/hw/lhd /vendor/etc/gnss/lhd.conf
+ class main
+ user gps
+ group system inet net_raw sdcard_rw
+ ioprio be 0
+
+service gpsd /vendor/bin/hw/gpsd -c /vendor/etc/gnss/gps.xml
+ class main
+ user gps
+ group system gps radio inet wakelock sdcard_rw net_raw
+ ioprio be 0
+
+service scd /vendor/bin/hw/scd /vendor/etc/gnss/scd.conf
+ class main
+ user gps
+ group system inet net_raw wakelock
+ ioprio be 0
+
+service gnss_service /vendor/bin/hw/android.hardware.gnss@2.1-service-brcm
+ class hal
+ user gps
+ group system gps radio
+ ioprio be 0
+ priority -1
+
+# disable gps service if no gps h/w
+on property:vendor.ril.cbd.svc=0
+ stop gpsd
+ stop lhd
+ stop scd
+
+# on userdebug and eng builds, enable kgdb on the serial console
+on property:ro.debuggable=1
+ write /sys/module/kgdboc/parameters/kgdboc ttyFIQ1
+ write /sys/module/fiq_debugger/parameters/kgdb_enable 1
+
+# Touch
+on property:vendor.device.modules.ready=1
+ chown system system /sys/class/spi_master/spi11/spi11.0/stm_fts_cmd
+ chown system system /sys/class/spi_master/spi11/spi11.0/glove_mode
+ chown system system /sys/class/spi_master/spi6/spi6.0/stm_fts_cmd
+ chown system system /sys/class/spi_master/spi6/spi6.0/glove_mode
+ chown system system /sys/devices/virtual/sec/tsp/fw_version
+ chown system system /sys/devices/virtual/sec/tsp/cmd
+ chown system system /sys/devices/virtual/sec/tsp/cmd_result
+ chown system system /sys/devices/virtual/sec/tsp/status
+ chown system system /sys/class/spi_master/spi11/spi11.0/input/nvt_touch/force_touch_active
+ chown system system /sys/class/spi_master/spi11/spi11.0/input/nvt_touch/nvt_dttw_mode
+ # Allow access to touch
+ chown system input /dev/touch_offload
+ chmod 660 /dev/touch_offload
+
+# Route touch_sensitivity_mode to persist
+on property:debug.touch_sensitivity_mode=0
+ setprop persist.vendor.touch_sensitivity_mode 0
+
+on property:debug.touch_sensitivity_mode=1
+ setprop persist.vendor.touch_sensitivity_mode 1
+
+on property:init.svc.vendor.charger=running
+ stop keymaster-4-0
+
+ setprop sys.usb.configfs 1
+ setprop vendor.setup.power 1
+
+ # keep one little and one big
+ write /sys/devices/system/cpu/cpu1/online 0
+ write /sys/devices/system/cpu/cpu2/online 0
+ write /sys/devices/system/cpu/cpu3/online 0
+ write /sys/devices/system/cpu/cpu5/online 0
+ write /sys/devices/system/cpu/cpu6/online 0
+ write /sys/devices/system/cpu/cpu7/online 0
+
+on property:sys.boot_completed=1
+
+ # Runtime fs tuning
+ write /sys/block/sda/queue/nr_requests 64
+ write /sys/block/sda/queue/iostats 1
+ write /dev/sys/fs/by-name/userdata/data_io_flag 8
+ write /dev/sys/fs/by-name/userdata/node_io_flag 8
+
+ # Permission for Pixelstats
+ chown system system /dev/sys/fs/by-name/userdata/compr_written_block
+ chown system system /dev/sys/fs/by-name/userdata/compr_saved_block
+ chown system system /dev/sys/fs/by-name/userdata/compr_new_inode
+ chown system system /dev/sys/fs/by-name/userdata/gc_segment_mode
+ chown system system /dev/sys/fs/by-name/userdata/gc_reclaimed_segments
+
+ # Enable ZRAM on boot_complete
+ swapon_all /vendor/etc/fstab.${ro.board.platform}
+ write /proc/sys/vm/swappiness 100
+
+ # Back to default VM settings
+ write /proc/sys/vm/dirty_expire_centisecs 3000
+ write /proc/sys/vm/dirty_background_ratio 10
+
+ # Enable UFS powersaving
+ write /dev/sys/block/bootdevice/clkgate_enable 1
+
+ # Reset DDR frequency
+ write /sys/devices/platform/17000010.devfreq_mif/devfreq/17000010.devfreq_mif/exynos_data/cancel_boot_freq 1
+ write /sys/devices/platform/17000020.devfreq_int/devfreq/17000020.devfreq_int/exynos_data/cancel_boot_freq 1
+
+ # Setup final cpuset
+ write /dev/cpuset/top-app/cpus ${persist.device_config.vendor_system_native.top-app_cpuset:-0-7}
+ write /dev/cpuset/foreground/cpus ${persist.device_config.vendor_system_native.foreground_cpuset:-0-3,4-5}
+ write /dev/cpuset/background/cpus ${persist.device_config.vendor_system_native.background_cpuset:-0-1}
+ write /dev/cpuset/system-background/cpus ${persist.device_config.vendor_system_native.system-background_cpuset:-0-3}
+ write /dev/cpuset/restricted/cpus ${persist.device_config.vendor_system_native.restricted_cpuset:-0-3}
+ write /dev/cpuset/camera-daemon/cpus ${persist.device_config.vendor_system_native.camera-daemon_cpuset:-0-7}
+ setprop vendor.powerhal.init 1
+
+ # Setup final cpu.uclamp
+ write /proc/vendor_sched/ta_uclamp_min 1
+ write /proc/vendor_sched/fg_uclamp_min 0
+ write /proc/vendor_sched/sys_prefer_idle 0
+ # cfs_rq clamp is using tg->uclamp setting
+ # align it with the vendor_group setting
+ write /proc/vendor_sched/bg_uclamp_max 512
+ write /dev/cpuctl/background/cpu.uclamp.max 50
+ write /proc/vendor_sched/sysbg_uclamp_max 512
+ write /dev/cpuctl/system-background/cpu.uclamp.max 50
+ write /proc/vendor_sched/dex2oat_uclamp_max 615
+ write /dev/cpuctl/dex2oat/cpu.uclamp.max 60
+ write /proc/vendor_sched/ota_uclamp_max 410
+
+ # Set PMU freq limit parameters
+ write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/lcpi_threshold 2
+ write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/spc_threshold 59
+ write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/limit_frequency 1401000
+ write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/lcpi_threshold 6
+ write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/spc_threshold 64
+ write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/limit_frequency 1826000
+ write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/lcpi_threshold 5
+ write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/spc_threshold 69
+ write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/limit_frequency 2507000
+ write /proc/vendor_sched/pmu_poll_time 10
+
+ # Disable PMU freq limit
+ write /sys/devices/system/cpu/cpufreq/policy0/sched_pixel/pmu_limit_enable 1
+ write /sys/devices/system/cpu/cpufreq/policy4/sched_pixel/pmu_limit_enable 1
+ write /sys/devices/system/cpu/cpufreq/policy6/sched_pixel/pmu_limit_enable 1
+ write /proc/vendor_sched/pmu_poll_enable 0
+
+ # Setup groups for SF (RT used for SF RE, SF used for SF main)
+ write /proc/vendor_sched/rt_uclamp_min 161
+ write /proc/vendor_sched/rt_prefer_idle 1
+ write /proc/vendor_sched/sf_uclamp_min 39
+ write /proc/vendor_sched/sf_prefer_idle 1
+
+ # Setup cpu.shares to throttle background groups (bg ~ 5% sysbg ~ 5% dex2oat ~2.5%)
+ write /dev/cpuctl/background/cpu.shares 1024
+ write /dev/cpuctl/system-background/cpu.shares 1024
+ write /dev/cpuctl/dex2oat/cpu.shares 512
+ write /dev/cpuctl/system/cpu.shares 20480
+ # We only have system and background groups holding tasks and the groups below are empty
+ write /dev/cpuctl/camera-daemon/cpu.shares 20480
+ write /dev/cpuctl/foreground/cpu.shares 20480
+ write /dev/cpuctl/nnapi-hal/cpu.shares 20480
+ write /dev/cpuctl/rt/cpu.shares 20480
+ write /dev/cpuctl/top-app/cpu.shares 20480
+
+ # gvotables for dumpstate
+ chown system system /sys/kernel/debug/gvotables
+
+ # AOC reset permission
+ chown root system /sys/devices/platform/19000000.aoc/reset
+ chmod 0220 /sys/devices/platform/19000000.aoc/reset
+
+ # write serialno to battery path for pairing
+ write /sys/class/power_supply/battery/dev_sn ${ro.boot.serialno}
+
+# Test Harness Mode default battery profile.
+on property:persist.sys.test_harness=1 && property:persist.vendor.testing_battery_profile=0
+ setprop persist.vendor.charge.stop.level 70
+ setprop persist.vendor.charge.start.level 35
+ setprop vendor.battery.defender.disable 1
+
+# Extremely restricted battery profile.
+on property:persist.sys.test_harness=1 && property:persist.vendor.testing_battery_profile=1
+ setprop persist.vendor.charge.stop.level 50
+ setprop persist.vendor.charge.start.level 35
+ setprop vendor.battery.defender.disable 1
+
+# Normal behavior (as if the device was a regular device)
+on property:persist.sys.test_harness=1 && property:persist.vendor.testing_battery_profile=2
+ setprop persist.vendor.charge.stop.level 100
+ setprop persist.vendor.charge.start.level 0
+
+# Unrestricted, allows charging to 100%
+on property:persist.sys.test_harness=1 && property:persist.vendor.testing_battery_profile=3
+ setprop persist.vendor.charge.stop.level 100
+ setprop persist.vendor.charge.start.level 0
+ setprop vendor.battery.defender.disable 1
+
+# ACA (Adaptice Charge Always On) persist properties
+on property:persist.vendor.adaptive.charge.soc=*
+ write /sys/class/power_supply/battery/charge_limit ${persist.vendor.adaptive.charge.soc}
+
+service insmod_sh_common /vendor/bin/init.insmod.sh /vendor/etc/init.insmod.gs101.cfg
+ class main
+ user root
+ group root system
+ disabled
+ oneshot
+
+# Set watchdog timer to 30 seconds and pet it every 10 seconds to get a 20 second margin
+service watchdogd /system/bin/watchdogd 10 20
+ class core
+ oneshot
+ seclabel u:r:watchdogd:s0
+
+# bugreport is triggered by holding down volume down, volume up and power
+service bugreport /system/bin/dumpstate -d -p -z
+ class main
+ disabled
+ oneshot
+ keycodes 114 115 116
+
+# Proxy for Secure Storage
+on post-fs-data
+ mkdir /data/vendor/rebootescrow 0770 hsm hsm
+ start vendor.rebootescrow-citadel
+ mkdir /data/vendor/ss 0770 root system
+ mkdir /mnt/vendor/persist/ss 0770 root system
+ restorecon_recursive /mnt/vendor/persist/ss
+ symlink /mnt/vendor/persist/ss /data/vendor/ss/persist
+ chown root system /data/vendor/ss/persist
+ chmod 0770 /data/vendor/ss/persist
+
+ restart storageproxyd
+
+service storageproxyd /vendor/bin/storageproxyd -d /dev/trusty-ipc-dev0 \
+ -r /dev/sg1 -p /data/vendor/ss -t ufs
+ class early_hal
+ user root
+
+# Write build info to kdebuginfo
+on property:ro.build.fingerprint=*
+ write /sys/module/debug_kinfo/parameters/build_info ${ro.build.fingerprint}
+
+# Bluetooth
+on post-fs-data
+ chown bluetooth system /sys/devices/platform/175b0000.serial/serial0/serial0-0/bluetooth/hci0/rfkill0/state
+ chown bluetooth system /sys/devices/platform/odm/odm:btbcm/rfkill/rfkill0/state
+ chown bluetooth system /sys/devices/platform/odm/odm:btbcm/rfkill/rfkill2/state
+ chown bluetooth system /proc/bluetooth/sleep/btwake
+ chown bluetooth system /proc/bluetooth/sleep/lpm
+ chown bluetooth system /proc/bluetooth/sleep/btwrite
+
+# ODPM
+on fs
+ chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-0/i2c-s2mpg10mfd/s2mpg10-meter/s2mpg10-odpm/iio:device1/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-0/0-001f/s2mpg10-meter/s2mpg10-odpm/iio:device1/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-1/i2c-s2mpg11mfd/s2mpg11-meter/s2mpg11-odpm/iio:device0/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-1/1-002f/s2mpg11-meter/s2mpg11-odpm/iio:device0/enabled_rails
+
+ chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-6/i2c-s2mpg10mfd/s2mpg10-meter/s2mpg10-odpm/iio:device0/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-6/6-001f/s2mpg10-meter/s2mpg10-odpm/iio:device0/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-7/i2c-s2mpg11mfd/s2mpg11-meter/s2mpg11-odpm/iio:device1/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-7/7-002f/s2mpg11-meter/s2mpg11-odpm/iio:device1/enabled_rails
+
+ chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-7/i2c-s2mpg10mfd/s2mpg10-meter/s2mpg10-odpm/iio:device0/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17500000/i2c-7/7-001f/s2mpg10-meter/s2mpg10-odpm/iio:device0/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-8/i2c-s2mpg11mfd/s2mpg11-meter/s2mpg11-odpm/iio:device1/enabled_rails
+ chown system system /sys/devices/platform/acpm_mfd_bus@17510000/i2c-8/8-002f/s2mpg11-meter/s2mpg11-odpm/iio:device1/enabled_rails
+
+on post-fs-data
+ mkdir /data/vendor/powerstats 0771 system system
+ chown system system /data/vendor/powerstats
+
+on property:vendor.thermal.link_ready=1
+ # BCL
+ write /sys/devices/virtual/pmic/mitigation/clock_ratio/tpu_light_clk_ratio 0xfff041c5
+ write /sys/devices/virtual/pmic/mitigation/clock_ratio/cpu2_light_clk_ratio 0xfff041c5
+ write /sys/devices/virtual/pmic/mitigation/clock_ratio/gpu_heavy_clk_ratio 0xfff04385
+ write /sys/devices/virtual/pmic/mitigation/clock_ratio/tpu_heavy_clk_ratio 0xfff041c3
+ write /sys/devices/virtual/pmic/mitigation/clock_ratio/cpu2_heavy_clk_ratio 0xfff041c3
+ write /dev/thermal/tz-by-name/smpl_gm/policy user_space
+ write /dev/thermal/tz-by-name/vdroop1/policy user_space
+ write /dev/thermal/tz-by-name/vdroop2/policy user_space
+ write /dev/thermal/tz-by-name/ocp_cpu1/policy user_space
+ write /dev/thermal/tz-by-name/ocp_cpu2/policy user_space
+ write /dev/thermal/tz-by-name/ocp_tpu/policy user_space
+ write /dev/thermal/tz-by-name/ocp_gpu/policy user_space
+ write /dev/thermal/tz-by-name/soft_ocp_cpu1/policy user_space
+ write /dev/thermal/tz-by-name/soft_ocp_cpu2/policy user_space
+ write /dev/thermal/tz-by-name/soft_ocp_tpu/policy user_space
+ write /dev/thermal/tz-by-name/soft_ocp_gpu/policy user_space
+ write /dev/thermal/tz-by-name/soc/policy user_space
+ write /dev/thermal/tz-by-name/batoilo/policy user_space
+ write /sys/devices/virtual/pmic/mitigation/triggered_lvl/smpl_lvl 3100
+ write /sys/devices/virtual/pmic/mitigation/clock_div/tpu_clk_div 0x1
+ write /sys/devices/virtual/pmic/mitigation/clock_div/gpu_clk_div 0x1
+ write /sys/devices/virtual/pmic/mitigation/clock_div/cpu2_clk_div 0x1
+ chown system system /dev/thermal/tz-by-name/soc/mode
+ chown system system /dev/thermal/tz-by-name/batoilo/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/batoilo/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/vdroop2/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/vdroop2/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/vdroop1/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/vdroop1/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/smpl_gm/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/smpl_gm/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/ocp_cpu1/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/ocp_cpu1/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/ocp_cpu2/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/ocp_cpu2/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/ocp_tpu/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/ocp_tpu/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/ocp_gpu/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/ocp_gpu/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/soft_ocp_cpu1/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/soft_ocp_cpu1/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/soft_ocp_cpu2/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/soft_ocp_cpu2/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/soft_ocp_tpu/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/soft_ocp_tpu/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/soft_ocp_gpu/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/soft_ocp_gpu/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/soc/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/soc/trip_point_0_hyst
+ # Thermal
+ chown system system /dev/thermal/tz-by-name/quiet_therm/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/quiet_therm/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/neutral_therm/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/neutral_therm/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/usb_pwr_therm2/trip_point_0_temp
+ chown system system /dev/thermal/tz-by-name/usb_pwr_therm2/trip_point_0_hyst
+ chown system system /dev/thermal/tz-by-name/usb_pwr_therm2/emul_temp
+ chown system system /dev/thermal/cdev-by-name/thermal-cpufreq-0/user_vote
+ chown system system /dev/thermal/cdev-by-name/thermal-cpufreq-1/user_vote
+ chown system system /dev/thermal/cdev-by-name/thermal-cpufreq-2/user_vote
+ chown system system /dev/thermal/cdev-by-name/thermal-gpufreq-0/user_vote
+ chown system system /dev/thermal/cdev-by-name/tpu_cooling/user_vote
+ chown system system /dev/thermal/cdev-by-name/fcc/cur_state
+ chown system system /dev/thermal/cdev-by-name/dc_icl/cur_state
+ chown system system /dev/thermal/cdev-by-name/wlc_fcc/cur_state
+ chown system system /dev/thermal/cdev-by-name/usbc-port/cur_state
+
+on charger
+ write /proc/vendor_sched/sys_uclamp_min 0
+ write /proc/vendor_sched/sys_prefer_idle 0
+
+ # Use charger thermal config
+ setprop vendor.thermal.config "thermal_info_config_charge.json"
+
+ # Wait for insmod_sh to finish all common modules
+ wait_for_prop vendor.common.modules.ready 1
+
+ # Create thermal symlink in off charging mode
+ mkdir /dev/thermal 0750 system system
+ mkdir /dev/thermal/tz-by-name 0750 system system
+ mkdir /dev/thermal/cdev-by-name 0750 system system
+ start vendor.thermal.symlinks
+
+on property:vendor.disable.bcl.control=1
+ write /sys/devices/virtual/pmic/mitigation/instruction/enable_mitigation 0
+
+on property:vendor.disable.bcl.control=0
+ write /sys/devices/virtual/pmic/mitigation/instruction/enable_mitigation 1
+
+# UFS
+on property:ro.boot.mode=charger && property:init.svc.vendor.charger=running
+ # Enable UFS powersaving in Off Mode Charger
+ write /dev/sys/block/bootdevice/clkgate_enable 1
+ # Disable dock-defend in Off Mode Charger
+ write /sys/devices/platform/google,charger/dd_state -1
+
+# Cpuset experiment
+on property:persist.device_config.vendor_system_native.top-app_cpuset=*
+ write /dev/cpuset/top-app/cpus ${persist.device_config.vendor_system_native.top-app_cpuset:-0-7}
+on property:persist.device_config.vendor_system_native.foreground_cpuset=*
+ write /dev/cpuset/foreground/cpus ${persist.device_config.vendor_system_native.foreground_cpuset:-0-3,4-5}
+on property:persist.device_config.vendor_system_native.background_cpuset=*
+ write /dev/cpuset/background/cpus ${persist.device_config.vendor_system_native.background_cpuset:-0-1}
+on property:persist.device_config.vendor_system_native.system-background_cpuset=*
+ write /dev/cpuset/system-background/cpus ${persist.device_config.vendor_system_native.system-background_cpuset:-0-3}
+on property:persist.device_config.vendor_system_native.restricted_cpuset=*
+ write /dev/cpuset/restricted/cpus ${persist.device_config.vendor_system_native.restricted_cpuset:-0-3}
+on property:persist.device_config.vendor_system_native.camera-daemon_cpuset=*
+ write /dev/cpuset/camera-daemon/cpus ${persist.device_config.vendor_system_native.camera-daemon_cpuset:-0-7}
diff --git a/conf/init.gs101.usb.rc b/conf/init.gs101.usb.rc
new file mode 100644
index 00000000..6b04012e
--- /dev/null
+++ b/conf/init.gs101.usb.rc
@@ -0,0 +1,199 @@
+on early-boot
+ mkdir /config/usb_gadget/g1
+ mkdir /config/usb_gadget/g1/strings/0x409
+ mkdir /config/usb_gadget/g1/configs/b.1
+ write /config/usb_gadget/g1/idVendor 0x18d1
+ write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
+ write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}
+ write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model}
+ write /config/usb_gadget/g1/configs/b.1/MaxPower 0x384
+ write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1
+ write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100"
+
+ # ffs function
+ mkdir /config/usb_gadget/g1/functions/ffs.adb 0770 shell shell
+ mkdir /config/usb_gadget/g1/functions/ffs.mtp
+ mkdir /config/usb_gadget/g1/functions/ffs.ptp
+ mkdir /dev/usb-ffs 0775 shell shell
+ mkdir /dev/usb-ffs/adb 0770 shell shell
+ mkdir /dev/usb-ffs/mtp 0770 mtp mtp
+ mkdir /dev/usb-ffs/ptp 0770 mtp mtp
+ mount functionfs adb /dev/usb-ffs/adb rmode=0770,fmode=0660,uid=2000,gid=2000,no_disconnect=1
+ mount functionfs mtp /dev/usb-ffs/mtp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
+ mount functionfs ptp /dev/usb-ffs/ptp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
+ setprop sys.usb.mtp.device_type 3
+ setprop sys.usb.mtp.batchcancel true
+ symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1
+
+ # mtp function
+ mkdir /config/usb_gadget/g1/functions/mtp.gs0
+
+ # ptp function
+ mkdir /config/usb_gadget/g1/functions/ptp.gs1
+
+ # accessory function
+ mkdir /config/usb_gadget/g1/functions/accessory.gs2
+
+ # audio_source function
+ mkdir /config/usb_gadget/g1/functions/audio_source.gs3
+
+ # rndis function
+ mkdir /config/usb_gadget/g1/functions/rndis.gs4
+ # Modify class/subclass/protocol for rndis.gs4
+ # Remote NDIS: Class: Wireless Controller (0xe0), Subclass: 0x1, Protocol: 0x3
+ write /config/usb_gadget/g1/functions/rndis.gs4/class e0
+ write /config/usb_gadget/g1/functions/rndis.gs4/subclass 01
+ write /config/usb_gadget/g1/functions/rndis.gs4/protocol 03
+ write /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.ncm/compatible_id RNDIS
+ write /config/usb_gadget/g1/functions/rndis.gs4/ifname rndis%d
+ setprop vendor.usb.rndis.config rndis.gs4
+
+ # midi function
+ mkdir /config/usb_gadget/g1/functions/midi.gs5
+
+ # acm function
+ mkdir /config/usb_gadget/g1/functions/acm.gs6
+
+ # dm function
+ mkdir /config/usb_gadget/g1/functions/dm.gs7
+
+ # uts function
+ mkdir /config/usb_gadget/g1/functions/uts.gs8
+
+ # ncm function
+ mkdir /config/usb_gadget/g1/functions/ncm.gs9
+ write /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm/compatible_id WINNCM
+ write /config/usb_gadget/g1/functions/ncm.gs9/ifname ncm%d
+
+ # etr_miu function
+ mkdir /config/usb_gadget/g1/functions/etr_miu.gs11
+
+ # acm function for uwb
+ mkdir /config/usb_gadget/g1/functions/acm.uwb0
+
+ # chown file/folder permission
+ chown system system /config/usb_gadget/
+ chown system system /config/usb_gadget/g1
+ chown system system /config/usb_gadget/g1/UDC
+ chown system system /config/usb_gadget/g1/bDeviceClass
+ chown system system /config/usb_gadget/g1/bDeviceProtocol
+ chown system system /config/usb_gadget/g1/bDeviceSubClass
+ chown system system /config/usb_gadget/g1/bMaxPacketSize0
+ chown system system /config/usb_gadget/g1/bcdDevice
+ chown system system /config/usb_gadget/g1/bcdUSB
+ chown system system /config/usb_gadget/g1/configs
+ chown system system /config/usb_gadget/g1/configs/b.1
+ chown system system /config/usb_gadget/g1/configs/b.1/MaxPower
+ chown system system /config/usb_gadget/g1/configs/b.1/bmAttributes
+ chown system system /config/usb_gadget/g1/configs/b.1/strings
+ chown system system /config/usb_gadget/g1/functions
+ chown system system /config/usb_gadget/g1/functions/accessory.gs2
+ chown system system /config/usb_gadget/g1/functions/acm.gs6
+ chown system system /config/usb_gadget/g1/functions/acm.gs6/port_num
+ chown system system /config/usb_gadget/g1/functions/acm.uwb0
+ chown system system /config/usb_gadget/g1/functions/acm.uwb0/port_num
+ chown system system /config/usb_gadget/g1/functions/audio_source.gs3
+ chown system system /config/usb_gadget/g1/functions/dm.gs7
+ chown system system /config/usb_gadget/g1/functions/ffs.adb
+ chown system system /config/usb_gadget/g1/functions/ffs.mtp
+ chown system system /config/usb_gadget/g1/functions/ffs.ptp
+ chown system system /config/usb_gadget/g1/functions/midi.gs5
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/buflen
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/id
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/in_ports
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/index
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/out_ports
+ chown system system /config/usb_gadget/g1/functions/midi.gs5/qlen
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/compatible_id
+ chown system system /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/sub_compatible_id
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/dev_addr
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/host_addr
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/ifname
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm/compatible_id
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/os_desc/interface.ncm/sub_compatible_id
+ chown system system /config/usb_gadget/g1/functions/ncm.gs9/qmult
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP/compatible_id
+ chown system system /config/usb_gadget/g1/functions/ptp.gs1/os_desc/interface.MTP/sub_compatible_id
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/class
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/dev_addr
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/host_addr
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/ifname
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis/compatible_id
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis/sub_compatible_id
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/protocol
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/qmult
+ chown system system /config/usb_gadget/g1/functions/rndis.gs4/subclass
+ chown system system /config/usb_gadget/g1/idProduct
+ chown system system /config/usb_gadget/g1/idVendor
+ chown system system /config/usb_gadget/g1/max_speed
+ chown system system /config/usb_gadget/g1/os_desc
+ chown system system /config/usb_gadget/g1/os_desc/b.1
+ chown system system /config/usb_gadget/g1/os_desc/b_vendor_code
+ chown system system /config/usb_gadget/g1/os_desc/qw_sign
+ chown system system /config/usb_gadget/g1/os_desc/use
+ chown system system /config/usb_gadget/g1/strings
+ chown system system /config/usb_gadget/g1/strings/0x409
+ chown system system /config/usb_gadget/g1/strings/0x409/manufacturer
+ chown system system /config/usb_gadget/g1/strings/0x409/product
+ chown system system /config/usb_gadget/g1/strings/0x409/serialnumber
+ setprop vendor.usb.functions.ready 1
+
+on boot
+ write /config/usb_gadget/g1/bcdDevice 0x0510
+ # Use USB Gadget HAL
+ setprop sys.usb.configfs 2
+
+on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.configfs=1
+ write /config/usb_gadget/g1/idProduct 0x4EE7
+ write /config/usb_gadget/g1/idVendor 0x18D1
+
+on property:vendor.usb.config=*
+ start usbd
+
+on property:persist.vendor.usb.usbradio.config=*
+ start usbd
+
+on charger
+ mkdir /config/usb_gadget/g1
+ mkdir /config/usb_gadget/g1/strings/0x409
+ mkdir /config/usb_gadget/g1/configs/b.1
+ write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
+ write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}
+ write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model}
+ write /config/usb_gadget/g1/configs/b.1/MaxPower 0x384
+ write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1
+ write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100"
+ write /config/usb_gadget/g1/bcdDevice 0x0510
+ mkdir /config/usb_gadget/g1/functions/midi.gs5
+ symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1
+ setprop sys.usb.controller "11110000.dwc3"
+ setprop sys.usb.configfs 1
+
+on property:ro.bootmode=charger
+ setprop sys.usb.config charger
+
+on property:sys.usb.config=charger && property:sys.usb.configfs=1
+ write /config/usb_gadget/g1/idVendor 0x18d1
+ write /config/usb_gadget/g1/idProduct 0x4eea
+ write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "midi"
+ symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1
+ write /config/usb_gadget/g1/UDC ${sys.usb.controller}
+ setprop sys.usb.state ${sys.usb.config}
+
+on property:vendor.usb.contaminantdisable=true
+ exec /vendor/bin/hw/disable_contaminant_detection.sh
+
+on property:ro.bootmode=usbuwb
+ setprop persist.vendor.usb.usbradio.config uwb_acm
diff --git a/conf/init.recovery.device.rc b/conf/init.recovery.device.rc
new file mode 100644
index 00000000..c94d079f
--- /dev/null
+++ b/conf/init.recovery.device.rc
@@ -0,0 +1,19 @@
+on init
+ wait /sys/devices/platform/11110000.usb/11110000.dwc3/driver 10
+ setprop sys.usb.controller "11110000.dwc3"
+ setprop sys.usb.configfs 1
+
+on init && property:ro.debuggable=1 && property:ro.boot.mode=recovery
+ start recovery-console
+
+service recovery-console /system/bin/sh
+ class core
+ console
+ disabled
+ user root
+ group root shell log readproc
+ seclabel u:r:su:s0
+ setenv HOSTNAME console
+
+on fs && property:sys.usb.configfs=1
+ write /config/usb_gadget/g1/configs/b.1/MaxPower 900
diff --git a/conf/nomodem/Android.bp b/conf/nomodem/Android.bp
new file mode 100644
index 00000000..1b1ae24e
--- /dev/null
+++ b/conf/nomodem/Android.bp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+// By default this device uses hardware-wrapped keys for storage encryption,
+// which is intended to offer increased security over the traditional method
+// (software keys). However, hardware-wrapped keys aren't compatible with
+// FIPS-140 certification of the encryption hardware, and hence we have to
+// disable the use of them in FIPS mode. This requires having two fstab files:
+// one for the default mode, and one for FIPS mode selectable via
+// androidboot.fstab_suffix on the kernel command line. These fstabs should be
+// identical with the exception of the encryption settings, so to keep them in
+// sync the rules below generate them from a template file.
+
+soong_namespace {
+ imports: [
+ "device/google/gs101",
+ "device/google/gs101/conf",
+ ],
+}
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["device_google_gs101_license"],
+}
+
+genrule {
+ name: "gen_fstab.gs101",
+ srcs: [
+ "fstab.gs101.in*",
+ ":gs101_srcs",
+ ],
+ out: ["fstab.gs101"],
+ cmd: "sed -e s/@fileencryption@/::inlinecrypt_optimized+wrappedkey_v0/" +
+ " -e s/@metadata_encryption@/:wrappedkey_v0/" +
+ " -e /modem/d " +
+ " -e /efs/d $(in) > $(out)",
+}
+
+genrule {
+ name: "gen_fstab.gs101-fips",
+ srcs: [
+ "fstab.gs101.in*",
+ ":gs101_srcs",
+ ],
+ out: ["fstab.gs101-fips"],
+ cmd: "sed -e s/@fileencryption@/aes-256-xts/" +
+ " -e s/@metadata_encryption@/aes-256-xts/" +
+ " -e /modem/d " +
+ " -e /efs/d $(in) > $(out)",
+}
+
+prebuilt_etc {
+ name: "fstab.gs101",
+ src: ":gen_fstab.gs101",
+ vendor: true,
+ vendor_ramdisk_available: true,
+}
+
+prebuilt_etc {
+ name: "fstab.gs101-fips",
+ src: ":gen_fstab.gs101-fips",
+ vendor: true,
+ vendor_ramdisk_available: true,
+} \ No newline at end of file
diff --git a/conf/recovery.wipe b/conf/recovery.wipe
new file mode 100644
index 00000000..9ee7a1e3
--- /dev/null
+++ b/conf/recovery.wipe
@@ -0,0 +1,3 @@
+# All the partitions to be wiped (in order) under recovery.
+/dev/block/by-name/userdata
+/dev/block/by-name/metadata
diff --git a/conf/soundtrigger_conf.h b/conf/soundtrigger_conf.h
new file mode 100644
index 00000000..1263c60b
--- /dev/null
+++ b/conf/soundtrigger_conf.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __EXYNOS_SOUNDTRIGGERCONF_H__
+#define __EXYNOS_SOUNDTRIGGERCONF_H__
+
+/********************************************************************/
+/** ALSA Framework Sound Card & Sound Device Information */
+/** */
+/** You can find Sound Device Name from /dev/snd. */
+/** Sound Device Name consist of Card Number & Device Number. */
+/** */
+/********************************************************************/
+
+/* Sound Card and Mixer card Numbers based on Target Device */
+/* You have to match this number with real kernel information */
+#define VTS_SOUND_CARD 0
+#define VTS_MIXER_CARD 0
+
+/* PCM Nodes number for seamless and normal recording*/
+#define VTS_TRICAP_DEVICE_NODE 13
+#define VTS_RECORD_DEVICE_NODE 14
+
+/* sysfs file paths for loading model binaries into VTS kernel driver */
+#define VTS_HOTWORD_MODEL "/sys/devices/platform/13810000.vts/vts_google_model"
+#define VTS_SVOICE_MODEL "/sys/devices/platform/13810000.vts/vts_svoice_model"
+
+#define AUDIO_PRIMARY_HAL_LIBRARY_PATH "/vendor/lib/libaudioproxy.so"
+
+// VTS Capture(Input) PCM Configuration
+#define DEFAULT_VTS_CHANNELS 1 // Mono
+#define DEFAULT_VTS_SAMPLING_RATE 16000 // 16KHz
+
+#define PRIMARY_VTS_PERIOD_SIZE 160 // 160 frames, 10ms in case of 16KHz Stream
+#define PRIMARY_VTS_PERIOD_COUNT 1024 // Buffer count => Total 327680 Bytes = 160 * 1(Mono) * 2(16bit PCM) * 1024(Buffer count)
+
+/* VTS mixer controls */
+#define VTS_ACTIVE_KEYPHRASE_CTL_NAME "VTS Active Keyphrase" /* default: 0-"SVOICE", 1-"GOOGLE", 2-"SENSORY" */
+#define VTS_EXECUTION_MODE_CTL_NAME "VTS Execution Mode" /* 0-"OFF-MODE", 1-"VOICE-TRIG-MODE", 2-"SOUND-DECTECT-MODE", 3-"VT-ALWAYS-MODE" 4-"GOOGLE-TRI-MODE */
+#define VTS_VOICERECOGNIZE_START_CTL_NAME "VTS VoiceRecognize Start" /* 0-"Off", 1-On" */
+#define VTS_VOICETRIGGER_VALUE_CTL_NAME "VTS VoiceTrigger Value" /* 0 ~ 2000 ms*/
+
+#define MAIN_MIC_CONTROL_COUNT 8
+#define HEADSET_MIC_CONTROL_COUNT 8
+#define MODEL_RECOGNIZE_CONTROL_COUNT 4
+
+/* MIC Mixer controls for VTS */
+char *main_mic_ctlname[] = {
+ "VTS DMIC SEL",
+ "VTS DMIC IF RCH EN",
+ "VTS DMIC IF LCH EN",
+ "VTS SYS SEL",
+ "VTS HPF EN",
+ "VTS HPF SEL",
+ "DMIC1 Switch",
+ "VTS Virtual Output Mux",
+};
+
+char *headset_mic_ctlname[] = {
+ "AUXPDM1 Rate",
+ "AUXPDM1 Input",
+ "AUXPDM1 Output Switch",
+ "AUXPDM Switch",
+ "VTS DMIC SEL",
+ "VTS DMIC IF RCH EN",
+ "VTS DMIC IF LCH EN",
+ "VTS SYS SEL",
+ "VTS HPF EN",
+ "VTS HPF SEL",
+};
+
+/* MIC Mixer control values */
+/* FIXME : Double check this values */
+int main_mic_ctlvalue[] = {
+ 0, //"VTS DMIC SEL",
+ 1, //"VTS DMIC IF RCH EN",
+ 1, //"VTS DMIC IF LCH EN",
+ 1, //"VTS SYS SEL",
+ 1, //"VTS HPF EN",
+ 1, //"VTS HPF SEL",
+ 1, //"DMIC1 Switch",
+ 1, //"VTS Virtual Output Mux",
+};
+
+int headset_mic_ctlvalue[] = {
+ 3, //"AUXPDM1 Rate",
+ 0, //"AUXPDM1 Input",
+ 1, //"AUXPDM1 Output Switch",
+ 1, //"AUXPDM Switch",
+ 1, //"VTS DMIC SEL",
+ 1, //"VTS DMIC IF RCH EN",
+ 1, //"VTS DMIC IF LCH EN",
+ 1, //"VTS SYS SEL",
+ 1, //"VTS HPF EN",
+ 1, //"VTS HPF SEL",
+};
+#endif // __EXYNOS_SOUNDTRIGGERCONF_H__
diff --git a/conf/ueventd.gs101.rc b/conf/ueventd.gs101.rc
new file mode 100644
index 00000000..a821fd12
--- /dev/null
+++ b/conf/ueventd.gs101.rc
@@ -0,0 +1,216 @@
+/dev/mali0 0666 system system
+/dev/ion 0666 system system
+/dev/ump 0666 system graphics
+/dev/exynos-mem 0660 system graphics
+/dev/video0 0660 system camera
+/dev/video1 0660 system camera
+/dev/video2 0660 system camera
+/dev/video3 0660 system camera
+/dev/video20 0660 system system
+# media0 is used for GSC, DECON, etc
+/dev/media0 0660 system camera
+# media1 is used for DECON Ext WB
+/dev/media1 0660 system graphics
+# Various devices use the v4l-subdev interface
+# We declare all such nodes simultaneously here
+/dev/v4l-subdev0 0660 system camera
+/dev/v4l-subdev1 0660 system camera
+/dev/v4l-subdev2 0660 system camera
+/dev/v4l-subdev3 0660 system camera
+/dev/v4l-subdev4 0660 system camera
+/dev/v4l-subdev5 0660 system camera
+/dev/v4l-subdev6 0660 system camera
+/dev/v4l-subdev7 0660 system camera
+/dev/v4l-subdev8 0660 system camera
+/dev/v4l-subdev9 0660 system camera
+/dev/v4l-subdev10 0660 system camera
+/dev/v4l-subdev11 0660 system camera
+/dev/v4l-subdev12 0660 system camera
+/dev/v4l-subdev13 0660 system camera
+/dev/v4l-subdev14 0660 system camera
+/dev/v4l-subdev15 0660 system camera
+/dev/v4l-subdev16 0660 system camera
+/dev/v4l-subdev17 0660 system camera
+/dev/v4l-subdev18 0660 system camera
+/dev/v4l-subdev19 0660 system camera
+# v4l-subdev20 is used for DECON Ext WB
+/dev/v4l-subdev20 0660 system graphics
+/dev/v4l-subdev21 0660 system graphics
+/dev/v4l-subdev32 0660 system graphics
+
+# gscalers
+/dev/video23 0660 media graphics
+/dev/video26 0660 media graphics
+/dev/video24 0660 media graphics
+/dev/video27 0660 media graphics
+/dev/video29 0660 media graphics
+/dev/video30 0660 media graphics
+# video31 is used for DECON Ext WB
+/dev/video31 0660 media graphics
+
+# mscalers
+/dev/video50 0660 mediacodec drmrpc
+/dev/m2m1shot_scaler0 0660 mediacodec drmrpc
+
+/dev/video55 0666 system graphics
+/dev/g2d 0660 system graphics
+/dev/fimg2d 0666 system graphics
+/dev/i2c-2 0660 system system
+/dev/HPD 0660 system system
+
+# wfd
+/dev/tsmux 0660 media graphics
+/dev/repeater 0660 media graphics
+
+# mfc
+/dev/video6 0660 mediacodec mediadrm
+/dev/video7 0660 mediacodec mediadrm
+/dev/video8 0660 mediacodec mediadrm
+/dev/video9 0660 mediacodec mediadrm
+/dev/video10 0660 mediacodec mediadrm
+/dev/video11 0660 mediacodec mediadrm
+
+# camera
+/dev/media2 0660 media media
+/dev/hdcp2 0660 media media
+
+# jpeg
+/dev/m2m1shot_jpeg 0660 media media
+/dev/video12 0660 cameraserver media
+
+# audio
+/dev/seiren 0660 system audio
+/dev/acd-audio_output_tuning 0660 system audio
+/dev/acd-audio_bulk_tx 0660 system audio
+/dev/acd-audio_bulk_rx 0660 system audio
+/dev/acd-audio_input_tuning 0660 system audio
+/dev/acd-audio_input_bulk_tx 0660 system audio
+/dev/acd-audio_input_bulk_rx 0660 system audio
+/dev/acd-sound_trigger 0660 system audio
+/dev/acd-hotword_notification 0660 system audio
+/dev/acd-hotword_pcm 0660 system audio
+/dev/acd-ambient_pcm 0660 system audio
+/dev/acd-model_data 0660 system audio
+/dev/acd-debug 0660 system audio
+/dev/acd-audio_tap* 0660 system audio
+/dev/acd-audio_dcdoff_ref 0660 system audio
+/dev/amcs 0660 system audio
+
+# Secure MEM driver
+/dev/s5p-smem 0660 drm drmrpc
+
+# cbd
+/dev/block/by-name/modem 0640 root radio
+/dev/block/by-name/modem_a 0640 root radio
+/dev/block/by-name/modem_b 0640 root radio
+
+# DM tools
+/dev/umts_dm0 0660 system system
+/dev/umts_router 0660 system system
+/dev/ttyGS0 0660 system system
+/dev/ttyGS1 0660 system system
+/dev/ttyGS2 0660 system system
+
+# IPC RIL
+/dev/umts_boot0 0660 radio system
+/dev/umts_ipc0 0660 radio radio
+/dev/umts_ipc1 0660 radio radio
+/dev/umts_rfs0 0660 radio radio
+
+# IPC OEM
+/dev/oem_ipc* 0660 radio radio
+
+# interactive governor parameters
+/sys/devices/system/cpu/cpu* cpufreq/interactive/timer_rate 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/timer_slack 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/min_sample_time 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/hispeed_freq 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/target_loads 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/go_hispeed_load 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/above_hispeed_delay 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/boost 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/boostpulse 0200 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/input_boost 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/boostpulse_duration 0660 system system
+/sys/devices/system/cpu/cpu* cpufreq/interactive/io_is_busy 0660 system system
+
+# Vision (VPU, SCORE)
+/dev/vertex0 0660 media media
+/dev/vertex1 0660 media media
+
+# AoC
+/dev/aoc 0660 system system
+
+# Sensors (USF)
+/dev/acd-com.google.usf 0660 system system
+/dev/acd-com.google.usf.non_wake_up 0660 system system
+
+# LWIS
+/dev/lwis* 0660 system system
+
+# NFC
+/dev/st21nfc 0660 nfc nfc
+
+# SecureElement
+/dev/st54j_se 0660 secure_element secure_element
+/dev/st54spi 0660 secure_element secure_element
+/dev/st33spi 0660 secure_element secure_element
+
+#bigocean
+/dev/bigocean 0660 mediacodec mediadrm
+
+# Trusty
+/dev/trusty-ipc-dev0 0660 system drmrpc
+/dev/trusty-log0 0660 system system
+
+# RPMB
+/dev/sg1 0660 system system
+
+# Citadel
+/dev/gsc0 0660 hsm hsm
+
+# Storage: for factory reset protection feature
+/dev/block/by-name/frp 0660 system system
+
+# Storage: for calibration data sideload feature
+/dev/block/by-name/mfg_data 0660 system system
+
+# TPU
+/dev/abrolhos 0660 system system
+
+# TOE
+/dev/dit2 0660 radio radio
+
+# Bluetooth
+/dev/ttySAC16 0660 bluetooth system
+
+# BT Wifi Coexistence
+/dev/wbrc 0660 system system
+
+# TUI
+/dev/tui-driver 0660 system system
+
+# DMA-BUF heaps
+/dev/dma_heap/crypto 0444 system graphics
+/dev/dma_heap/crypto-uncached 0444 system graphics
+/dev/dma_heap/faceauth_tpu-secure 0444 system graphics
+/dev/dma_heap/faimg-secure 0444 system graphics
+/dev/dma_heap/famodel-secure 0444 system graphics
+/dev/dma_heap/faprev-secure 0444 system graphics
+/dev/dma_heap/farawimg-secure 0444 system graphics
+/dev/dma_heap/tui-secure 0444 system graphics
+/dev/dma_heap/vframe-secure 0444 system drmrpc
+/dev/dma_heap/video_system 0444 system drmrpc
+/dev/dma_heap/video_system-uncached 0444 system drmrpc
+/dev/dma_heap/vscaler-secure 0444 system graphics
+/dev/dma_heap/vstream-secure 0444 system drmrpc
+/dev/dma_heap/sensor_direct_heap 0444 system graphics
+/dev/dma_heap/aaudio_playback_heap 0444 system audio
+/dev/dma_heap/aaudio_capture_heap 0444 system audio
+
+# Direct Charging
+/dev/logbuffer_pca9468_tcpm 0600 system system
+
+# Raw HID devices
+/dev/hidraw* 0660 system system
+
diff --git a/confirmationui/confirmationui.mk b/confirmationui/confirmationui.mk
new file mode 100644
index 00000000..85f77c94
--- /dev/null
+++ b/confirmationui/confirmationui.mk
@@ -0,0 +1,9 @@
+# Trusty ConfirmationUI HAL
+PRODUCT_PACKAGES += \
+ android.hardware.confirmationui@1.0-service.trusty.vendor
+
+# Trusty Secure DPU Daemon
+PRODUCT_PACKAGES += \
+ securedpud.slider
+
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/confirmationui/
diff --git a/default-permissions.xml b/default-permissions.xml
new file mode 100644
index 00000000..425b93f8
--- /dev/null
+++ b/default-permissions.xml
@@ -0,0 +1,170 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+
+<!-- Copyright (C) 2019 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.
+-->
+
+<!--
+ This file contains permissions to be granted by default. Default
+ permissions are granted to special platform components and to apps
+ that are approved to get default grants. The special components
+ are apps that are expected tto work out-of-the-box as they provide
+ core use cases such as default dialer, default email, etc. These
+ grants are managed by the platform. The apps that are additionally
+ approved for default grants are ones that provide carrier specific
+ functionality, ones legally required at some location, ones providing
+ alternative disclosure and opt-out UI, ones providing highlight features
+ of a dedicated device, etc. This file contains only the latter exceptions.
+ Fixed permissions cannot be controlled by the user and need a special
+ approval. Typically these are to ensure either legally mandated functions
+ or the app is considered a part of the OS.
+-->
+
+<exceptions>
+
+ <!-- This is an example of an exception:
+ <exception
+ package="foo.bar.permission"
+ <permission name="android.permission.READ_CONTACTS" fixed="true"/>
+ <permission name="android.permission.READ_CALENDAR" fixed="false"/>
+ </exception>
+ -->
+
+ <exception package="com.google.android.settings.intelligence">
+ <!-- Calendar -->
+ <permission name="android.permission.READ_CALENDAR" fixed="true"/>
+ <!-- Location -->
+ <permission name="android.permission.ACCESS_FINE_LOCATION" fixed="false"/>
+ <permission name="android.permission.ACCESS_BACKGROUND_LOCATION" fixed="false"/>
+ <!-- Battery Widget -->
+ <permission name="android.permission.BLUETOOTH_CONNECT" fixed="false"/>
+ </exception>
+
+ <exception package="com.google.android.apps.camera.services">
+ <!-- Camera -->
+ <permission name="android.permission.CAMERA" fixed="false"/>
+ </exception>
+
+ <exception package="com.google.android.apps.cbrsnetworkmonitor">
+ <!-- Location access to create CBRS geofences-->
+ <permission name="android.permission.ACCESS_FINE_LOCATION" fixed="true"/>
+ <permission name="android.permission.ACCESS_COARSE_LOCATION" fixed="true"/>
+ <permission name="android.permission.ACCESS_BACKGROUND_LOCATION" fixed="true"/>
+ </exception>
+
+ <exception package="com.google.android.apps.scone">
+ <!-- Used to call ActivityTransition API for Smart PNO -->
+ <permission name="android.permission.ACTIVITY_RECOGNITION" fixed="false"/>
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+
+ <exception
+ package="com.google.android.apps.restore">
+ <!-- External storage -->
+ <permission name="android.permission.READ_EXTERNAL_STORAGE" fixed="false"/>
+ <permission name="android.permission.WRITE_EXTERNAL_STORAGE" fixed="false"/>
+ <!-- Contacts -->
+ <permission name="android.permission.READ_CONTACTS" fixed="false"/>
+ <permission name="android.permission.WRITE_CONTACTS" fixed="false"/>
+ <!-- Call logs -->
+ <permission name="android.permission.READ_CALL_LOG" fixed="false"/>
+ <permission name="android.permission.WRITE_CALL_LOG" fixed="false"/>
+ <!-- Used to set up a Wi-Fi P2P network -->
+ <!-- TODO(b/231966826): Remove the location permission after Restore targets to T. -->
+ <permission name="android.permission.ACCESS_FINE_LOCATION" fixed="false"/>
+ <permission name="android.permission.NEARBY_WIFI_DEVICES" fixed="false"/>
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+
+ <exception
+ package="com.verizon.mips.services">
+ <!-- Call -->
+ <permission name="android.permission.PROCESS_OUTGOING_CALLS" fixed="false"/>
+ <!-- Phone -->
+ <permission name="android.permission.READ_PHONE_STATE" fixed="false"/>
+ <!-- SMS -->
+ <permission name="android.permission.RECEIVE_SMS" fixed="false"/>
+ </exception>
+
+ <exception
+ package="com.google.android.factorytest">
+ <!-- Camera -->
+ <permission name="android.permission.CAMERA" fixed="false"/>
+ <!-- Microphone -->
+ <permission name="android.permission.RECORD_AUDIO" fixed="false"/>
+ <!-- Storage -->
+ <permission name="android.permission.READ_EXTERNAL_STORAGE" fixed="false"/>
+ <permission name="android.permission.WRITE_EXTERNAL_STORAGE" fixed="false"/>
+ </exception>
+
+ <exception package="com.google.android.wfcactivation">
+ <!-- SMS -->
+ <permission name="android.permission.RECEIVE_WAP_PUSH" fixed="false"/>
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+
+ <exception package="com.google.android.apps.accessibility.voiceaccess">
+        <!-- Voice Access: A11y app to allow users to setup & control their devices with voice -->
+        <!-- Approved android bug for pregrant permissions: b/182307492 -->
+
+ <!-- Phone state to turn off Voice Access when user is in a phone call -->
+ <permission name="android.permission.READ_PHONE_STATE" fixed="false"/>
+
+ <!-- Microphone: To hear user's voice commands -->
+ <permission name="android.permission.RECORD_AUDIO" fixed="false"/>
+    </exception>
+ <exception
+ package="com.google.android.deskclock">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+ <exception
+ package="com.google.android.apps.tips">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+ <exception
+ package="com.google.android.adservices">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+ <exception
+ package="com.google.android.apps.mediashell">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+ <exception
+ package="com.google.android.apps.pixelmigrate">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+ <exception
+ package="com.google.android.apps.work.oobconfig">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="true"/>
+ </exception>
+ <exception
+ package="com.google.android.apps.turbo">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+ <exception
+ package="com.google.android.euicc">
+ <!-- Notifications -->
+ <permission name="android.permission.POST_NOTIFICATIONS" fixed="false"/>
+ </exception>
+</exceptions>
diff --git a/device-common.mk b/device-common.mk
new file mode 100644
index 00000000..d9522989
--- /dev/null
+++ b/device-common.mk
@@ -0,0 +1,53 @@
+#
+# Copyright (C) 2020 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.
+#
+
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+-include vendor/google_devices/gs101/proprietary/telephony/device-vendor.mk
+endif
+include device/google/gs101/device.mk
+include device/google/gs101/tts/voice_packs.mk
+
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+# Telephony
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.telephony.carrierlock.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.carrierlock.xml
+endif
+
+# Android Verified Boot
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.software.verified_boot.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.verified_boot.xml
+
+# Factory OTA
+-include vendor/unbundled_google/packages/FactoryOtaPrebuilt/factoryota.mk
+
+# Set system properties identifying the chipset
+PRODUCT_VENDOR_PROPERTIES += ro.soc.manufacturer=Google
+PRODUCT_VENDOR_PROPERTIES += ro.soc.model=Tensor
+
+PRODUCT_PRODUCT_PROPERTIES += \
+ persist.vendor.testing_battery_profile=2
+
+# The default value of this variable is false and should only be set to true when
+# the device allows users to retain eSIM profiles after factory reset of user data.
+PRODUCT_PRODUCT_PROPERTIES += \
+ masterclear.allow_retain_esim_profiles_after_fdr=true
+
+# ZramWriteback
+-include hardware/google/pixel/mm/device_gki.mk
+
+# Set thermal warm reset
+PRODUCT_PRODUCT_PROPERTIES += \
+ ro.thermal_warmreset = true
diff --git a/device-shipping-common.mk b/device-shipping-common.mk
new file mode 100644
index 00000000..a4539fc1
--- /dev/null
+++ b/device-shipping-common.mk
@@ -0,0 +1,22 @@
+#
+# Copyright (C) 2020 The Android Open-Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+include device/google/gs101/device-common.mk
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.bluetooth.a2dp_offload.supported=true \
+ persist.bluetooth.a2dp_offload.disabled=false \
+ persist.bluetooth.a2dp_offload.cap=sbc-aac-aptx-aptxhd-ldac-opus
+
diff --git a/device.mk b/device.mk
new file mode 100644
index 00000000..f0ce62ac
--- /dev/null
+++ b/device.mk
@@ -0,0 +1,1203 @@
+#
+# Copyright (C) 2011 The Android Open-Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+include device/google/gs-common/device.mk
+
+TARGET_BOARD_PLATFORM := gs101
+DEVICE_IS_64BIT_ONLY ?= $(if $(filter %_64,$(TARGET_PRODUCT)),true,false)
+
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
+LOCAL_64ONLY := _64
+endif
+
+AB_OTA_POSTINSTALL_CONFIG += \
+ RUN_POSTINSTALL_system=true \
+ POSTINSTALL_PATH_system=system/bin/otapreopt_script \
+ FILESYSTEM_TYPE_system=ext4 \
+POSTINSTALL_OPTIONAL_system=true
+
+# Set Vendor SPL to match platform
+VENDOR_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)
+
+# Set boot SPL
+BOOT_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)
+
+# TODO(b/207450311): Remove this flag once implemented
+USE_PIXEL_GRALLOC := false
+ifeq ($(USE_PIXEL_GRALLOC),true)
+ PRODUCT_SOONG_NAMESPACES += hardware/google/gchips/GrallocHAL
+else
+ PRODUCT_SOONG_NAMESPACES += hardware/google/gchips/gralloc4
+endif
+
+PRODUCT_SOONG_NAMESPACES += \
+ hardware/google/av \
+ hardware/google/gchips \
+ hardware/google/graphics/common \
+ hardware/google/graphics/gs101 \
+ hardware/google/interfaces \
+ hardware/google/pixel \
+ device/google/gs101 \
+ device/google/gs101/powerstats \
+ vendor/google/whitechapel/tools \
+ vendor/broadcom/bluetooth \
+ vendor/google/camera \
+ vendor/google/interfaces \
+ vendor/google_devices/common/proprietary/confirmatioui_hal \
+ vendor/google_nos/host/android \
+ vendor/google_nos/test/system-test-harness
+
+LOCAL_KERNEL := $(TARGET_KERNEL_DIR)/Image.lz4
+
+# OEM Unlock reporting
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+ ro.oem_unlock_supported=1
+
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+# Include vendor telephony soong namespace
+PRODUCT_SOONG_NAMESPACES += \
+ vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)
+endif
+
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+#Set IKE logs to verbose for WFC
+PRODUCT_PROPERTY_OVERRIDES += log.tag.IKE=VERBOSE
+
+#Set Shannon IMS logs to debug
+PRODUCT_PROPERTY_OVERRIDES += log.tag.SHANNON_IMS=DEBUG
+
+#Set Shannon QNS logs to debug
+PRODUCT_PROPERTY_OVERRIDES += log.tag.ShannonQNS=DEBUG
+PRODUCT_PROPERTY_OVERRIDES += log.tag.ShannonQNS-ims=DEBUG
+PRODUCT_PROPERTY_OVERRIDES += log.tag.ShannonQNS-emergency=DEBUG
+PRODUCT_PROPERTY_OVERRIDES += log.tag.ShannonQNS-mms=DEBUG
+PRODUCT_PROPERTY_OVERRIDES += log.tag.ShannonQNS-xcap=DEBUG
+PRODUCT_PROPERTY_OVERRIDES += log.tag.ShannonQNS-HC=DEBUG
+
+# Modem userdebug
+include device/google/gs101/modem/userdebug.mk
+endif
+
+include device/google/gs101/modem/user.mk
+
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+# b/36703476: Set default log size to 1M
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.logd.size=1M
+# b/114766334: persist all logs by default rotating on 30 files of 1MiB
+PRODUCT_PROPERTY_OVERRIDES += \
+ logd.logpersistd=logcatd \
+ logd.logpersistd.size=30
+endif
+
+# From system.property
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.telephony.default_network=27 \
+ persist.vendor.ril.use.iccid_to_plmn=1 \
+ persist.vendor.ril.emergencynumber.mode=5
+ #rild.libpath=/system/lib64/libsec-ril.so \
+ #rild.libargs=-d /dev/umts_ipc0
+
+# SIT-RIL Logging setting
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.ril.log_mask=3 \
+ persist.vendor.ril.log.base_dir=/data/vendor/radio/sit-ril \
+ persist.vendor.ril.log.chunk_size=5242880 \
+ persist.vendor.ril.log.num_file=3
+
+# Enable reboot free DSDS
+PRODUCT_PRODUCT_PROPERTIES += \
+ persist.radio.reboot_on_modem_change=false
+
+# Enable Early Camping
+PRODUCT_PRODUCT_PROPERTIES += \
+ persist.vendor.ril.camp_on_earlier=1
+
+# Carrier configuration default location
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.radio.config.carrier_config_dir=/vendor/firmware/carrierconfig
+
+# Set the Bluetooth Class of Device
+# Service Field: 0x5A -> 90
+# Bit 17: Networking
+# Bit 19: Capturing
+# Bit 20: Object Transfer
+# Bit 22: Telephony
+# MAJOR_CLASS: 0x02 -> 2 (Phone)
+# MINOR_CLASS: 0x0C -> 12 (Smart Phone)
+PRODUCT_PRODUCT_PROPERTIES += \
+ bluetooth.device.class_of_device=90,2,12
+
+# Set supported Bluetooth profiles to enabled
+PRODUCT_PRODUCT_PROPERTIES += \
+ bluetooth.profile.asha.central.enabled?=true \
+ bluetooth.profile.a2dp.source.enabled?=true \
+ bluetooth.profile.avrcp.target.enabled?=true \
+ bluetooth.profile.bas.client.enabled?=true \
+ bluetooth.profile.gatt.enabled?=true \
+ bluetooth.profile.hfp.ag.enabled?=true \
+ bluetooth.profile.hid.device.enabled?=true \
+ bluetooth.profile.hid.host.enabled?=true \
+ bluetooth.profile.map.server.enabled?=true \
+ bluetooth.profile.opp.enabled?=true \
+ bluetooth.profile.pan.nap.enabled?=true \
+ bluetooth.profile.pan.panu.enabled?=true \
+ bluetooth.profile.pbap.server.enabled?=true \
+ bluetooth.profile.sap.server.enabled?=true \
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ telephony.active_modems.max_count=2
+
+USE_LASSEN_OEMHOOK := true
+
+# Use for GRIL
+USES_LASSEN_MODEM := true
+
+ifeq ($(USES_GOOGLE_DIALER_CARRIER_SETTINGS),true)
+USE_GOOGLE_DIALER := true
+USE_GOOGLE_CARRIER_SETTINGS := true
+USES_GAUDIO := true
+endif
+
+ifeq (,$(filter aosp_%,$(TARGET_PRODUCT)))
+# Audio client implementation for RIL
+USES_GAUDIO := true
+endif
+
+# ######################
+# GRAPHICS - GPU (begin)
+
+# Must match BOARD_USES_SWIFTSHADER in BoardConfig.mk
+USE_SWIFTSHADER := false
+
+# HWUI
+TARGET_USES_VULKAN = true
+
+PRODUCT_SOONG_NAMESPACES += \
+ vendor/arm/mali/valhall
+
+$(call soong_config_set,pixel_mali,soc,$(TARGET_BOARD_PLATFORM))
+
+include device/google/gs101/neuralnetwork/neuralnetwork.mk
+
+PRODUCT_PACKAGES += \
+ libGLES_mali \
+ vulkan.mali \
+ libOpenCL \
+ libgpudataproducer
+
+PRODUCT_VENDOR_PROPERTIES += \
+ ro.hardware.vulkan=mali
+
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+ debug.mali.disable_backend_affinity=true
+
+ifeq ($(USE_SWIFTSHADER),true)
+PRODUCT_PACKAGES += \
+ libGLESv1_CM_swiftshader \
+ libEGL_swiftshader \
+ libGLESv2_swiftshader
+endif
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.opengles.aep.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.opengles.aep.xml \
+ frameworks/native/data/etc/android.hardware.vulkan.version-1_3.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \
+ frameworks/native/data/etc/android.hardware.vulkan.level-1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level.xml \
+ frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute.xml \
+ frameworks/native/data/etc/android.software.vulkan.deqp.level-2022-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.vulkan.deqp.level.xml \
+ frameworks/native/data/etc/android.software.opengles.deqp.level-2022-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.opengles.deqp.level.xml
+
+ifeq ($(USE_SWIFTSHADER),true)
+PRODUCT_VENDOR_PROPERTIES += \
+ ro.hardware.egl = swiftshader
+else
+PRODUCT_VENDOR_PROPERTIES += \
+ ro.hardware.egl = mali
+endif
+
+PRODUCT_VENDOR_PROPERTIES += \
+ ro.opengles.version=196610 \
+ graphics.gpu.profiler.support=true \
+ debug.renderengine.backend=skiaglthreaded
+
+# GRAPHICS - GPU (end)
+# ####################
+
+# Device Manifest, Device Compatibility Matrix for Treble
+DEVICE_MANIFEST_FILE := \
+ device/google/gs101/manifest$(LOCAL_64ONLY).xml
+
+ifneq (,$(filter aosp_%,$(TARGET_PRODUCT)))
+DEVICE_MANIFEST_FILE += \
+ device/google/gs101/manifest_media_aosp.xml
+
+PRODUCT_COPY_FILES += \
+ device/google/gs101/media_codecs_aosp_c2.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_c2.xml
+else
+DEVICE_MANIFEST_FILE += \
+ device/google/gs101/manifest_media.xml
+
+PRODUCT_COPY_FILES += \
+ device/google/gs101/media_codecs_bo_c2.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_c2.xml \
+ device/google/gs101/media_codecs_aosp_c2.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_aosp_c2.xml
+endif
+
+DEVICE_MATRIX_FILE := \
+ device/google/gs101/compatibility_matrix.xml
+
+DEVICE_PACKAGE_OVERLAYS += device/google/gs101/overlay
+
+# Enforce the Product interface
+PRODUCT_PRODUCT_VNDK_VERSION := current
+PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true
+
+# Init files
+PRODUCT_COPY_FILES += \
+ $(LOCAL_KERNEL):kernel \
+ device/google/gs101/conf/init.gs101.usb.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.gs101.usb.rc \
+ device/google/gs101/conf/ueventd.gs101.rc:$(TARGET_COPY_OUT_VENDOR)/etc/ueventd.rc
+
+PRODUCT_COPY_FILES += \
+ device/google/gs101/conf/init.gs101.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.gs101.rc
+
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_COPY_FILES += \
+ device/google/gs101/conf/init.debug.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.debug.rc
+endif
+
+# If AoC Daemon is not present on this build, load firmware at boot via rc
+ifeq ($(wildcard vendor/google/whitechapel/aoc/aocd),)
+PRODUCT_COPY_FILES += \
+ device/google/gs101/conf/init.aoc.nodaemon.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.aoc.rc
+else
+PRODUCT_COPY_FILES += \
+ device/google/gs101/conf/init.aoc.daemon.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.aoc.rc
+endif
+
+# Recovery files
+PRODUCT_COPY_FILES += \
+ device/google/gs101/conf/init.recovery.device.rc:$(TARGET_COPY_OUT_RECOVERY)/root/init.recovery.gs101.rc
+
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+PRODUCT_SOONG_NAMESPACES += device/google/gs101/conf
+else
+PRODUCT_SOONG_NAMESPACES += device/google/gs101/conf/nomodem
+endif
+
+# Fstab files
+PRODUCT_PACKAGES += \
+ fstab.gs101 \
+ fstab.gs101.vendor_ramdisk \
+ fstab.gs101-fips \
+ fstab.gs101-fips.vendor_ramdisk
+PRODUCT_COPY_FILES += \
+ device/google/gs101/conf/fstab.persist:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.persist
+
+# Shell scripts
+PRODUCT_COPY_FILES += \
+ device/google/gs101/init.insmod.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.insmod.sh \
+ device/google/gs101/disable_contaminant_detection.sh:$(TARGET_COPY_OUT_VENDOR)/bin/hw/disable_contaminant_detection.sh
+
+# insmod files
+PRODUCT_COPY_FILES += \
+ device/google/gs101/init.insmod.gs101.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/init.insmod.gs101.cfg
+
+# For creating dtbo image
+PRODUCT_HOST_PACKAGES += \
+ mkdtimg
+
+PRODUCT_PACKAGES += \
+ messaging
+
+# Contexthub HAL
+PRODUCT_PACKAGES += \
+ android.hardware.contexthub-service.generic
+
+# CHRE tools
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PACKAGES += \
+ chre_power_test_client \
+ chre_test_client
+endif
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.context_hub.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.context_hub.xml
+
+# Enable the CHRE Daemon
+CHRE_USF_DAEMON_ENABLED := true
+PRODUCT_PACKAGES += \
+ chre \
+ preloaded_nanoapps.json
+
+# Filesystem management tools
+PRODUCT_PACKAGES += \
+ linker.vendor_ramdisk \
+ tune2fs.vendor_ramdisk \
+ resize2fs.vendor_ramdisk
+
+# Userdata Checkpointing OTA GC
+PRODUCT_PACKAGES += \
+ checkpoint_gc
+
+# Vendor verbose logging default property
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.verbose_logging_enabled=true
+else
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.verbose_logging_enabled=false
+endif
+
+# CP Logging properties
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.vendor.sys.modem.logging.loc = /data/vendor/slog \
+ persist.vendor.sys.silentlog.tcp = "On" \
+ ro.vendor.cbd.modem_removable = "1" \
+ ro.vendor.cbd.modem_type = "s5100sit" \
+ persist.vendor.sys.modem.logging.br_num=5 \
+ persist.vendor.sys.modem.logging.enable=true
+
+# Enable silent CP crash handling
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.ril.crash_handling_mode=1
+else
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.ril.crash_handling_mode=2
+endif
+
+# Add support dual SIM mode
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.radio.multisim_switch_support=true
+
+# RPMB TA
+PRODUCT_PACKAGES += \
+ tlrpmb
+
+# Touch firmware
+#PRODUCT_COPY_FILES += \
+ device/google/gs101/firmware/touch/s6sy761.bin:$(TARGET_COPY_OUT_VENDOR)/firmware/s6sy761.fw
+# Touch
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml
+
+# Sensors
+ifneq (,$(findstring tangor, $(TARGET_PRODUCT)))
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \
+ frameworks/native/data/etc/android.hardware.sensor.compass.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.compass.xml \
+ frameworks/native/data/etc/android.hardware.sensor.dynamic.head_tracker.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.dynamic.head_tracker.xml \
+ frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \
+ frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml\
+ frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \
+ frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml
+else
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \
+ frameworks/native/data/etc/android.hardware.sensor.barometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.barometer.xml \
+ frameworks/native/data/etc/android.hardware.sensor.compass.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.compass.xml \
+ frameworks/native/data/etc/android.hardware.sensor.dynamic.head_tracker.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.dynamic.head_tracker.xml \
+ frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \
+ frameworks/native/data/etc/android.hardware.sensor.hifi_sensors.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.hifi_sensors.xml \
+ frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml\
+ frameworks/native/data/etc/android.hardware.sensor.proximity.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.proximity.xml \
+ frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \
+ frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml
+endif
+
+# Add sensor HAL 2.1 product packages
+PRODUCT_PACKAGES += android.hardware.sensors@2.1-service.multihal
+
+# USB HAL
+PRODUCT_PACKAGES += \
+ android.hardware.usb-service.gs101
+PRODUCT_PACKAGES += \
+ android.hardware.usb.gadget-service.gs101
+
+# MIDI feature
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.software.midi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.midi.xml
+
+# default usb debug functions
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.usb.usbradio.config=dm
+endif
+
+# Power HAL
+PRODUCT_COPY_FILES += \
+ device/google/gs101/task_profiles.json:$(TARGET_COPY_OUT_VENDOR)/etc/task_profiles.json
+# Legacy HW
+PRODUCT_COPY_FILES += \
+ device/google/gs101/powerhint_a0.json:$(TARGET_COPY_OUT_VENDOR)/etc/powerhint_a0.json
+PRODUCT_COPY_FILES += \
+ device/google/gs101/powerhint_a1.json:$(TARGET_COPY_OUT_VENDOR)/etc/powerhint_a1.json
+-include hardware/google/pixel/power-libperfmgr/aidl/device.mk
+
+# IRQ rebalancing.
+include hardware/google/pixel/rebalance_interrupts/rebalance_interrupts.mk
+
+# PowerStats HAL
+PRODUCT_PACKAGES += \
+ android.hardware.power.stats-service.pixel
+
+# dumpstate HAL
+PRODUCT_PACKAGES += \
+ android.hardware.dumpstate@1.1-service.gs101
+
+# AoC support
+PRODUCT_PACKAGES += \
+ aocd
+
+# AoC debug support
+PRODUCT_PACKAGES_DEBUG += \
+ aocdump \
+ aocutil \
+ aoc_audio_cfg \
+ vp_util
+
+#
+# Audio HALs
+#
+
+# Audio Configurations
+USE_LEGACY_LOCAL_AUDIO_HAL := false
+USE_XML_AUDIO_POLICY_CONF := 1
+
+# Enable AAudio MMAP/NOIRQ data path.
+PRODUCT_PROPERTY_OVERRIDES += aaudio.mmap_policy=2
+PRODUCT_PROPERTY_OVERRIDES += aaudio.mmap_exclusive_policy=2
+PRODUCT_PROPERTY_OVERRIDES += aaudio.hw_burst_min_usec=2000
+
+# Calliope firmware overwrite
+#PRODUCT_COPY_FILES += \
+ device/google/gs101/firmware/calliope_dram.bin:$(TARGET_COPY_OUT_VENDOR)/firmware/calliope_dram.bin \
+ device/google/gs101/firmware/calliope_sram.bin:$(TARGET_COPY_OUT_VENDOR)/firmware/calliope_sram.bin \
+ device/google/gs101/firmware/calliope_dram_2.bin:$(TARGET_COPY_OUT_VENDOR)/firmware/calliope_dram_2.bin \
+ device/google/gs101/firmware/calliope_sram_2.bin:$(TARGET_COPY_OUT_VENDOR)/firmware/calliope_sram_2.bin \
+ device/google/gs101/firmware/calliope2.dt:$(TARGET_COPY_OUT_VENDOR)/firmware/calliope2.dt \
+
+# Cannot reference variables defined in BoardConfig.mk, uncomment this if
+# BOARD_USE_OFFLOAD_AUDIO and BOARD_USE_OFFLOAD_EFFECT are true
+## AudioEffectHAL library
+#PRODUCT_PACKAGES += \
+# libexynospostprocbundle
+
+# Cannot reference variables defined in BoardConfig.mk, uncomment this if
+# BOARD_USE_SOUNDTRIGGER_HAL is true
+#PRODUCT_PACKAGES += \
+# sound_trigger.primary.maran9820
+
+# A-Box Service Daemon
+#PRODUCT_PACKAGES += main_abox
+
+# Libs
+PRODUCT_PACKAGES += \
+ com.android.future.usb.accessory
+
+# for now include gralloc here. should come from hardware/google_devices/exynos5
+PRODUCT_PACKAGES += \
+ android.hardware.graphics.mapper@4.0-impl \
+ android.hardware.graphics.allocator-V1-service
+
+PRODUCT_PACKAGES += \
+ android.hardware.memtrack-service.pixel \
+ libion_exynos \
+ libion
+
+PRODUCT_PACKAGES += \
+ libhwjpeg
+
+# Video Editor
+PRODUCT_PACKAGES += \
+ VideoEditorGoogle
+
+# WideVine modules
+PRODUCT_PACKAGES += \
+ android.hardware.drm-service.clearkey \
+ android.hardware.drm-service.widevine \
+ liboemcrypto \
+
+
+
+$(call soong_config_set,google3a_config,soc,gs101)
+$(call soong_config_set,google3a_config,gcam_awb,true)
+$(call soong_config_set,google3a_config,ghawb_truetone,true)
+
+# Determine if Lyric is in the tree, and only have GCH build against it
+# if it is. Cases when Lyric isn't going to be in the tree:
+# - Non-pixel gs101 devices that exclude vendor/google/services/LyricCameraHAL/src (none as of now)
+# - master-without-vendor and other types of AOSP builds (those won't built GCH either, but need this to actually start building)
+#
+# Builds that will have it are
+# - Regular gs101 builds
+# - PDK gs101 builds because they still have vendor/google/services/LyricCameraHAL/src
+
+ifneq ($(wildcard vendor/google/services/LyricCameraHAL/src),)
+$(call soong_config_set,lyric,soc,gs101)
+$(call soong_config_set,lyric,use_lyric_camera_hal,true)
+# lyric::tuning_product is set in device-specific makefiles,
+# such as device/google/raviole/device-oriole.mk
+
+# Camera HAL library selection
+$(call soong_config_set,gch,hwl_library,lyric)
+endif
+
+# WiFi
+PRODUCT_PACKAGES += \
+ android.hardware.wifi@1.0-service \
+ wificond \
+ libwpa_client \
+ WifiOverlay \
+
+# Connectivity
+PRODUCT_PACKAGES += \
+ ConnectivityOverlay
+
+PRODUCT_PACKAGES_DEBUG += \
+ sg_write_buffer \
+ f2fs_io \
+ check_f2fs \
+ f2fsstat \
+ f2fs.fibmap \
+ dump.f2fs
+
+# Storage health HAL
+PRODUCT_PACKAGES += \
+ android.hardware.health.storage-service.default
+
+# storage pixelstats
+-include hardware/google/pixel/pixelstats/device.mk
+
+# Enable project quotas and casefolding for emulated storage without sdcardfs
+$(call inherit-product, $(SRC_TARGET_DIR)/product/emulated_storage.mk)
+
+$(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression_with_xor.mk)
+# Enforce generic ramdisk allow list
+$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
+
+# Titan-M
+ifeq (,$(filter true, $(BOARD_WITHOUT_DTLS)))
+include hardware/google/pixel/dauntless/dauntless.mk
+endif
+
+# Copy Camera HFD Setfiles
+#PRODUCT_COPY_FILES += \
+ device/google/gs101/firmware/camera/libhfd/default_configuration.hfd.cfg.json:$(TARGET_COPY_OUT_VENDOR)/firmware/default_configuration.hfd.cfg.json \
+ device/google/gs101/firmware/camera/libhfd/pp_cfg.json:$(TARGET_COPY_OUT_VENDOR)/firmware/pp_cfg.json \
+ device/google/gs101/firmware/camera/libhfd/tracker_cfg.json:$(TARGET_COPY_OUT_VENDOR)/firmware/tracker_cfg.json \
+ device/google/gs101/firmware/camera/libhfd/WithLightFixNoBN.SDNNmodel:$(TARGET_COPY_OUT_VENDOR)/firmware/WithLightFixNoBN.SDNNmodel
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml \
+ frameworks/native/data/etc/android.hardware.wifi.direct.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \
+ frameworks/native/data/etc/android.hardware.wifi.aware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.aware.xml \
+ frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml \
+ frameworks/native/data/etc/android.hardware.wifi.rtt.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.rtt.xml \
+ frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \
+ frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml
+
+# (See b/211840489)
+ifneq ($(DISABLE_CAMERA_FS_AF),true)
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml
+else
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.camera.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.xml
+endif
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \
+ frameworks/native/data/etc/android.hardware.camera.concurrent.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.concurrent.xml \
+ frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml\
+ frameworks/native/data/etc/android.hardware.camera.raw.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.raw.xml\
+ vendor/google/services/LyricCameraHAL/src/vendor.android.hardware.camera.preview-dis.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/vendor.android.hardware.camera.preview-dis.xml\
+ vendor/google/services/LyricCameraHAL/src/vendor.android.hardware.camera.stream-usecase.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/vendor.android.hardware.camera.stream-usecase.xml\
+
+#PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml \
+ frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml \
+ frameworks/native/data/etc/android.hardware.wifi.direct.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \
+ frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml \
+ frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \
+ frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.audio.low_latency.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.low_latency.xml \
+ frameworks/native/data/etc/android.hardware.audio.pro.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.pro.xml \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.software.ipsec_tunnels.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.ipsec_tunnels.xml \
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ debug.slsi_platform=1 \
+ debug.hwc.winupdate=1
+
+# hw composer HAL
+PRODUCT_PACKAGES += \
+ libdisplaycolor \
+ hwcomposer.$(TARGET_BOARD_PLATFORM)
+
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PACKAGES += displaycolor_service
+endif
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ debug.sf.disable_backpressure=0 \
+ debug.sf.enable_gl_backpressure=1
+
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.use_phase_offsets_as_durations=1
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.late.sf.duration=10500000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.late.app.duration=16600000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.early.sf.duration=16600000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.early.app.duration=16600000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.earlyGl.sf.duration=16600000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.earlyGl.app.duration=16600000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.frame_rate_multiple_threshold=120
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.layer_caching_active_layer_timeout_ms=1000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += debug.sf.treat_170m_as_sRGB=1
+
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.enable_layer_caching=true
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.set_idle_timer_ms?=80
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.set_touch_timer_ms=200
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.set_display_power_timer_ms=1000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.use_content_detection_for_refresh_rate=true
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.max_frame_buffer_acquired_buffers=3
+
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.supports_background_blur=1
+PRODUCT_SYSTEM_PROPERTIES += ro.launcher.blur.appLaunch=0
+
+# Must align with HAL types Dataspace
+# The data space of wide color gamut composition preference is Dataspace::DISPLAY_P3
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.wcg_composition_dataspace=143261696
+
+# Display
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_wide_color_display=true
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_HDR_display=true
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.use_color_management=true
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.protected_contents=true
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.display_update_imminent_timeout_ms=50
+
+# force to blend in P3 mode
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.sys.sf.native_mode=2 \
+ persist.sys.sf.color_mode=9
+PRODUCT_COPY_FILES += \
+ device/google/gs101/display/display_colordata_cal0.pb:$(TARGET_COPY_OUT_VENDOR)/etc/display_colordata_cal0.pb
+
+# limit DPP downscale ratio
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += vendor.hwc.dpp.downscale=2
+
+# Cannot reference variables defined in BoardConfig.mk, uncomment this if
+# BOARD_USES_EXYNOS_DSS_FEATURE is true
+## set the dss enable status setup
+#PRODUCT_PROPERTY_OVERRIDES += \
+# ro.exynos.dss=1
+
+# Cannot reference variables defined in BoardConfig.mk, uncomment this if
+# BOARD_USES_EXYNOS_AFBC_FEATURE is true
+# set the dss enable status setup
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.vendor.ddk.set.afbc=1
+
+PRODUCT_CHARACTERISTICS := nosdcard
+
+# WPA SUPPLICANT
+PRODUCT_COPY_FILES += \
+ device/google/gs101/wifi/p2p_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/p2p_supplicant_overlay.conf \
+ device/google/gs101/wifi/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf
+
+# WIFI COEX
+PRODUCT_COPY_FILES += \
+ device/google/gs101/wifi/coex_table.xml:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/coex_table.xml
+
+PRODUCT_PACKAGES += hostapd
+PRODUCT_PACKAGES += wpa_supplicant
+PRODUCT_PACKAGES += wpa_supplicant.conf
+
+WIFI_PRIV_CMD_UPDATE_MBO_CELL_STATUS := enabled
+
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PACKAGES += wpa_cli
+PRODUCT_PACKAGES += hostapd_cli
+endif
+
+####################################
+## VIDEO
+####################################
+
+$(call soong_config_set,bigo,soc,gs101)
+
+# 1. Codec 2.0
+# exynos service
+PRODUCT_SOONG_NAMESPACES += vendor/samsung_slsi/codec2
+
+PRODUCT_COPY_FILES += \
+ device/google/gs101/media_codecs_performance_c2.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_performance_c2.xml \
+
+PRODUCT_PACKAGES += \
+ samsung.hardware.media.c2@1.0-service \
+ codec2.vendor.base.policy \
+ codec2.vendor.ext.policy \
+ libExynosC2ComponentStore \
+ libExynosC2H264Dec \
+ libExynosC2H264Enc \
+ libExynosC2HevcDec \
+ libExynosC2HevcEnc \
+ libExynosC2Mpeg4Dec \
+ libExynosC2Mpeg4Enc \
+ libExynosC2H263Dec \
+ libExynosC2H263Enc \
+ libExynosC2Vp8Dec \
+ libExynosC2Vp8Enc \
+ libExynosC2Vp9Dec \
+ libExynosC2Vp9Enc
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ debug.stagefright.c2-poolmask=458752 \
+ debug.c2.use_dmabufheaps=1 \
+ media.c2.dmabuf.padding=512 \
+ debug.stagefright.ccodec_delayed_params=1 \
+ ro.vendor.gpu.dataspace=1
+
+# Create input surface on the framework side
+PRODUCT_PROPERTY_OVERRIDES += \
+ debug.stagefright.c2inputsurface=-1 \
+
+# 2. OpenMAX IL
+PRODUCT_COPY_FILES += \
+ device/google/gs101/media_codecs.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs.xml \
+ device/google/gs101/media_codecs_performance.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_performance.xml
+####################################
+
+# Telephony
+#PRODUCT_COPY_FILES += \
+ frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_telephony.xml
+
+# CBD (CP booting deamon)
+CBD_USE_V2 := true
+CBD_PROTOCOL_SIT := true
+
+# setup dalvik vm configs.
+$(call inherit-product, frameworks/native/build/phone-xhdpi-6144-dalvik-heap.mk)
+
+PRODUCT_TAGS += dalvik.gc.type-precise
+
+# Exynos OpenVX framework
+PRODUCT_PACKAGES += \
+ libexynosvision
+
+ifeq ($(TARGET_USES_CL_KERNEL),true)
+PRODUCT_PACKAGES += \
+ libopenvx-opencl
+endif
+
+# GPS HAL
+ifeq (,$(filter tangor citron,$(subst _, ,$(TARGET_PRODUCT))))
+include device/google/gs101/gnss/device-gnss.mk
+endif
+
+# Trusty (KM, GK, Storage)
+$(call inherit-product, system/core/trusty/trusty-storage.mk)
+$(call inherit-product, system/core/trusty/trusty-base.mk)
+
+# Trusty unit test tool
+PRODUCT_PACKAGES_DEBUG += trusty-ut-ctrl
+
+include device/google/gs101/confirmationui/confirmationui.mk
+
+include device/google/gs101/trusty_metricsd/trusty_metricsd.mk
+
+PRODUCT_PACKAGES += \
+ android.hardware.graphics.composer@2.4-impl \
+ android.hardware.graphics.composer@2.4-service
+
+# Storage: for factory reset protection feature
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.frp.pst=/dev/block/by-name/frp
+
+# Bluetooth
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
+ frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml
+
+# System props to enable Bluetooth Quality Report (BQR) feature
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PRODUCT_PROPERTIES += \
+ persist.bluetooth.bqr.event_mask=262174 \
+ persist.bluetooth.bqr.min_interval_ms=500
+else
+PRODUCT_PRODUCT_PROPERTIES += \
+ persist.bluetooth.bqr.event_mask=30 \
+ persist.bluetooth.bqr.min_interval_ms=500
+endif
+
+#VNDK
+PRODUCT_PACKAGES += \
+ vndk-libs
+
+PRODUCT_ENFORCE_RRO_TARGETS := \
+ framework-res
+
+# Dynamic Partitions
+PRODUCT_USE_DYNAMIC_PARTITIONS := true
+
+# Use FUSE passthrough
+PRODUCT_PRODUCT_PROPERTIES += \
+ persist.sys.fuse.passthrough.enable=true
+
+# Use FUSE BPF
+PRODUCT_PRODUCT_PROPERTIES += \
+ ro.fuse.bpf.enabled=false
+
+# Use /product/etc/fstab.postinstall to mount system_other
+PRODUCT_PRODUCT_PROPERTIES += \
+ ro.postinstall.fstab.prefix=/product
+
+PRODUCT_COPY_FILES += \
+ device/google/gs101/conf/fstab.postinstall:$(TARGET_COPY_OUT_PRODUCT)/etc/fstab.postinstall
+
+# fastbootd
+PRODUCT_PACKAGES += \
+ android.hardware.fastboot@1.1-impl.pixel \
+ fastbootd
+
+#google iwlan
+PRODUCT_PACKAGES += \
+ Iwlan
+
+#Iwlan test app for userdebug/eng builds
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PACKAGES += \
+ IwlanTestApp
+endif
+
+PRODUCT_PACKAGES += \
+ whitelist \
+ libstagefright_hdcp \
+ libskia_opt
+
+#PRODUCT_PACKAGES += \
+ mfc_fw.bin \
+ calliope_sram.bin \
+ calliope_dram.bin \
+ calliope_iva.bin \
+ vts.bin
+
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+# This will be called only if IMSService is building with source code for dev branches.
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/shannon-ims/device-vendor.mk)
+
+PRODUCT_PACKAGES += ShannonIms
+
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/shannon-iwlan/device-vendor.mk)
+
+#RCS Test Messaging App
+PRODUCT_PACKAGES_DEBUG += \
+ TestRcsApp
+
+PRODUCT_PACKAGES += ShannonRcs
+endif
+
+# Boot Control HAL
+PRODUCT_PACKAGES += \
+ android.hardware.boot@1.2-impl-gs101 \
+ android.hardware.boot@1.2-service-gs101
+
+# Exynos RIL and telephony
+# Multi SIM(DSDS)
+SIM_COUNT := 2
+SUPPORT_MULTI_SIM := true
+# Support NR
+SUPPORT_NR := true
+# Using IRadio 1.6
+USE_RADIO_HAL_1_6 := true
+
+#$(call inherit-product, vendor/google_devices/telephony/common/device-vendor.mk)
+#$(call inherit-product, vendor/google_devices/gs101/proprietary/device-vendor.mk)
+
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+$(call inherit-product-if-exists, vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/common/device-vendor.mk)
+endif
+
+ifeq ($(DEVICE_IS_64BIT_ONLY),true)
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk)
+else
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
+endif
+#$(call inherit-product, hardware/google_devices/exynos5/exynos5.mk)
+#$(call inherit-product-if-exists, hardware/google_devices/gs101/gs101.mk)
+#$(call inherit-product-if-exists, vendor/google_devices/common/exynos-vendor.mk)
+#$(call inherit-product-if-exists, hardware/broadcom/wlan/bcmdhd/firmware/bcm4375/device-bcm.mk)
+ifeq ($(wildcard vendor/google/sensors/usf),)
+$(call inherit-product-if-exists, vendor/google_devices/gs101/proprietary/usf/usf_product.mk)
+else
+$(call inherit-product-if-exists, vendor/google/sensors/usf/android/usf_efw_product.mk)
+endif
+$(call inherit-product-if-exists, vendor/google/services/LyricCameraHAL/src/build/device-vendor.mk)
+$(call inherit-product-if-exists, vendor/google/camera/devices/whi/device-vendor.mk)
+
+PRODUCT_COPY_FILES += \
+ device/google/gs101/default-permissions.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/default-permissions/default-permissions.xml \
+ device/google/gs101/component-overrides.xml:$(TARGET_COPY_OUT_VENDOR)/etc/sysconfig/component-overrides.xml
+
+# modem_svc_sit daemon
+PRODUCT_PACKAGES += modem_svc_sit
+
+# modem logging binary/configs
+PRODUCT_PACKAGES += modem_logging_control
+
+# modem logging configs
+PRODUCT_COPY_FILES += \
+ device/google/gs101/radio/config/logging.conf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/logging.conf \
+ device/google/gs101/radio/config/default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default.cfg \
+ device/google/gs101/radio/config/default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default.nprf \
+ device/google/gs101/radio/config/default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_metrics.xml \
+ device/google/gs101/radio/config/teamfood_default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default.cfg \
+ device/google/gs101/radio/config/teamfood_default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default.nprf \
+ device/google/gs101/radio/config/teamfood_default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/teamfood_default_metrics.xml \
+ device/google/gs101/radio/config/default_stability.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_stability.cfg \
+ device/google/gs101/radio/config/default_stability.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_stability.nprf \
+ device/google/gs101/radio/config/default_NAS_RRC.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_NAS_RRC.cfg \
+ device/google/gs101/radio/config/default_NAS_RRC.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_NAS_RRC.nprf \
+ device/google/gs101/radio/config/default_network.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_network.cfg \
+ device/google/gs101/radio/config/default_network.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/default_network.nprf \
+ device/google/gs101/radio/config/Pixel_Default.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default.cfg \
+ device/google/gs101/radio/config/Pixel_Default.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default.nprf \
+ device/google/gs101/radio/config/Pixel_Default_metrics.xml:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_Default_metrics.xml \
+ device/google/gs101/radio/config/Pixel_stability.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_stability.cfg \
+ device/google/gs101/radio/config/Pixel_stability.nprf:$(TARGET_COPY_OUT_VENDOR)/etc/modem/Pixel_stability.nprf
+
+PRODUCT_COPY_FILES += \
+ device/google/gs101/radio/gnss_blanking.csv:$(TARGET_COPY_OUT_VENDOR)/etc/modem/gnss_blanking.csv
+
+# ARM NN files
+ARM_COMPUTE_CL_ENABLE := 1
+
+# Vibrator Diag
+PRODUCT_PACKAGES_DEBUG += \
+ diag-vibrator \
+ diag-vibrator-cs40l25a \
+ diag-vibrator-drv2624 \
+ $(NULL)
+
+PRODUCT_PACKAGES += \
+ android.hardware.health-service.gs101 \
+ android.hardware.health-service.gs101_recovery \
+
+# Audio
+# Audio HAL Server & Default Implementations
+PRODUCT_PACKAGES += \
+ android.hardware.audio.service \
+ android.hardware.audio@7.1-impl \
+ android.hardware.audio.effect@7.0-impl \
+ android.hardware.bluetooth.audio-impl \
+ android.hardware.soundtrigger@2.3-impl \
+ vendor.google.whitechapel.audio.audioext@4.0-impl
+
+#Audio HAL libraries
+PRODUCT_PACKAGES += \
+ audio.primary.$(TARGET_BOARD_PLATFORM) \
+ audio.platform.aoc \
+ sound_trigger.primary.$(TARGET_BOARD_PLATFORM) \
+ audio_bt_aoc \
+ audio_tunnel_aoc \
+ aoc_aud_ext \
+ libaoctuningdecoder \
+ libaoc_waves \
+ liboffloadeffect \
+ audio_waves_aoc \
+ audio_fortemedia_aoc \
+ audio_bluenote_aoc \
+ audio_usb_aoc \
+ audio_spk_35l41 \
+ audio.usb.default \
+ audio.usbv2.default \
+ audio.bluetooth.default \
+ audio.r_submix.default \
+ libamcsextfile \
+ audio_amcs_ext \
+
+
+#Audio Vendor libraries
+PRODUCT_PACKAGES += \
+ libfvsam_prm_parser \
+ libmahalcontroller \
+ libAlgFx_HiFi3z
+
+# AudioHAL Configurations
+PRODUCT_COPY_FILES += \
+ frameworks/av/services/audiopolicy/config/a2dp_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_audio_policy_configuration_7_0.xml \
+ frameworks/av/services/audiopolicy/config/a2dp_in_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_in_audio_policy_configuration_7_0.xml \
+ frameworks/av/services/audiopolicy/config/bluetooth_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_audio_policy_configuration_7_0.xml \
+ frameworks/av/services/audiopolicy/config/hearing_aid_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/hearing_aid_audio_policy_configuration_7_0.xml \
+ frameworks/av/services/audiopolicy/config/r_submix_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/r_submix_audio_policy_configuration.xml \
+ frameworks/av/services/audiopolicy/config/usb_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/usb_audio_policy_configuration.xml \
+ frameworks/av/services/audiopolicy/config/audio_policy_volumes.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_volumes.xml \
+ frameworks/av/services/audiopolicy/config/default_volume_tables.xml:$(TARGET_COPY_OUT_VENDOR)/etc/default_volume_tables.xml \
+
+#Audio soong
+PRODUCT_SOONG_NAMESPACES += \
+ vendor/google/whitechapel/audio/hal \
+ vendor/google/whitechapel/audio/interfaces
+
+$(call soong_config_set,aoc_audio_board,platform,$(TARGET_BOARD_PLATFORM))
+
+## AoC soong
+PRODUCT_SOONG_NAMESPACES += \
+ vendor/google/whitechapel/aoc
+
+$(call soong_config_set,aoc,target_soc,$(TARGET_BOARD_PLATFORM))
+$(call soong_config_set,aoc,target_product,$(TARGET_PRODUCT))
+
+$(call soong_config_set,android_hardware_audio,run_64bit,true)
+
+# Audio properties
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.config.vc_call_vol_steps=7 \
+ ro.config.media_vol_steps=25 \
+ ro.audio.monitorRotation = true \
+ ro.audio.offload_wakelock=false
+
+# declare use of spatial audio
+# PRODUCT_PROPERTY_OVERRIDES += \
+# ro.audio.spatializer_enabled=true
+
+ifeq (,$(filter aosp_%,$(TARGET_PRODUCT)))
+# IAudioMetricExt HIDL
+PRODUCT_PACKAGES += \
+ vendor.google.audiometricext@1.0-service-vendor
+endif
+
+# vndservicemanager and vndservice no longer included in API 30+, however needed by vendor code.
+# See b/148807371 for reference
+PRODUCT_PACKAGES += vndservicemanager
+PRODUCT_PACKAGES += vndservice
+
+# TinyTools, debug tool and cs35l41 speaker calibration tool for Audio
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+PRODUCT_PACKAGES += \
+ tinyplay \
+ tinycap \
+ tinymix \
+ tinypcminfo \
+ tinyhostless \
+ cplay \
+ aoc_hal \
+ aoc_tuning_inft \
+ crus_sp_cal \
+ mahal_test \
+ ma_aoc_tuning_test
+endif
+
+PRODUCT_PACKAGES += \
+ google.hardware.media.c2@1.0-service \
+ libgc2_store \
+ libgc2_base \
+ libgc2_av1_dec \
+ libbo_av1 \
+ libgc2_cwl \
+ libgc2_utils
+
+# Thermal HAL
+include hardware/google/pixel/thermal/device.mk
+PRODUCT_PROPERTY_OVERRIDES += persist.vendor.enable.thermal.genl=true
+
+include device/google/gs101/edgetpu/edgetpu.mk
+
+# Connectivity Thermal Power Manager
+PRODUCT_PACKAGES += \
+ ConnectivityThermalPowerManager
+
+# A/B support
+PRODUCT_PACKAGES += \
+ otapreopt_script \
+ cppreopts.sh \
+ update_engine \
+ update_engine_sideload \
+ update_verifier
+
+# pKVM
+$(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk)
+PRODUCT_BUILD_PVMFW_IMAGE := true
+ifeq ($(TARGET_PKVM_ENABLED),true)
+ PRODUCT_PACKAGES += pkvm_enabler
+else
+ PRODUCT_COPY_FILES += \
+ device/google/gs101/pkvm/pkvm_experiment.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/pkvm_experiment.rc
+endif
+
+# Enable watchdog timeout loop breaker.
+PRODUCT_PROPERTY_OVERRIDES += \
+ framework_watchdog.fatal_window.second=600 \
+ framework_watchdog.fatal_count=3
+
+# Enable zygote critical window.
+PRODUCT_PROPERTY_OVERRIDES += \
+ zygote.critical_window.minute=10
+
+# Suspend properties
+# (b/171433995): Enable short suspend backoffs and reduce max backoff time
+PRODUCT_PROPERTY_OVERRIDES += \
+ suspend.short_suspend_threshold_millis=2000 \
+ suspend.short_suspend_backoff_enabled=true \
+ suspend.max_sleep_time_millis=40000
+
+# Enable Incremental on the device
+PRODUCT_PROPERTY_OVERRIDES += \
+ ro.incremental.enable=true
+
+# Project
+include hardware/google/pixel/common/pixel-common-device.mk
+
+# Pixel Logger
+include hardware/google/pixel/PixelLogger/PixelLogger.mk
+
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+# Telephony
+include device/google/gs101/telephony/user.mk
+endif
+
+# Wifi ext
+include hardware/google/pixel/wifi_ext/device.mk
+
+# Battery Stats Viewer
+PRODUCT_PACKAGES_DEBUG += BatteryStatsViewer
+
+# Install product specific framework compatibility matrix
+# (TODO: b/169535506) This includes the FCM for system_ext and product partition.
+# It must be split into the FCM of each partition.
+DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE := device/google/gs101/device_framework_matrix_product.xml
+
+# Preopt SystemUI
+PRODUCT_DEXPREOPT_SPEED_APPS += SystemUIGoogle # For internal
+PRODUCT_DEXPREOPT_SPEED_APPS += SystemUI # For AOSP
+
+# Compile SystemUI on device with `speed`.
+PRODUCT_PROPERTY_OVERRIDES += \
+ dalvik.vm.systemuicompilerfilter=speed
+
+# Keymaster configuration
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.software.device_id_attestation.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.device_id_attestation.xml \
+ frameworks/native/data/etc/android.hardware.device_unique_attestation.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.device_unique_attestation.xml
+
+# Use 64-bit dex2oat for better dexopt time.
+PRODUCT_PROPERTY_OVERRIDES += \
+ dalvik.vm.dex2oat64.enabled=true
+
+# Call deleteAllKeys if vold detects a factory reset
+PRODUCT_VENDOR_PROPERTIES += ro.crypto.metadata_init_delete_all_keys.enabled=true
diff --git a/device_framework_matrix_product.xml b/device_framework_matrix_product.xml
new file mode 100644
index 00000000..c037a4a4
--- /dev/null
+++ b/device_framework_matrix_product.xml
@@ -0,0 +1,197 @@
+<compatibility-matrix version="1.0" type="framework" level="6">
+ <hal format="hidl" optional="true">
+ <name>android.hardware.radio</name>
+ <version>1.2</version>
+ <interface>
+ <name>ISap</name>
+ <instance>slot2</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
+ <name>android.hardware.vibrator</name>
+ <version>2</version>
+ <interface>
+ <name>IVibrator</name>
+ <instance>dual</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>android.vendor.samsung_slsi.telephony.hardware.radio</name>
+ <version>1.1</version>
+ <interface>
+ <name>IOemSamsungslsi</name>
+ <instance>slot1</instance>
+ <instance>slot2</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>com.fingerprints42.extension</name>
+ <version>1.0</version>
+ <interface>
+ <name>IFingerprintAuthenticator</name>
+ <instance>default</instance>
+ </interface>
+ <interface>
+ <name>IFingerprintCalibration</name>
+ <instance>default</instance>
+ </interface>
+ <interface>
+ <name>IFingerprintEngineering</name>
+ <instance>default</instance>
+ </interface>
+ <interface>
+ <name>IFingerprintNavigation</name>
+ <instance>default</instance>
+ </interface>
+ <interface>
+ <name>IFingerprintRecalibration</name>
+ <instance>default</instance>
+ </interface>
+ <interface>
+ <name>IFingerprintSenseTouch</name>
+ <instance>default</instance>
+ </interface>
+ <interface>
+ <name>IFingerprintSensorTest</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
+ <name>com.google.face.debug</name>
+ <version>2</version>
+ <interface>
+ <name>IDebugHost</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
+ <name>com.google.edgetpu</name>
+ <version>2</version>
+ <interface>
+ <name>IEdgeTpuVendorService</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
+ <name>com.google.hardware.pixel.display</name>
+ <version>7</version>
+ <interface>
+ <name>IDisplay</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
+ <name>com.google.input</name>
+ <interface>
+ <name>ITouchContextService</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>hardware.google.bluetooth.bt_channel_avoidance</name>
+ <version>1.0</version>
+ <interface>
+ <name>IBTChannelAvoidance</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>hardware.google.bluetooth.sar</name>
+ <version>1.1</version>
+ <interface>
+ <name>IBluetoothSar</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>hardware.google.bluetooth.ext</name>
+ <version>1.0</version>
+ <interface>
+ <name>IBluetoothExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>hardware.google.bluetooth.ccc</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IBluetoothCcc</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
+ <name>hardware.qorvo.uwb</name>
+ <version>2</version>
+ <interface>
+ <name>IUwbVendor</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>vendor.goodix.hardware.biometrics.fingerprint</name>
+ <version>2.1</version>
+ <interface>
+ <name>IGoodixFingerprintDaemon</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl" optional="true">
+ <name>vendor.google.google_battery</name>
+ <version>2</version>
+ <interface>
+ <name>IGoogleBattery</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>vendor.google.radioext</name>
+ <version>1.3</version>
+ <interface>
+ <name>IRadioExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>vendor.google.whitechapel.audio.audioext</name>
+ <version>4.0</version>
+ <interface>
+ <name>IAudioExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>vendor.google.wifi_ext</name>
+ <version>1.3</version>
+ <interface>
+ <name>IWifiExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>vendor.samsung_slsi.telephony.hardware.oemservice</name>
+ <version>1.0</version>
+ <interface>
+ <name>IOemService</name>
+ <instance>dm0</instance>
+ <instance>dm1</instance>
+ <instance>sced0</instance>
+ </interface>
+ </hal>
+ <hal format="hidl" optional="true">
+ <name>vendor.samsung_slsi.telephony.hardware.radioExternal</name>
+ <version>1.1</version>
+ <interface>
+ <name>IOemSlsiRadioExternal</name>
+ <instance>rilExternal</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>vendor.google.audiometricext</name>
+ <version>1.0</version>
+ <interface>
+ <name>IAudioMetricExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</compatibility-matrix>
diff --git a/device_framework_matrix_product_wireless.xml b/device_framework_matrix_product_wireless.xml
new file mode 100644
index 00000000..8b27097c
--- /dev/null
+++ b/device_framework_matrix_product_wireless.xml
@@ -0,0 +1,10 @@
+<compatibility-matrix version="1.0" type="framework" level="6">
+ <hal format="hidl" optional="true">
+ <name>vendor.google.wireless_charger</name>
+ <version>1.3</version>
+ <interface>
+ <name>IWirelessCharger</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</compatibility-matrix>
diff --git a/disable_contaminant_detection.sh b/disable_contaminant_detection.sh
new file mode 100755
index 00000000..97ae794a
--- /dev/null
+++ b/disable_contaminant_detection.sh
@@ -0,0 +1,3 @@
+#!/vendor/bin/sh
+
+echo 0 > "$(find /sys/devices/platform/10d50000.hsi2c -name contaminant_detection)"
diff --git a/display/display_colordata_cal0.pb b/display/display_colordata_cal0.pb
new file mode 100644
index 00000000..1bef374b
--- /dev/null
+++ b/display/display_colordata_cal0.pb
Binary files differ
diff --git a/dumpstate/Android.mk b/dumpstate/Android.mk
new file mode 100644
index 00000000..d9fee2c0
--- /dev/null
+++ b/dumpstate/Android.mk
@@ -0,0 +1,47 @@
+#
+# 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.
+#
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+LOCAL_MODULE := android.hardware.dumpstate@1.1-service.gs101
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../NOTICE
+LOCAL_INIT_RC := android.hardware.dumpstate@1.1-service.gs101.rc
+LOCAL_MODULE_RELATIVE_PATH := hw
+
+LOCAL_SRC_FILES := \
+ DumpstateDevice.cpp \
+ service.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ android.hardware.dumpstate@1.0 \
+ android.hardware.dumpstate@1.1 \
+ libbase \
+ libcutils \
+ libdumpstateutil \
+ libhidlbase \
+ libhidltransport \
+ libhwbinder \
+ liblog \
+ libutils
+
+LOCAL_CFLAGS := -Werror -Wall
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_PROPRIETARY_MODULE := true
+
+include $(BUILD_EXECUTABLE)
diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp
new file mode 100644
index 00000000..f8ee8e3f
--- /dev/null
+++ b/dumpstate/DumpstateDevice.cpp
@@ -0,0 +1,1307 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "dumpstate_device"
+
+#include <inttypes.h>
+
+#include <android-base/file.h>
+#include <android-base/stringprintf.h>
+#include <android-base/properties.h>
+#include <android-base/unique_fd.h>
+#include <hidl/HidlBinderSupport.h>
+#include <log/log.h>
+#include <pthread.h>
+#include <sys/stat.h>
+
+#include "DumpstateDevice.h"
+
+#include "DumpstateUtil.h"
+
+#define MODEM_LOG_DIRECTORY "/data/vendor/radio/logs/always-on"
+#define MODEM_EXTENDED_LOG_DIRECTORY "/data/vendor/radio/extended_logs"
+#define MODEM_LOG_HISTORY_DIRECTORY "/data/vendor/radio/logs/history"
+#define RIL_LOG_DIRECTORY "/data/vendor/radio"
+#define RIL_LOG_DIRECTORY_PROPERTY "persist.vendor.ril.log.base_dir"
+#define RIL_LOG_NUMBER_PROPERTY "persist.vendor.ril.log.num_file"
+#define MODEM_LOGGING_PERSIST_PROPERTY "persist.vendor.sys.modem.logging.enable"
+#define MODEM_LOGGING_PROPERTY "vendor.sys.modem.logging.enable"
+#define MODEM_LOGGING_STATUS_PROPERTY "vendor.sys.modem.logging.status"
+#define MODEM_LOGGING_NUMBER_BUGREPORT_PROPERTY "persist.vendor.sys.modem.logging.br_num"
+#define MODEM_LOGGING_PATH_PROPERTY "vendor.sys.modem.logging.log_path"
+#define GPS_LOG_DIRECTORY "/data/vendor/gps/logs"
+#define GPS_LOG_NUMBER_PROPERTY "persist.vendor.gps.aol.log_num"
+#define GPS_LOGGING_STATUS_PROPERTY "vendor.gps.aol.enabled"
+
+#define UFS_BOOTDEVICE "ro.boot.bootdevice"
+
+#define TCPDUMP_LOG_DIRECTORY "/data/vendor/tcpdump_logger/logs"
+#define TCPDUMP_NUMBER_BUGREPORT "persist.vendor.tcpdump.log.br_num"
+#define TCPDUMP_PERSIST_PROPERTY "persist.vendor.tcpdump.log.alwayson"
+
+#define HW_REVISION "ro.boot.hardware.revision"
+
+using android::os::dumpstate::CommandOptions;
+using android::os::dumpstate::DumpFileToFd;
+using android::os::dumpstate::PropertiesHelper;
+using android::os::dumpstate::RunCommandToFd;
+
+namespace android {
+namespace hardware {
+namespace dumpstate {
+namespace V1_1 {
+namespace implementation {
+
+#define GPS_LOG_PREFIX "gl-"
+#define GPS_MCU_LOG_PREFIX "esw-"
+#define MODEM_LOG_PREFIX "sbuff_"
+#define EXTENDED_LOG_PREFIX "extended_log_"
+#define RIL_LOG_PREFIX "rild.log."
+#define BUFSIZE 65536
+#define TCPDUMP_LOG_PREFIX "tcpdump"
+
+typedef std::chrono::time_point<std::chrono::steady_clock> timepoint_t;
+
+const char kVerboseLoggingProperty[] = "persist.vendor.verbose_logging_enabled";
+
+void copyFile(std::string srcFile, std::string destFile) {
+ uint8_t buffer[BUFSIZE];
+ ssize_t size;
+
+ int fdSrc = open(srcFile.c_str(), O_RDONLY);
+ if (fdSrc < 0) {
+ ALOGD("Failed to open source file %s\n", srcFile.c_str());
+ return;
+ }
+
+ int fdDest = open(destFile.c_str(), O_WRONLY | O_CREAT, 0666);
+ if (fdDest < 0) {
+ ALOGD("Failed to open destination file %s\n", destFile.c_str());
+ close(fdSrc);
+ return;
+ }
+
+ ALOGD("Copying %s to %s\n", srcFile.c_str(), destFile.c_str());
+ while ((size = TEMP_FAILURE_RETRY(read(fdSrc, buffer, BUFSIZE))) > 0) {
+ TEMP_FAILURE_RETRY(write(fdDest, buffer, size));
+ }
+
+ close(fdDest);
+ close(fdSrc);
+}
+
+void dumpLogs(int fd, std::string srcDir, std::string destDir, int maxFileNum,
+ const char *logPrefix) {
+ (void) fd;
+ struct dirent **dirent_list = NULL;
+ int num_entries = scandir(srcDir.c_str(),
+ &dirent_list,
+ 0,
+ (int (*)(const struct dirent **, const struct dirent **)) alphasort);
+ if (!dirent_list) {
+ return;
+ } else if (num_entries <= 0) {
+ return;
+ }
+
+ int copiedFiles = 0;
+
+ for (int i = num_entries - 1; i >= 0; i--) {
+ ALOGD("Found %s\n", dirent_list[i]->d_name);
+
+ if (0 != strncmp(dirent_list[i]->d_name, logPrefix, strlen(logPrefix))) {
+ continue;
+ }
+
+ if ((copiedFiles >= maxFileNum) && (maxFileNum != -1)) {
+ ALOGD("Skipped %s\n", dirent_list[i]->d_name);
+ continue;
+ }
+
+ copiedFiles++;
+
+ std::string srcLogFile = srcDir + "/" + dirent_list[i]->d_name;
+ std::string destLogFile = destDir + "/" + dirent_list[i]->d_name;
+ copyFile(srcLogFile, destLogFile);
+
+ ALOGD("Copying %s to %s\n", srcLogFile.c_str(), destLogFile.c_str());
+ }
+
+ while (num_entries--) {
+ free(dirent_list[num_entries]);
+ }
+
+ free(dirent_list);
+}
+
+void dumpRilLogs(int fd, std::string destDir) {
+ std::string rilLogDir =
+ android::base::GetProperty(RIL_LOG_DIRECTORY_PROPERTY, RIL_LOG_DIRECTORY);
+
+ int maxFileNum = android::base::GetIntProperty(RIL_LOG_NUMBER_PROPERTY, 50);
+
+ const std::string currentLogDir = rilLogDir + "/cur";
+ const std::string previousLogDir = rilLogDir + "/prev";
+ const std::string currentDestDir = destDir + "/cur";
+ const std::string previousDestDir = destDir + "/prev";
+
+ RunCommandToFd(fd, "MKDIR RIL CUR LOG", {"/vendor/bin/mkdir", "-p", currentDestDir.c_str()},
+ CommandOptions::WithTimeout(2).Build());
+ RunCommandToFd(fd, "MKDIR RIL PREV LOG", {"/vendor/bin/mkdir", "-p", previousDestDir.c_str()},
+ CommandOptions::WithTimeout(2).Build());
+
+ dumpLogs(fd, currentLogDir, currentDestDir, maxFileNum, RIL_LOG_PREFIX);
+ dumpLogs(fd, previousLogDir, previousDestDir, maxFileNum, RIL_LOG_PREFIX);
+}
+
+void dumpNetmgrLogs(std::string destDir) {
+ const std::vector <std::string> netmgrLogs
+ {
+ "/data/vendor/radio/metrics_data",
+ "/data/vendor/radio/omadm_logs.txt",
+ "/data/vendor/radio/power_anomaly_data.txt",
+ };
+ for (const auto& logFile : netmgrLogs) {
+ copyFile(logFile, destDir + "/" + basename(logFile.c_str()));
+ }
+}
+
+/** Dumps last synced NV data into bugreports */
+void dumpModemEFS(std::string destDir) {
+ const std::string EFS_DIRECTORY = "/mnt/vendor/efs/";
+ const std::vector <std::string> nv_files
+ {
+ EFS_DIRECTORY+"nv_normal.bin",
+ EFS_DIRECTORY+"nv_protected.bin",
+ };
+ for (const auto& logFile : nv_files) {
+ copyFile(logFile, destDir + "/" + basename(logFile.c_str()));
+ }
+}
+
+void dumpGpsLogs(int fd, std::string destDir) {
+ const std::string gpsLogDir = GPS_LOG_DIRECTORY;
+ const std::string gpsTmpLogDir = gpsLogDir + "/.tmp";
+ const std::string gpsDestDir = destDir + "/gps";
+ int maxFileNum = android::base::GetIntProperty(GPS_LOG_NUMBER_PROPERTY, 20);
+
+ RunCommandToFd(fd, "MKDIR GPS LOG", {"/vendor/bin/mkdir", "-p", gpsDestDir.c_str()},
+ CommandOptions::WithTimeout(2).Build());
+
+ dumpLogs(fd, gpsTmpLogDir, gpsDestDir, 1, GPS_LOG_PREFIX);
+ dumpLogs(fd, gpsLogDir, gpsDestDir, 3, GPS_MCU_LOG_PREFIX);
+ dumpLogs(fd, gpsLogDir, gpsDestDir, maxFileNum, GPS_LOG_PREFIX);
+}
+
+void dumpCameraLogs(int fd, const std::string &destDir) {
+ static const std::string kCameraLogDir = "/data/vendor/camera/profiler";
+ const std::string cameraDestDir = destDir + "/camera";
+ RunCommandToFd(fd, "MKDIR CAMERA LOG", {"/vendor/bin/mkdir", "-p", cameraDestDir.c_str()},
+ CommandOptions::WithTimeout(2).Build());
+ // Attach multiple latest sessions (in case the user is running concurrent
+ // sessions or starts a new session after the one with performance issues).
+ dumpLogs(fd, kCameraLogDir, cameraDestDir, 10, "session-ended-");
+ dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "high-drop-rate-");
+ dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "watchdog-");
+ dumpLogs(fd, kCameraLogDir, cameraDestDir, 5, "camera-ended-");
+}
+
+timepoint_t startSection(int fd, const std::string &sectionName) {
+ android::base::WriteStringToFd(
+ "\n"
+ "------ Section start: " + sectionName + " ------\n"
+ "\n", fd);
+ return std::chrono::steady_clock::now();
+}
+
+void endSection(int fd, const std::string &sectionName, timepoint_t startTime) {
+ auto endTime = std::chrono::steady_clock::now();
+ auto elapsedMsec = std::chrono::duration_cast<std::chrono::milliseconds>
+ (endTime - startTime).count();
+
+ android::base::WriteStringToFd(
+ "\n"
+ "------ Section end: " + sectionName + " ------\n"
+ "Elapsed msec: " + std::to_string(elapsedMsec) + "\n"
+ "\n", fd);
+}
+
+// If you are adding a single RunCommandToFd() or DumpFileToFd() call, please
+// add it to dumpMiscSection(). But if you are adding multiple items that are
+// related to each other - for instance, for a Foo peripheral - please add them
+// to a new dump function and include it in this table so it can be accessed from the
+// command line, e.g.:
+// lshal debug android.hardware.dumpstate@1.0::IDumpstateDevice/default foo
+//
+// However, if your addition generates attachments and/or binary data for the
+// bugreport (i.e. if it requires two file descriptors to execute), it must not be
+// added to this table and should instead be added to dumpstateBoard() below.
+
+DumpstateDevice::DumpstateDevice()
+ : mTextSections{
+ { "pre-touch", [this](int fd) { dumpPreTouchSection(fd); } },
+ { "soc", [this](int fd) { dumpSocSection(fd); } },
+ { "storage", [this](int fd) { dumpStorageSection(fd); } },
+ { "memory", [this](int fd) { dumpMemorySection(fd); } },
+ { "Devfreq", [this](int fd) { dumpDevfreqSection(fd); } },
+ { "cpu", [this](int fd) { dumpCpuSection(fd); } },
+ { "power", [this](int fd) { dumpPowerSection(fd); } },
+ { "thermal", [this](int fd) { dumpThermalSection(fd); } },
+ { "touch", [this](int fd) { dumpTouchSection(fd); } },
+ { "display", [this](int fd) { dumpDisplaySection(fd); } },
+ { "sensors-usf", [this](int fd) { dumpSensorsUSFSection(fd); } },
+ { "aoc", [this](int fd) { dumpAoCSection(fd); } },
+ { "ramdump", [this](int fd) { dumpRamdumpSection(fd); } },
+ { "misc", [this](int fd) { dumpMiscSection(fd); } },
+ { "gsc", [this](int fd) { dumpGscSection(fd); } },
+ { "camera", [this](int fd) { dumpCameraSection(fd); } },
+ { "trusty", [this](int fd) { dumpTrustySection(fd); } },
+ { "modem", [this](int fd) { dumpModemSection(fd); } },
+ { "perf-metrics", [this](int fd) { dumpPerfMetricsSection(fd); } },
+ } {
+}
+
+// Dump data requested by an argument to the "debug" HAL interface, or help info
+// if the specified section is not supported.
+void DumpstateDevice::dumpTextSection(int fd, const std::string &sectionName) {
+ bool dumpAll = (sectionName == kAllSections);
+
+ for (const auto &section : mTextSections) {
+ if (dumpAll || sectionName == section.first) {
+ auto startTime = startSection(fd, section.first);
+ section.second(fd);
+ endSection(fd, section.first, startTime);
+
+ if (!dumpAll) {
+ return;
+ }
+ }
+ }
+
+ if (dumpAll) {
+ return;
+ }
+
+ // An unsupported section was requested on the command line
+ android::base::WriteStringToFd("Unrecognized text section: " + sectionName + "\n", fd);
+ android::base::WriteStringToFd("Try \"" + kAllSections + "\" or one of the following:", fd);
+ for (const auto &section : mTextSections) {
+ android::base::WriteStringToFd(" " + section.first, fd);
+ }
+ android::base::WriteStringToFd("\nNote: sections with attachments (e.g. modem) are"
+ "not avalable from the command line.\n", fd);
+}
+
+// Dump items related to power and battery
+void DumpstateDevice::dumpPowerSection(int fd) {
+ struct stat buffer;
+
+ RunCommandToFd(fd, "Power Stats Times", {"/vendor/bin/sh", "-c",
+ "echo -n \"Boot: \" && /vendor/bin/uptime -s && "
+ "echo -n \"Now: \" && date"});
+
+ RunCommandToFd(fd, "ACPM stats", {"/vendor/bin/sh", "-c",
+ "for f in /sys/devices/platform/acpm_stats/*_stats ; do "
+ "echo \"\\n\\n$f\" ; cat $f ; "
+ "done"});
+
+ DumpFileToFd(fd, "CPU PM stats", "/sys/devices/system/cpu/cpupm/cpupm/time_in_state");
+
+ DumpFileToFd(fd, "GENPD summary", "/d/pm_genpd/pm_genpd_summary");
+
+ DumpFileToFd(fd, "Power supply property battery", "/sys/class/power_supply/battery/uevent");
+ DumpFileToFd(fd, "Power supply property dc", "/sys/class/power_supply/dc/uevent");
+ DumpFileToFd(fd, "Power supply property gcpm", "/sys/class/power_supply/gcpm/uevent");
+ DumpFileToFd(fd, "Power supply property gcpm_pps", "/sys/class/power_supply/gcpm_pps/uevent");
+ DumpFileToFd(fd, "Power supply property main-charger", "/sys/class/power_supply/main-charger/uevent");
+ DumpFileToFd(fd, "Power supply property pca9486-mains", "/sys/class/power_supply/pca9468-mains/uevent");
+ DumpFileToFd(fd, "Power supply property tcpm", "/sys/class/power_supply/tcpm-source-psy-i2c-max77759tcpc/uevent");
+ DumpFileToFd(fd, "Power supply property usb", "/sys/class/power_supply/usb/uevent");
+ DumpFileToFd(fd, "Power supply property wireless", "/sys/class/power_supply/wireless/uevent");
+ if (!stat("/sys/class/power_supply/maxfg", &buffer)) {
+ DumpFileToFd(fd, "Power supply property maxfg", "/sys/class/power_supply/maxfg/uevent");
+ DumpFileToFd(fd, "m5_state", "/sys/class/power_supply/maxfg/m5_model_state");
+ DumpFileToFd(fd, "maxfg", "/dev/logbuffer_maxfg");
+ DumpFileToFd(fd, "maxfg", "/dev/logbuffer_maxfg_monitor");
+ } else {
+ DumpFileToFd(fd, "Power supply property maxfg_base", "/sys/class/power_supply/maxfg_base/uevent");
+ DumpFileToFd(fd, "Power supply property maxfg_flip", "/sys/class/power_supply/maxfg_flip/uevent");
+ DumpFileToFd(fd, "m5_state", "/sys/class/power_supply/maxfg_base/m5_model_state");
+ DumpFileToFd(fd, "maxfg_base", "/dev/logbuffer_maxfg_base");
+ DumpFileToFd(fd, "maxfg_flip", "/dev/logbuffer_maxfg_flip");
+ DumpFileToFd(fd, "maxfg_base", "/dev/logbuffer_maxfg_base_monitor");
+ DumpFileToFd(fd, "maxfg_flip", "/dev/logbuffer_maxfg_flip_monitor");
+ }
+ if (!stat("/sys/class/power_supply/dock", &buffer)) {
+ DumpFileToFd(fd, "Power supply property dock", "/sys/class/power_supply/dock/uevent");
+ }
+
+ if (!stat("/dev/logbuffer_tcpm", &buffer)) {
+ DumpFileToFd(fd, "Logbuffer TCPM", "/dev/logbuffer_tcpm");
+ } else if (!PropertiesHelper::IsUserBuild()) {
+ if (!stat("/sys/kernel/debug/tcpm", &buffer)) {
+ RunCommandToFd(fd, "TCPM logs", {"/vendor/bin/sh", "-c", "cat /sys/kernel/debug/tcpm/*"});
+ } else {
+ RunCommandToFd(fd, "TCPM logs", {"/vendor/bin/sh", "-c", "cat /sys/kernel/debug/usb/tcpm*"});
+ }
+ }
+
+ RunCommandToFd(fd, "TCPC", {"/vendor/bin/sh", "-c",
+ "for f in /sys/devices/platform/10d50000.hsi2c/i2c-*/i2c-max77759tcpc;"
+ "do echo \"registers:\"; cat $f/registers;"
+ "echo \"frs:\"; cat $f/frs;"
+ "echo \"auto_discharge:\"; cat $f/auto_discharge;"
+ "echo \"bc12_enabled:\"; cat $f/bc12_enabled;"
+ "echo \"cc_toggle_enable:\"; cat $f/cc_toggle_enable;"
+ "echo \"contaminant_detection:\"; cat $f/contaminant_detection;"
+ "echo \"contaminant_detection_status:\"; cat $f/contaminant_detection_status; done"});
+
+ DumpFileToFd(fd, "PD Engine", "/dev/logbuffer_usbpd");
+ DumpFileToFd(fd, "POGO Transport", "/dev/logbuffer_pogo_transport");
+ DumpFileToFd(fd, "PPS-google_cpm", "/dev/logbuffer_cpm");
+ DumpFileToFd(fd, "PPS-dc", "/dev/logbuffer_pca9468");
+
+ DumpFileToFd(fd, "Battery Health", "/sys/class/power_supply/battery/health_index_stats");
+ DumpFileToFd(fd, "BMS", "/dev/logbuffer_ssoc");
+ DumpFileToFd(fd, "TTF", "/dev/logbuffer_ttf");
+ DumpFileToFd(fd, "TTF details", "/sys/class/power_supply/battery/ttf_details");
+ DumpFileToFd(fd, "TTF stats", "/sys/class/power_supply/battery/ttf_stats");
+ DumpFileToFd(fd, "maxq", "/dev/logbuffer_maxq");
+ DumpFileToFd(fd, "aacr_state", "/sys/class/power_supply/battery/aacr_state");
+ DumpFileToFd(fd, "TEMP/DOCK-DEFEND", "/dev/logbuffer_bd");
+
+ RunCommandToFd(fd, "TRICKLE-DEFEND Config", {"/vendor/bin/sh", "-c",
+ " cd /sys/devices/platform/google,battery/power_supply/battery/;"
+ " for f in `ls bd_*` ; do echo \"$f: `cat $f`\" ; done"});
+
+ RunCommandToFd(fd, "DWELL-DEFEND Config", {"/vendor/bin/sh", "-c",
+ " cd /sys/devices/platform/google,charger/;"
+ " for f in `ls charge_s*` ; do echo \"$f: `cat $f`\" ; done"});
+
+ RunCommandToFd(fd, "TEMP-DEFEND Config", {"/vendor/bin/sh", "-c",
+ " cd /sys/devices/platform/google,charger/;"
+ " for f in `ls bd_*` ; do echo \"$f: `cat $f`\" ; done"});
+ if (!PropertiesHelper::IsUserBuild()) {
+
+ DumpFileToFd(fd, "DC_registers dump", "/sys/class/power_supply/pca9468-mains/device/registers_dump");
+ DumpFileToFd(fd, "max77759_chg registers dump", "/d/max77759_chg/registers");
+ DumpFileToFd(fd, "max77729_pmic registers dump", "/d/max77729_pmic/registers");
+ DumpFileToFd(fd, "Charging table dump", "/d/google_battery/chg_raw_profile");
+
+
+ RunCommandToFd(fd, "fg_model", {"/vendor/bin/sh", "-c",
+ "for f in /d/maxfg* ; do "
+ "regs=`cat $f/fg_model`; echo $f: ;"
+ "echo \"$regs\"; done"});
+
+ RunCommandToFd(fd, "fg_alo_ver", {"/vendor/bin/sh", "-c",
+ "for f in /d/maxfg* ; do "
+ "regs=`cat $f/algo_ver`; echo $f: ;"
+ "echo \"$regs\"; done"});
+
+ RunCommandToFd(fd, "fg_model_ok", {"/vendor/bin/sh", "-c",
+ "for f in /d/maxfg* ; do "
+ "regs=`cat $f/model_ok`; echo $f: ;"
+ "echo \"$regs\"; done"});
+
+
+ /* FG Registers */
+ RunCommandToFd(fd, "fg registers", {"/vendor/bin/sh", "-c",
+ "for f in /d/maxfg* ; do "
+ "regs=`cat $f/registers`; echo $f: ;"
+ "echo \"$regs\"; done"});
+ }
+
+ /* EEPROM State */
+ if (!stat("/sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom", &buffer)) {
+ RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-4/4-0050/eeprom"});
+ } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom", &buffer)) {
+ RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-5/5-0050/eeprom"});
+ } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom", &buffer)) {
+ RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-6/6-0050/eeprom"});
+ } else if(!stat("/sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom", &buffer)) {
+ RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-7/7-0050/eeprom"});
+ } else {
+ RunCommandToFd(fd, "Battery EEPROM", {"/vendor/bin/sh", "-c", "xxd /sys/devices/platform/10970000.hsi2c/i2c-8/8-0050/eeprom"});
+ }
+
+ DumpFileToFd(fd, "Charger Stats", "/sys/class/power_supply/battery/charge_details");
+ if (!PropertiesHelper::IsUserBuild()) {
+ RunCommandToFd(fd, "Google Charger", {"/vendor/bin/sh", "-c", "cd /sys/kernel/debug/google_charger/; "
+ "for f in `ls pps_*` ; do echo \"$f: `cat $f`\" ; done"});
+ RunCommandToFd(fd, "Google Battery", {"/vendor/bin/sh", "-c", "cd /sys/kernel/debug/google_battery/; "
+ "for f in `ls ssoc_*` ; do echo \"$f: `cat $f`\" ; done"});
+ }
+
+ DumpFileToFd(fd, "WLC logs", "/dev/logbuffer_wireless");
+ DumpFileToFd(fd, "WLC VER", "/sys/class/power_supply/wireless/device/version");
+ DumpFileToFd(fd, "WLC STATUS", "/sys/class/power_supply/wireless/device/status");
+ DumpFileToFd(fd, "WLC FW Version", "/sys/class/power_supply/wireless/device/fw_rev");
+ DumpFileToFd(fd, "RTX", "/dev/logbuffer_rtx");
+
+ if (!PropertiesHelper::IsUserBuild()) {
+ RunCommandToFd(fd, "gvotables", {"/vendor/bin/sh", "-c", "cat /sys/kernel/debug/gvotables/*/status"});
+ }
+ RunCommandToFd(fd, "Mitigation Stats", {"/vendor/bin/sh", "-c", "echo \"Source\\t\\tCount\\tSOC\\tTime\\tVoltage\"; "
+ "for f in `ls /sys/devices/virtual/pmic/mitigation/last_triggered_count/*` ; "
+ "do count=`cat $f`; "
+ "a=${f/\\/sys\\/devices\\/virtual\\/pmic\\/mitigation\\/last_triggered_count\\//}; "
+ "b=${f/last_triggered_count/last_triggered_capacity}; "
+ "c=${f/last_triggered_count/last_triggered_timestamp/}; "
+ "d=${f/last_triggered_count/last_triggered_voltage/}; "
+ "cnt=`cat $f`; "
+ "cap=`cat ${b/count/cap}`; "
+ "ti=`cat ${c/count/time}`; "
+ "volt=`cat ${d/count/volt}`; "
+ "echo \"${a/_count/} "
+ "\\t$cnt\\t$cap\\t$ti\\t$volt\" ; done"});
+ RunCommandToFd(fd, "Clock Divider Ratio", {"/vendor/bin/sh", "-c", "echo \"Source\\t\\tRatio\"; "
+ "for f in `ls /sys/devices/virtual/pmic/mitigation/clock_ratio/*` ; "
+ "do ratio=`cat $f`; "
+ "a=${f/\\/sys\\/devices\\/virtual\\/pmic\\/mitigation\\/clock_ratio\\//}; "
+ "echo \"${a/_ratio/} \\t$ratio\" ; done"});
+ RunCommandToFd(fd, "Clock Stats", {"/vendor/bin/sh", "-c", "echo \"Source\\t\\tStats\"; "
+ "for f in `ls /sys/devices/virtual/pmic/mitigation/clock_stats/*` ; "
+ "do stats=`cat $f`; "
+ "a=${f/\\/sys\\/devices\\/virtual\\/pmic\\/mitigation\\/clock_stats\\//}; "
+ "echo \"${a/_stats/} \\t$stats\" ; done"});
+ RunCommandToFd(fd, "Triggered Level", {"/vendor/bin/sh", "-c", "echo \"Source\\t\\tLevel\"; "
+ "for f in `ls /sys/devices/virtual/pmic/mitigation/triggered_lvl/*` ; "
+ "do lvl=`cat $f`; "
+ "a=${f/\\/sys\\/devices\\/virtual\\/pmic\\/mitigation\\/triggered_lvl\\//}; "
+ "echo \"${a/_lvl/} \\t$lvl\" ; done"});
+ RunCommandToFd(fd, "Instruction", {"/vendor/bin/sh", "-c",
+ "for f in `ls /sys/devices/virtual/pmic/mitigation/instruction/*` ; "
+ "do val=`cat $f` ; "
+ "a=${f/\\/sys\\/devices\\/virtual\\/pmic\\/mitigation\\/instruction\\//}; "
+ "echo \"$a=$val\" ; done"});
+
+}
+
+// Dump items related to thermal
+void DumpstateDevice::dumpThermalSection(int fd) {
+ RunCommandToFd(fd, "Temperatures", {"/vendor/bin/sh", "-c",
+ "for f in /sys/class/thermal/thermal* ; do "
+ "type=`cat $f/type` ; temp=`cat $f/temp` ; echo \"$type: $temp\" ; "
+ "done"});
+ RunCommandToFd(fd, "Cooling Device Current State", {"/vendor/bin/sh", "-c",
+ "for f in /sys/class/thermal/cooling* ; do "
+ "type=`cat $f/type` ; temp=`cat $f/cur_state` ; echo \"$type: $temp\" ; "
+ "done"});
+ RunCommandToFd(fd, "Cooling Device User Vote State", {"/vendor/bin/sh", "-c",
+ "for f in /sys/class/thermal/cooling* ; do "
+ "if [ ! -f $f/user_vote ]; then continue; fi; "
+ "type=`cat $f/type` ; temp=`cat $f/user_vote` ; echo \"$type: $temp\" ; "
+ "done"});
+ RunCommandToFd(fd, "Cooling Device Time in State", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/cooling* ; "
+ "do type=`cat $f/type` ; temp=`cat $f/stats/time_in_state_ms` ; echo \"$type:\n$temp\" ; done"});
+ RunCommandToFd(fd, "Cooling Device Trans Table", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/cooling* ; "
+ "do type=`cat $f/type` ; temp=`cat $f/stats/trans_table` ; echo \"$type:\n$temp\" ; done"});
+ RunCommandToFd(fd, "Cooling Device State2Power Table", {"/vendor/bin/sh", "-c",
+ "for f in /sys/class/thermal/cooling* ; do "
+ "if [ ! -f $f/state2power_table ]; then continue; fi; "
+ "type=`cat $f/type` ; state2power_table=`cat $f/state2power_table` ; echo \"$type: $state2power_table\" ; "
+ "done"});
+ DumpFileToFd(fd, "TMU state:", "/sys/module/gs101_thermal/parameters/tmu_reg_dump_state");
+ DumpFileToFd(fd, "TMU current temperature:", "/sys/module/gs101_thermal/parameters/tmu_reg_dump_current_temp");
+ DumpFileToFd(fd, "TMU_TOP rise thresholds:", "/sys/module/gs101_thermal/parameters/tmu_top_reg_dump_rise_thres");
+ DumpFileToFd(fd, "TMU_TOP fall thresholds:", "/sys/module/gs101_thermal/parameters/tmu_top_reg_dump_fall_thres");
+ DumpFileToFd(fd, "TMU_SUB rise thresholds:", "/sys/module/gs101_thermal/parameters/tmu_sub_reg_dump_rise_thres");
+ DumpFileToFd(fd, "TMU_SUB fall thresholds:", "/sys/module/gs101_thermal/parameters/tmu_sub_reg_dump_fall_thres");
+ DumpFileToFd(fd, "Temperature Residency Metrics:", "/sys/kernel/metrics/temp_residency/temp_residency_all/stats");
+}
+
+// Dump items related to touch
+void DumpstateDevice::dumpPreTouchSection(int fd) {
+ const char nvt_spi_path[] = "/sys/class/spi_master/spi11/spi11.0/input/nvt_touch";
+ char cmd[256];
+
+ /* NVT touch */
+ if (!access(nvt_spi_path, R_OK)) {
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/%s",
+ "0x21",
+ nvt_spi_path,
+ "force_touch_active");
+ RunCommandToFd(fd, "Force Touch Active(Enable)", {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "/proc/nvt_fw_version");
+ if (!access(cmd, R_OK))
+ DumpFileToFd(fd, "FW version", cmd);
+
+#if 0 /* b/193467774: remove this temporarily */
+ snprintf(cmd, sizeof(cmd), "/proc/nvt_diff");
+ if (!access(cmd, R_OK))
+ DumpFileToFd(fd, "Diff", cmd);
+
+ snprintf(cmd, sizeof(cmd), "%s/nvt_fw_history", nvt_spi_path);
+ if (!access(nvt_spi_path, R_OK))
+ DumpFileToFd(fd, "FW History", cmd);
+#endif
+
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/%s",
+ "0x20",
+ nvt_spi_path,
+ "force_touch_active");
+ RunCommandToFd(fd, "Force Touch Active(Disable)", {"/vendor/bin/sh", "-c", cmd});
+ }
+}
+
+void DumpstateDevice::dumpTouchSection(int fd) {
+ const char stm_cmd_path[4][50] = {"/sys/class/spi_master/spi11/spi11.0",
+ "/proc/fts/driver_test",
+ "/sys/class/spi_master/spi6/spi6.0",
+ "/proc/fts_ext/driver_test"};
+ const char lsi_spi_path[] = "/sys/devices/virtual/sec/tsp";
+ char cmd[256];
+
+ for (int i = 0; i < 4; i+=2) {
+ snprintf(cmd, sizeof(cmd), "%s", stm_cmd_path[i + 1]);
+ if (!access(cmd, R_OK)) {
+ snprintf(cmd, sizeof(cmd), "echo A0 01 01 > %s", stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Force Set AP as Bus Owner with Bugreport Flag",
+ {"/vendor/bin/sh", "-c", cmd});
+ }
+
+ snprintf(cmd, sizeof(cmd), "%s/appid", stm_cmd_path[i]);
+ if (!access(cmd, R_OK)) {
+ // Touch firmware version
+ DumpFileToFd(fd, "STM touch firmware version", cmd);
+
+ // Touch controller status
+ snprintf(cmd, sizeof(cmd), "%s/status", stm_cmd_path[i]);
+ DumpFileToFd(fd, "STM touch status", cmd);
+
+ // Mutual raw data
+ snprintf(cmd, sizeof(cmd),
+ "echo 13 00 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+ stm_cmd_path[i], stm_cmd_path[i]);
+ RunCommandToFd(fd, "Mutual Raw", {"/vendor/bin/sh", "-c", cmd});
+
+ // Mutual strength data
+ snprintf(cmd, sizeof(cmd),
+ "echo 17 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+ stm_cmd_path[i], stm_cmd_path[i]);
+ RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
+
+ // Self raw data
+ snprintf(cmd, sizeof(cmd),
+ "echo 15 00 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+ stm_cmd_path[i], stm_cmd_path[i]);
+ RunCommandToFd(fd, "Self Raw", {"/vendor/bin/sh", "-c", cmd});
+ }
+
+ snprintf(cmd, sizeof(cmd), "%s", stm_cmd_path[i + 1]);
+ if (!access(cmd, R_OK)) {
+ snprintf(cmd, sizeof(cmd),
+ "echo 01 A4 06 C3 > %s; echo 02 A7 00 00 00 40 00 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "HDM debug information (32 bytes)",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 23 00 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Mutual Raw Data",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 23 03 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Mutual Baseline Data",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 23 02 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Mutual Strength Data",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 24 00 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Self Raw Data",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 24 03 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Self Baseline Data",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 24 02 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Self Strength Data",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 32 10 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Mutual Compensation",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 32 11 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Mutual Low Power Compensation",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 33 12 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Self Compensation",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 34 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Golden Mutual Raw Data",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd), "echo 01 FA 20 00 00 24 80 > %s",
+ stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Packaging Plant - HW reset",
+ {"/vendor/bin/sh", "-c", cmd});
+ snprintf(cmd, sizeof(cmd), "echo 01 FA 20 00 00 68 08 > %s",
+ stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Packaging Plant - Hibernate Memory",
+ {"/vendor/bin/sh", "-c", cmd});
+ snprintf(cmd, sizeof(cmd),
+ "echo 02 FB 00 04 3F D8 00 10 01 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Packaging Plant - Read 16 bytes from Address 0x00041FD8",
+ {"/vendor/bin/sh", "-c", cmd});
+
+ snprintf(cmd, sizeof(cmd),
+ "echo 01 A4 06 C3 > %s; echo 02 A7 00 00 00 40 00 > %s && cat %s",
+ stm_cmd_path[i + 1], stm_cmd_path[i + 1], stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "HDM debug information (32 bytes)",
+ {"/vendor/bin/sh", "-c", cmd});
+ }
+
+ snprintf(cmd, sizeof(cmd), "%s/stm_fts_cmd", stm_cmd_path[i]);
+ if (!access(cmd, R_OK)) {
+ // ITO raw data
+ snprintf(cmd, sizeof(cmd),
+ "echo 01 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
+ stm_cmd_path[i], stm_cmd_path[i]);
+ RunCommandToFd(fd, "ITO Raw", {"/vendor/bin/sh", "-c", cmd});
+ }
+
+ snprintf(cmd, sizeof(cmd), "%s", stm_cmd_path[i + 1]);
+ if (!access(cmd, R_OK)) {
+ snprintf(cmd, sizeof(cmd), "echo A0 00 01 > %s", stm_cmd_path[i + 1]);
+ RunCommandToFd(fd, "Restore Bus Owner",
+ {"/vendor/bin/sh", "-c", cmd});
+ }
+ }
+
+ if (!access(lsi_spi_path, R_OK)) {
+ // Enable: force touch active
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "force_touch_active,2,1",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "Force Touch Active", {"/vendor/bin/sh", "-c", cmd});
+
+ // Firmware info
+ snprintf(cmd, sizeof(cmd), "%s/fw_version", lsi_spi_path);
+ DumpFileToFd(fd, "LSI firmware version", cmd);
+
+ // Touch status
+ snprintf(cmd, sizeof(cmd), "%s/status", lsi_spi_path);
+ DumpFileToFd(fd, "LSI touch status", cmd);
+
+ // Calibration info
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "get_mis_cal_info",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "Calibration info", {"/vendor/bin/sh", "-c", cmd});
+
+ // Mutual strength
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_delta_read_all",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
+
+ // Self strength
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_self_delta_read_all",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "Self Strength", {"/vendor/bin/sh", "-c", cmd});
+
+ // TYPE_AMBIENT_DATA
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_rawdata_read_type,3",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "TYPE_AMBIENT_DATA", {"/vendor/bin/sh", "-c", cmd});
+
+ // TYPE_DECODED_DATA
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_rawdata_read_type,5",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "TYPE_DECODED_DATA", {"/vendor/bin/sh", "-c", cmd});
+
+ // TYPE_OFFSET_DATA_SEC
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_rawdata_read_type,19",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "TYPE_OFFSET_DATA_SEC", {"/vendor/bin/sh", "-c", cmd});
+
+ // TYPE_NOI_P2P_MIN
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_rawdata_read_type,30",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "TYPE_NOI_P2P_MIN", {"/vendor/bin/sh", "-c", cmd});
+
+ // TYPE_NOI_P2P_MAX
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_rawdata_read_type,31",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "TYPE_NOI_P2P_MAX", {"/vendor/bin/sh", "-c", cmd});
+
+ // Raw cap
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_rawcap_read_all",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "Mutual Raw Cap", {"/vendor/bin/sh", "-c", cmd});
+
+ // Self raw cap
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_self_rawcap_read_all",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "Self Raw Cap", {"/vendor/bin/sh", "-c", cmd});
+
+ // CM2
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "run_rawcap_high_freq_read_all",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "CM2", {"/vendor/bin/sh", "-c", cmd});
+
+ // Disable: force touch active
+ snprintf(cmd, sizeof(cmd),
+ "echo %s > %s/cmd && cat %s/cmd_result",
+ "force_touch_active,2,0",
+ lsi_spi_path, lsi_spi_path);
+ RunCommandToFd(fd, "Force Touch Active", {"/vendor/bin/sh", "-c", cmd});
+ }
+}
+
+// Dump items related to SoC
+void DumpstateDevice::dumpSocSection(int fd) {
+ DumpFileToFd(fd, "AP HW TUNE", "/sys/devices/system/chip-id/ap_hw_tune_str");
+ DumpFileToFd(fd, "EVT VERSION", "/sys/devices/system/chip-id/evt_ver");
+ DumpFileToFd(fd, "LOT ID", "/sys/devices/system/chip-id/lot_id");
+ DumpFileToFd(fd, "PRODUCT ID", "/sys/devices/system/chip-id/product_id");
+ DumpFileToFd(fd, "REVISION", "/sys/devices/system/chip-id/revision");
+ DumpFileToFd(fd, "RAW STR", "/sys/devices/system/chip-id/raw_str");
+}
+
+// Dump items related to CPUs
+void DumpstateDevice::dumpCpuSection(int fd) {
+ DumpFileToFd(fd, "CPU present", "/sys/devices/system/cpu/present");
+ DumpFileToFd(fd, "CPU online", "/sys/devices/system/cpu/online");
+ RunCommandToFd(fd, "CPU time-in-state", {"/vendor/bin/sh", "-c",
+ "for cpu in /sys/devices/system/cpu/cpu*; do "
+ "f=$cpu/cpufreq/stats/time_in_state; "
+ "if [ ! -f $f ]; then continue; fi; "
+ "echo $f:; cat $f; "
+ "done"});
+ RunCommandToFd(fd, "CPU cpuidle", {"/vendor/bin/sh", "-c",
+ "for cpu in /sys/devices/system/cpu/cpu*; do "
+ "for d in $cpu/cpuidle/state*; do "
+ "if [ ! -d $d ]; then continue; fi; "
+ "echo \"$d: `cat $d/name` `cat $d/desc` `cat $d/time` `cat $d/usage`\"; "
+ "done; "
+ "done"});
+ DumpFileToFd(fd, "INTERRUPTS", "/proc/interrupts");
+}
+
+// Dump items related to Devfreq & BTS
+void DumpstateDevice::dumpDevfreqSection(int fd) {
+ DumpFileToFd(fd, "MIF DVFS",
+ "/sys/devices/platform/17000010.devfreq_mif/devfreq/17000010.devfreq_mif/time_in_state");
+ DumpFileToFd(fd, "INT DVFS",
+ "/sys/devices/platform/17000020.devfreq_int/devfreq/17000020.devfreq_int/time_in_state");
+ DumpFileToFd(fd, "INTCAM DVFS",
+ "/sys/devices/platform/17000030.devfreq_intcam/devfreq/17000030.devfreq_intcam/time_in_state");
+ DumpFileToFd(fd, "DISP DVFS",
+ "/sys/devices/platform/17000040.devfreq_disp/devfreq/17000040.devfreq_disp/time_in_state");
+ DumpFileToFd(fd, "CAM DVFS",
+ "/sys/devices/platform/17000050.devfreq_cam/devfreq/17000050.devfreq_cam/time_in_state");
+ DumpFileToFd(fd, "TNR DVFS",
+ "/sys/devices/platform/17000060.devfreq_tnr/devfreq/17000060.devfreq_tnr/time_in_state");
+ DumpFileToFd(fd, "MFC DVFS",
+ "/sys/devices/platform/17000070.devfreq_mfc/devfreq/17000070.devfreq_mfc/time_in_state");
+ DumpFileToFd(fd, "BO DVFS",
+ "/sys/devices/platform/17000080.devfreq_bo/devfreq/17000080.devfreq_bo/time_in_state");
+ DumpFileToFd(fd, "BTS stats", "/sys/devices/platform/exynos-bts/bts_stats");
+}
+
+// Dump items related to memory
+void DumpstateDevice::dumpMemorySection(int fd) {
+ RunCommandToFd(fd, "ION HEAPS", {"/vendor/bin/sh", "-c",
+ "for d in $(ls -d /d/ion/*); do "
+ "if [ -f $d ]; then "
+ "echo --- $d; cat $d; "
+ "else "
+ "for f in $(ls $d); do "
+ "echo --- $d/$f; cat $d/$f; "
+ "done; "
+ "fi; "
+ "done"});
+ DumpFileToFd(fd, "dmabuf info", "/d/dma_buf/bufinfo");
+ DumpFileToFd(fd, "Page Pinner - longterm pin", "/sys/kernel/debug/page_pinner/buffer");
+ RunCommandToFd(fd, "Pixel CMA stat", {"/vendor/bin/sh", "-c",
+ "for d in $(ls -d /sys/kernel/pixel_stat/mm/cma/*); do "
+ "if [ -f $d ]; then "
+ "echo --- $d; cat $d; "
+ "else "
+ "for f in $(ls $d); do "
+ "echo --- $d/$f; cat $d/$f; "
+ "done; "
+ "fi; "
+ "done"});
+}
+
+static void DumpF2FS(int fd) {
+ DumpFileToFd(fd, "F2FS", "/sys/kernel/debug/f2fs/status");
+ RunCommandToFd(fd, "F2FS - fsck time (ms)", {"/vendor/bin/sh", "-c", "getprop ro.boottime.init.fsck.data"});
+ RunCommandToFd(fd, "F2FS - checkpoint=disable time (ms)", {"/vendor/bin/sh", "-c", "getprop ro.boottime.init.mount.data"});
+}
+
+static void DumpUFS(int fd) {
+ DumpFileToFd(fd, "UFS model", "/sys/block/sda/device/model");
+ DumpFileToFd(fd, "UFS rev", "/sys/block/sda/device/rev");
+ DumpFileToFd(fd, "UFS size", "/sys/block/sda/size");
+
+ DumpFileToFd(fd, "UFS Slow IO Read", "/dev/sys/block/bootdevice/slowio_read_cnt");
+ DumpFileToFd(fd, "UFS Slow IO Write", "/dev/sys/block/bootdevice/slowio_write_cnt");
+ DumpFileToFd(fd, "UFS Slow IO Unmap", "/dev/sys/block/bootdevice/slowio_unmap_cnt");
+ DumpFileToFd(fd, "UFS Slow IO Sync", "/dev/sys/block/bootdevice/slowio_sync_cnt");
+
+ RunCommandToFd(fd, "UFS err_stats", {"/vendor/bin/sh", "-c",
+ "path=\"/dev/sys/block/bootdevice/err_stats\"; "
+ "for node in `ls $path/* | grep -v reset_err_status`; do "
+ "printf \"%s:%d\\n\" $(basename $node) $(cat $node); done;"});
+
+
+ RunCommandToFd(fd, "UFS io_stats", {"/vendor/bin/sh", "-c",
+ "path=\"/dev/sys/block/bootdevice/io_stats\"; "
+ "printf \"\\t\\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+ "ReadCnt ReadBytes WriteCnt WriteBytes RWCnt RWBytes; "
+ "str=$(cat $path/*_start); arr=($str); "
+ "printf \"Started: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+ "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "
+ "str=$(cat $path/*_complete); arr=($str); "
+ "printf \"Completed: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+ "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "
+ "str=$(cat $path/*_maxdiff); arr=($str); "
+ "printf \"MaxDiff: \\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\\n\" "
+ "${arr[1]} ${arr[0]} ${arr[5]} ${arr[4]} ${arr[3]} ${arr[2]}; "});
+
+ RunCommandToFd(fd, "UFS req_stats", {"/vendor/bin/sh", "-c",
+ "path=\"/dev/sys/block/bootdevice/req_stats\"; "
+ "printf \"\\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+ "All Write Read Security Flush Discard; "
+ "str=$(cat $path/*_min); arr=($str); "
+ "printf \"Min:\\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+ "${arr[0]} ${arr[5]} ${arr[3]} ${arr[4]} ${arr[2]} ${arr[1]}; "
+ "str=$(cat $path/*_max); arr=($str); "
+ "printf \"Max:\\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+ "${arr[0]} ${arr[5]} ${arr[3]} ${arr[4]} ${arr[2]} ${arr[1]}; "
+ "str=$(cat $path/*_avg); arr=($str); "
+ "printf \"Avg.:\\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\" "
+ "${arr[0]} ${arr[5]} ${arr[3]} ${arr[4]} ${arr[2]} ${arr[1]}; "
+ "str=$(cat $path/*_sum); arr=($str); "
+ "printf \"Count:\\t%-10s %-10s %-10s %-10s %-10s %-10s\\n\\n\" "
+ "${arr[0]} ${arr[5]} ${arr[3]} ${arr[4]} ${arr[2]} ${arr[1]};"});
+
+ std::string ufs_health = "for f in $(find /dev/sys/block/bootdevice/health_descriptor -type f); do if [[ -r $f && -f $f ]]; then echo --- $f; cat $f; echo ''; fi; done";
+ RunCommandToFd(fd, "UFS health", {"/vendor/bin/sh", "-c", ufs_health.c_str()});
+}
+
+// Dump items related to storage
+void DumpstateDevice::dumpStorageSection(int fd) {
+ DumpF2FS(fd);
+ DumpUFS(fd);
+}
+
+// Dump items related to display
+void DumpstateDevice::dumpDisplaySection(int fd) {
+ // Dump counters for decon drivers
+ const std::string decon_device_sysfs_path("/sys/class/drm/card0/device/");
+ for(int i = 0; i <= 2; ++i){
+ const std::string decon_num_str = std::to_string(i);
+ const std::string decon_counter_path = decon_device_sysfs_path +
+ "decon" + decon_num_str +
+ "/counters";
+ if (access(decon_counter_path.c_str(), R_OK) == 0){
+ DumpFileToFd(fd, "DECON-" + decon_num_str + " counters",
+ decon_counter_path);
+ }
+ else{
+ ::android::base::WriteStringToFd("No counters for DECON-" +
+ decon_num_str + " found at path (" + decon_counter_path + ")\n",
+ fd);
+ }
+ }
+ DumpFileToFd(fd, "CRTC-0 event log", "/sys/kernel/debug/dri/0/crtc-0/event");
+ DumpFileToFd(fd, "CRTC-1 event log", "/sys/kernel/debug/dri/0/crtc-1/event");
+ RunCommandToFd(fd, "libdisplaycolor", {"/vendor/bin/dumpsys", "displaycolor", "-v"},
+ CommandOptions::WithTimeout(2).Build());
+ DumpFileToFd(fd, "Primary panel extra info", "/sys/devices/platform/exynos-drm/primary-panel/panel_extinfo");
+ DumpFileToFd(fd, "secondary panel extra info", "/sys/devices/platform/exynos-drm/secondary-panel/panel_extinfo");
+}
+
+// Dump items related to AoC
+void DumpstateDevice::dumpAoCSection(int fd) {
+ DumpFileToFd(fd, "AoC Service Status", "/sys/devices/platform/19000000.aoc/services");
+ DumpFileToFd(fd, "AoC Restarts", "/sys/devices/platform/19000000.aoc/restart_count");
+ DumpFileToFd(fd, "AoC Coredumps", "/sys/devices/platform/19000000.aoc/coredump_count");
+ DumpFileToFd(fd, "AoC ring buf wake", "/sys/devices/platform/19000000.aoc/control/ring_buffer_wakeup");
+ DumpFileToFd(fd, "AoC host ipc wake", "/sys/devices/platform/19000000.aoc/control/host_ipc_wakeup");
+ DumpFileToFd(fd, "AoC usf wake", "/sys/devices/platform/19000000.aoc/control/usf_wakeup");
+ DumpFileToFd(fd, "AoC audio wake", "/sys/devices/platform/19000000.aoc/control/audio_wakeup");
+ DumpFileToFd(fd, "AoC logging wake", "/sys/devices/platform/19000000.aoc/control/logging_wakeup");
+ DumpFileToFd(fd, "AoC hotword wake", "/sys/devices/platform/19000000.aoc/control/hotword_wakeup");
+ DumpFileToFd(fd, "AoC memory exception wake", "/sys/devices/platform/19000000.aoc/control/memory_exception");
+ DumpFileToFd(fd, "AoC memory votes", "/sys/devices/platform/19000000.aoc/control/memory_votes_a32");
+ DumpFileToFd(fd, "AoC memory votes", "/sys/devices/platform/19000000.aoc/control/memory_votes_ff1");
+ RunCommandToFd(fd, "AoC Heap Stats (A32)",
+ {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 1' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
+ RunCommandToFd(fd, "AoC Heap Stats (F1)",
+ {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 2' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
+ RunCommandToFd(fd, "AoC Heap Stats (HF0)",
+ {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 3' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
+ RunCommandToFd(fd, "AoC Heap Stats (HF1)",
+ {"/vendor/bin/sh", "-c", "echo 'dbg heap -c 4' > /dev/acd-debug; timeout 0.1 cat /dev/acd-debug"},
+ CommandOptions::WithTimeout(1).Build());
+}
+
+// Dump items related to sensors usf.
+void DumpstateDevice::dumpSensorsUSFSection(int fd) {
+ CommandOptions options = CommandOptions::WithTimeout(2).Build();
+ RunCommandToFd(fd, "USF statistics",
+ {"/vendor/bin/sh", "-c", "usf_stats get --all"},
+ options);
+ if (!PropertiesHelper::IsUserBuild()) {
+ // Not a user build, if this is also not a production device dump the USF registry.
+ std::string hwRev = android::base::GetProperty(HW_REVISION, "");
+ if (hwRev.find("PROTO") != std::string::npos ||
+ hwRev.find("EVT") != std::string::npos ||
+ hwRev.find("DVT") != std::string::npos) {
+ RunCommandToFd(fd, "USF Registry",
+ {"/vendor/bin/sh", "-c", "usf_reg_edit save -"},
+ options);
+ RunCommandToFd(fd, "USF Last Stat Buffer",
+ {"/vendor/bin/sh", "-c", "cat /data/vendor/sensors/debug/stats.history"},
+ options);
+ }
+ }
+}
+
+// Gzip binary data and dump to fd in base64 format. Cmd to decode is also attached.
+void dumpGzippedFileInBase64ToFd(int fd, const char* title, const char* file_path) {
+ auto cmd = android::base::StringPrintf("echo 'base64 -d <<EOF | gunzip' ; "
+ "/vendor/bin/gzip < \"%s\" | /vendor/bin/base64 ; "
+ "echo 'EOF'", file_path);
+ RunCommandToFd(fd, title,
+ {"/vendor/bin/sh", "-c", cmd.c_str()},
+ CommandOptions::WithTimeout(10).Build());
+}
+
+struct abl_log_header {
+ uint64_t i;
+ uint64_t size;
+ char buf[];
+} __attribute__((packed));
+
+// Dump items related to ramdump.
+void DumpstateDevice::dumpRamdumpSection(int fd) {
+ std::string abl_log;
+ if (android::base::ReadFileToString("/mnt/vendor/ramdump/abl.log", &abl_log)) {
+ const struct abl_log_header *header = (const struct abl_log_header*) abl_log.c_str();
+ android::base::WriteStringToFd(android::base::StringPrintf(
+ "------ Ramdump misc file: abl.log (i:0x%" PRIx64 " size:0x%" PRIx64 ") ------\n%s\n",
+ header->i, header->size, std::string(header->buf, header->i).c_str()), fd);
+ } else {
+ android::base::WriteStringToFd("*** Ramdump misc file: abl.log: File not found\n", fd);
+ }
+ dumpGzippedFileInBase64ToFd(
+ fd, "Ramdump misc file: acpm.lst (gzipped in base64)", "/mnt/vendor/ramdump/acpm.lst");
+ dumpGzippedFileInBase64ToFd(
+ fd, "Ramdump misc file: s2d.lst (gzipped in base64)", "/mnt/vendor/ramdump/s2d.lst");
+}
+
+// Dump items that don't fit well into any other section
+void DumpstateDevice::dumpMiscSection(int fd) {
+ RunCommandToFd(fd, "VENDOR PROPERTIES", {"/vendor/bin/getprop"});
+ DumpFileToFd(fd, "VENDOR PROC DUMP", "/proc/vendor_sched/dump_task");
+}
+
+// Dump items related to GSC
+void DumpstateDevice::dumpGscSection(int fd) {
+ RunCommandToFd(fd, "Citadel VERSION", {"vendor/bin/hw/citadel_updater", "-lv"});
+ RunCommandToFd(fd, "Citadel STATS", {"vendor/bin/hw/citadel_updater", "--stats"});
+ RunCommandToFd(fd, "GSC DEBUG DUMP", {"vendor/bin/hw/citadel_updater", "-D"});
+}
+
+// Dump essential camera debugging logs
+void DumpstateDevice::dumpCameraSection(int fd) {
+ RunCommandToFd(fd, "Camera HAL Graph State Dump", {"/vendor/bin/sh", "-c",
+ "for f in $(ls -t /data/vendor/camera/hal_graph_state*.txt |head -1); do "
+ "echo $f ; cat $f ; done"},
+ CommandOptions::WithTimeout(4).Build());
+}
+
+void DumpstateDevice::dumpTrustySection(int fd) {
+ DumpFileToFd(fd, "Trusty TEE0 Logs", "/dev/trusty-log0");
+}
+
+// Dump items related to modem
+void DumpstateDevice::dumpModemSection(int fd) {
+ DumpFileToFd(fd, "Modem Stat", "/data/vendor/modem_stat/debug.txt");
+ RunCommandToFd(fd, "Modem SSR history", {"/vendor/bin/sh", "-c",
+ "for f in $(ls /data/vendor/ssrdump/crashinfo_modem*); do "
+ "echo $f ; cat $f ; done"},
+ CommandOptions::WithTimeout(2).Build());
+ RunCommandToFd(fd, "RFSD error log", {"/vendor/bin/sh", "-c",
+ "for f in $(ls /data/vendor/log/rfsd/rfslog_*); do "
+ "echo $f ; cat $f ; done"},
+ CommandOptions::WithTimeout(2).Build());
+}
+
+static void *dumpModemThread(void *data) {
+ std::string modemLogDir = MODEM_LOG_DIRECTORY;
+ std::string extendedLogDir = MODEM_EXTENDED_LOG_DIRECTORY;
+ std::string modemLogHistoryDir = MODEM_LOG_HISTORY_DIRECTORY;
+ std::string tcpdumpLogDir = TCPDUMP_LOG_DIRECTORY;
+ static const std::string sectionName = "modem";
+
+ const std::string modemLogCombined = modemLogDir + "/modem_log_all.tar";
+ const std::string modemLogAllDir = modemLogDir + "/modem_log";
+
+ long fdModem = (long)data;
+
+ ALOGD("dumpModemThread started\n");
+
+ RunCommandToFd(STDOUT_FILENO, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
+
+ bool modemLogEnabled = android::base::GetBoolProperty(MODEM_LOGGING_PERSIST_PROPERTY, false);
+ if (modemLogEnabled && android::base::GetProperty(MODEM_LOGGING_PATH_PROPERTY, "") == MODEM_LOG_DIRECTORY) {
+ bool modemLogStarted = android::base::GetBoolProperty(MODEM_LOGGING_STATUS_PROPERTY, false);
+ int maxFileNum = android::base::GetIntProperty(MODEM_LOGGING_NUMBER_BUGREPORT_PROPERTY, 100);
+
+ if (modemLogStarted) {
+ android::base::SetProperty(MODEM_LOGGING_PROPERTY, "false");
+ ALOGD("Stopping modem logging...\n");
+ } else {
+ ALOGD("modem logging is not running\n");
+ }
+
+ for (int i = 0; i < 15; i++) {
+ if (!android::base::GetBoolProperty(MODEM_LOGGING_STATUS_PROPERTY, false)) {
+ ALOGD("modem logging stopped\n");
+ sleep(1);
+ break;
+ }
+ sleep(1);
+ }
+
+ dumpLogs(STDOUT_FILENO, modemLogDir, modemLogAllDir, maxFileNum, MODEM_LOG_PREFIX);
+
+ if (modemLogStarted) {
+ ALOGD("Restarting modem logging...\n");
+ android::base::SetProperty(MODEM_LOGGING_PROPERTY, "true");
+ }
+ }
+
+ if (!PropertiesHelper::IsUserBuild()) {
+ bool gpsLogEnabled = android::base::GetBoolProperty(GPS_LOGGING_STATUS_PROPERTY, false);
+ bool tcpdumpEnabled = android::base::GetBoolProperty(TCPDUMP_PERSIST_PROPERTY, false);
+ bool cameraLogsEnabled = android::base::GetBoolProperty(
+ "vendor.camera.debug.camera_performance_analyzer.attach_to_bugreport", true);
+
+ if (tcpdumpEnabled) {
+ dumpLogs(STDOUT_FILENO, tcpdumpLogDir, modemLogAllDir, android::base::GetIntProperty(TCPDUMP_NUMBER_BUGREPORT, 5), TCPDUMP_LOG_PREFIX);
+ }
+
+ if (gpsLogEnabled) {
+ dumpGpsLogs(STDOUT_FILENO, modemLogAllDir);
+ } else {
+ ALOGD("gps logging is not running\n");
+ }
+
+ if (cameraLogsEnabled) {
+ dumpCameraLogs(STDOUT_FILENO, modemLogAllDir);
+ }
+
+ dumpLogs(STDOUT_FILENO, extendedLogDir, modemLogAllDir, 50, EXTENDED_LOG_PREFIX);
+ dumpLogs(STDOUT_FILENO, modemLogHistoryDir, modemLogAllDir, 2, "Logging");
+ dumpRilLogs(STDOUT_FILENO, modemLogAllDir);
+ dumpNetmgrLogs(modemLogAllDir);
+ dumpModemEFS(modemLogAllDir);
+ }
+
+ ALOGD("Going to compress logs\n");
+
+ RunCommandToFd(STDOUT_FILENO, "TAR LOG", {"/vendor/bin/tar", "cvf", modemLogCombined.c_str(), "-C", modemLogAllDir.c_str(), "."}, CommandOptions::WithTimeout(25).Build());
+ RunCommandToFd(STDOUT_FILENO, "CHG PERM", {"/vendor/bin/chmod", "a+w", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build());
+
+ std::vector<uint8_t> buffer(65536);
+ android::base::unique_fd fdLog(TEMP_FAILURE_RETRY(open(modemLogCombined.c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK)));
+
+ ALOGD("Going to write to dumpstate board binary\n");
+ if (fdLog >= 0) {
+ while (1) {
+ ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fdLog, buffer.data(), buffer.size()));
+
+ if (bytes_read == 0) {
+ break;
+ } else if (bytes_read < 0) {
+ ALOGD("read(%s): %s\n", modemLogCombined.c_str(), strerror(errno));
+ break;
+ }
+
+ ssize_t result = TEMP_FAILURE_RETRY(write(fdModem, buffer.data(), bytes_read));
+
+ if (result != bytes_read) {
+ ALOGD("Failed to write %ld bytes, actually written: %ld", bytes_read, result);
+ break;
+ }
+ }
+ }
+
+ ALOGD("Going to remove logs\n");
+
+ RunCommandToFd(STDOUT_FILENO, "RM MODEM DIR", { "/vendor/bin/rm", "-r", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
+ RunCommandToFd(STDOUT_FILENO, "RM LOG", { "/vendor/bin/rm", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build());
+
+ ALOGD("dumpModemThread finished\n");
+
+ return NULL;
+}
+
+void DumpstateDevice::dumpPerfMetricsSection(int fd) {
+ DumpFileToFd(fd, "Long running IRQ metrics", "/sys/kernel/metrics/irq/long_irq_metrics");
+ DumpFileToFd(fd, "Resume latency metrics", "/sys/kernel/metrics/resume_latency/resume_latency_metrics");
+}
+
+// Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow.
+Return<void> DumpstateDevice::dumpstateBoard(const hidl_handle &handle) {
+// Ignore return value, just return an empty status.
+ dumpstateBoard_1_1(handle, DumpstateMode::DEFAULT, 30 * 1000 /* timeoutMillis */);
+ return Void();
+}
+
+// Methods from ::android::hardware::dumpstate::V1_1::IDumpstateDevice follow.
+Return<DumpstateStatus> DumpstateDevice::dumpstateBoard_1_1(const hidl_handle& handle,
+ const DumpstateMode mode,
+ const uint64_t timeoutMillis) {
+ // Unused arguments.
+ (void) timeoutMillis;
+
+ if (handle == nullptr || handle->numFds < 1) {
+ ALOGE("no FDs\n");
+ return DumpstateStatus::ILLEGAL_ARGUMENT;
+ }
+
+ int fd = handle->data[0];
+ if (fd < 0) {
+ ALOGE("invalid FD: %d\n", handle->data[0]);
+ return DumpstateStatus::ILLEGAL_ARGUMENT;
+ }
+
+ if (mode == DumpstateMode::WEAR) {
+ // We aren't a Wear device.
+ ALOGE("Unsupported mode: %d\n", mode);
+ return DumpstateStatus::UNSUPPORTED_MODE;
+ } else if (mode < DumpstateMode::FULL || mode > DumpstateMode::PROTO) {
+ ALOGE("Invalid mode: %d\n", mode);
+ return DumpstateStatus::ILLEGAL_ARGUMENT;
+ }
+
+ // Create thread to collect modem related logs
+ pthread_t modemThreadHandle = 0;
+ if (getVerboseLoggingEnabled()) {
+ if (handle->numFds < 2) {
+ ALOGE("no FD for modem\n");
+ } else {
+ int fdModem = handle->data[1];
+ if (pthread_create(&modemThreadHandle, NULL, dumpModemThread, (void *)((long)fdModem)) != 0) {
+ ALOGE("could not create thread for dumpModem\n");
+ }
+ }
+ } else {
+ ALOGD("Verbose logging is not enabled\n");
+ }
+
+ dumpTextSection(fd, kAllSections);
+
+ if (modemThreadHandle) {
+ pthread_join(modemThreadHandle, NULL);
+ }
+
+ return DumpstateStatus::OK;
+}
+
+Return<void> DumpstateDevice::setVerboseLoggingEnabled(const bool enable) {
+ ::android::base::SetProperty(kVerboseLoggingProperty, enable ? "true" : "false");
+ return Void();
+}
+
+Return<bool> DumpstateDevice::getVerboseLoggingEnabled() {
+ return ::android::base::GetBoolProperty(kVerboseLoggingProperty, false);
+}
+
+// Since HALs that support the debug() interface are automatically invoked during
+// bugreport generation and we don't want to generate a second copy of the same
+// data that will go into dumpstate_board.txt, this function will only do
+// something if it is called with an option, e.g.
+// lshal debug android.hardware.dumpstate@1.0::IDumpstateDevice/default all
+//
+// Also, note that sections which generate attachments and/or binary data when
+// included in a bugreport are not available through the debug() interface.
+Return<void> DumpstateDevice::debug(const hidl_handle &handle, const hidl_vec<hidl_string> &args) {
+ // Exit when dump is completed since this is a lazy HAL.
+ addPostCommandTask([]() {
+ exit(0);
+ });
+
+ if (handle == nullptr || handle->numFds < 1 || args.size() != 1) {
+ return Void();
+ }
+
+ int fd = handle->data[0];
+ dumpTextSection(fd, static_cast<std::string>(args[0]));
+
+ fsync(fd);
+ return Void();
+}
+
+
+} // namespace implementation
+} // namespace V1_1
+} // namespace dumpstate
+} // namespace hardware
+} // namespace android
diff --git a/dumpstate/DumpstateDevice.h b/dumpstate/DumpstateDevice.h
new file mode 100644
index 00000000..f42ec198
--- /dev/null
+++ b/dumpstate/DumpstateDevice.h
@@ -0,0 +1,91 @@
+/*
+ * 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.
+ */
+#ifndef ANDROID_HARDWARE_DUMPSTATE_V1_1_DUMPSTATEDEVICE_H
+#define ANDROID_HARDWARE_DUMPSTATE_V1_1_DUMPSTATEDEVICE_H
+
+#include <android/hardware/dumpstate/1.1/IDumpstateDevice.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <string>
+
+namespace android {
+namespace hardware {
+namespace dumpstate {
+namespace V1_1 {
+namespace implementation {
+
+using ::android::hardware::dumpstate::V1_1::DumpstateMode;
+using ::android::hardware::dumpstate::V1_1::DumpstateStatus;
+using ::android::hardware::dumpstate::V1_1::IDumpstateDevice;
+using ::android::hardware::hidl_handle;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+
+struct DumpstateDevice : public IDumpstateDevice {
+ public:
+ DumpstateDevice();
+
+ // Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow.
+ Return<void> dumpstateBoard(const hidl_handle& h) override;
+
+ // Methods from ::android::hardware::dumpstate::V1_1::IDumpstateDevice follow.
+ Return<DumpstateStatus> dumpstateBoard_1_1(const hidl_handle& h,
+ const DumpstateMode mode,
+ const uint64_t timeoutMillis) override;
+ Return<void> setVerboseLoggingEnabled(const bool enable) override;
+ Return<bool> getVerboseLoggingEnabled() override;
+
+ // Methods from ::android::hidl::base::V1_0::IBase follow.
+ Return<void> debug(const hidl_handle &fd, const hidl_vec<hidl_string> &args) override;
+
+ private:
+ const std::string kAllSections = "all";
+
+ std::vector<std::pair<std::string, std::function<void(int)>>> mTextSections;
+
+ void dumpTextSection(int fd, std::string const& sectionName);
+
+ // Text sections that can be dumped individually on the command line in
+ // addition to being included in full dumps
+ void dumpPowerSection(int fd);
+ void dumpThermalSection(int fd);
+ void dumpPreTouchSection(int fd);
+ void dumpTouchSection(int fd);
+ void dumpSocSection(int fd);
+ void dumpCpuSection(int fd);
+ void dumpDevfreqSection(int fd);
+ void dumpMemorySection(int fd);
+ void dumpStorageSection(int fd);
+ void dumpDisplaySection(int fd);
+ void dumpSensorsUSFSection(int fd);
+ void dumpAoCSection(int fd);
+ void dumpRamdumpSection(int fd);
+ void dumpMiscSection(int fd);
+ void dumpGscSection(int fd);
+ void dumpCameraSection(int fd);
+ void dumpTrustySection(int fd);
+ void dumpModemSection(int fd);
+ void dumpPerfMetricsSection(int fd);
+};
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace dumpstate
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_DUMPSTATE_V1_1_DUMPSTATEDEVICE_H
diff --git a/dumpstate/android.hardware.dumpstate@1.1-service.gs101.rc b/dumpstate/android.hardware.dumpstate@1.1-service.gs101.rc
new file mode 100644
index 00000000..6be0278b
--- /dev/null
+++ b/dumpstate/android.hardware.dumpstate@1.1-service.gs101.rc
@@ -0,0 +1,6 @@
+service vendor.dumpstate-1-1 /vendor/bin/hw/android.hardware.dumpstate@1.1-service.gs101
+ class hal
+ user system
+ group system
+ interface android.hardware.dumpstate@1.0::IDumpstateDevice default
+ interface android.hardware.dumpstate@1.1::IDumpstateDevice default
diff --git a/dumpstate/service.cpp b/dumpstate/service.cpp
new file mode 100644
index 00000000..47172311
--- /dev/null
+++ b/dumpstate/service.cpp
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+#define LOG_TAG "android.hardware.dumpstate@1.0-service.gs101"
+
+#include <hidl/HidlSupport.h>
+#include <hidl/HidlTransportSupport.h>
+
+#include "DumpstateDevice.h"
+
+using ::android::hardware::configureRpcThreadpool;
+using ::android::hardware::dumpstate::V1_1::IDumpstateDevice;
+using ::android::hardware::dumpstate::V1_1::implementation::DumpstateDevice;
+using ::android::hardware::joinRpcThreadpool;
+using ::android::sp;
+
+
+int main(int /* argc */, char* /* argv */ []) {
+ sp<IDumpstateDevice> dumpstate = new DumpstateDevice;
+ configureRpcThreadpool(1, true);
+
+ android::status_t status = dumpstate->registerAsService();
+
+ if (status != android::OK)
+ {
+ ALOGE("Could not register DumpstateDevice service (%d).", status);
+ return -1;
+ }
+
+ joinRpcThreadpool();
+}
diff --git a/edgetpu/OWNERS b/edgetpu/OWNERS
new file mode 100644
index 00000000..9eb92a96
--- /dev/null
+++ b/edgetpu/OWNERS
@@ -0,0 +1,6 @@
+# Devs who work on EdgeTPU on Android.
+hsuy@google.com
+yuchicheng@google.com
+iayara@google.com
+qinyiyan@google.com
+macwang@google.com \ No newline at end of file
diff --git a/edgetpu/edgetpu.mk b/edgetpu/edgetpu.mk
new file mode 100644
index 00000000..49658ed2
--- /dev/null
+++ b/edgetpu/edgetpu.mk
@@ -0,0 +1,32 @@
+# Config variables for TPU chip on device.
+$(call soong_config_set,edgetpu_config,chip,abrolhos)
+
+# TPU logging service
+PRODUCT_PACKAGES += \
+ android.hardware.edgetpu.logging@service-edgetpu-logging
+
+# TPU firmware
+PRODUCT_PACKAGES += \
+ edgetpu-abrolhos.fw
+
+# TPU NN AIDL HAL
+PRODUCT_PACKAGES += \
+ android.hardware.neuralnetworks@service-darwinn-aidl
+
+# TPU application service
+PRODUCT_PACKAGES += \
+ vendor.google.edgetpu_app_service@1.0-service
+
+# TPU vendor service
+PRODUCT_PACKAGES += \
+ vendor.google.edgetpu_vendor_service@1.0-service
+
+# TPU HAL client library
+PRODUCT_PACKAGES += \
+ libedgetpu_client.google
+
+# TPU metrics logger library
+PRODUCT_PACKAGES += \
+ libmetrics_logger
+
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/edgetpu/
diff --git a/factory/framework/Android.bp b/factory/framework/Android.bp
new file mode 100644
index 00000000..54b5b68f
--- /dev/null
+++ b/factory/framework/Android.bp
@@ -0,0 +1,15 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+runtime_resource_overlay {
+ name: "FactoryOverlayFrameworkRes",
+ product_specific: true,
+}
diff --git a/factory/framework/AndroidManifest.xml b/factory/framework/AndroidManifest.xml
new file mode 100644
index 00000000..73875be8
--- /dev/null
+++ b/factory/framework/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<!-- Pixel specific factory overlays -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.frameworkres.overlay.factory">
+ <application android:hasCode="false" />
+ <overlay
+ android:targetPackage="android"
+ android:isStatic="true"
+ android:priority="2"/>
+</manifest>
diff --git a/factory/framework/res/drawable-nodpi/default_wallpaper.png b/factory/framework/res/drawable-nodpi/default_wallpaper.png
new file mode 100644
index 00000000..93b787e3
--- /dev/null
+++ b/factory/framework/res/drawable-nodpi/default_wallpaper.png
Binary files differ
diff --git a/factory/launcher3/Android.bp b/factory/launcher3/Android.bp
new file mode 100644
index 00000000..31ee56ae
--- /dev/null
+++ b/factory/launcher3/Android.bp
@@ -0,0 +1,15 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+runtime_resource_overlay {
+ name: "FactoryOverlayLauncher3",
+ product_specific: true,
+}
diff --git a/factory/launcher3/AndroidManifest.xml b/factory/launcher3/AndroidManifest.xml
new file mode 100644
index 00000000..3f285855
--- /dev/null
+++ b/factory/launcher3/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<!-- Pixel specific factory overlays -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.launcher3.overlay.factory">
+ <application android:hasCode="false" />
+ <overlay
+ android:targetPackage="com.android.launcher3"
+ android:targetName="favorites"
+ android:isStatic="true"
+ android:priority="2"/>
+</manifest>
diff --git a/factory/launcher3/res/xml/default_workspace_5x5.xml b/factory/launcher3/res/xml/default_workspace_5x5.xml
new file mode 100644
index 00000000..7abd7dd5
--- /dev/null
+++ b/factory/launcher3/res/xml/default_workspace_5x5.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<favorites xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3">
+
+ <!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
+ <!-- Dialer, android test tool, label barcode, battery charge tool, barcode scanner -->
+ <resolve
+ launcher:container="-101"
+ launcher:screen="0"
+ launcher:x="0"
+ launcher:y="0" >
+ <favorite launcher:uri="#Intent;action=android.intent.action.DIAL;end" />
+ <favorite launcher:uri="tel:123" />
+ <favorite launcher:uri="#Intent;action=android.intent.action.CALL_BUTTON;end" />
+ </resolve>
+
+ <resolve
+ launcher:container="-101"
+ launcher:screen="1"
+ launcher:x="1"
+ launcher:y="0" >
+ <favorite
+ launcher:packageName="com.google_npi.androidtesttool"
+ launcher:className="com.google_npi.androidtesttool.MainActivity" />
+ </resolve>
+
+ <resolve
+ launcher:container="-101"
+ launcher:screen="2"
+ launcher:x="2"
+ launcher:y="0" >
+ <favorite
+ launcher:packageName="com.google_cte.labelbarcode"
+ launcher:className="com.google_cte.labelbarcode.LabelBarcodeMainActivity" />
+ </resolve>
+
+ <resolve
+ launcher:container="-101"
+ launcher:screen="3"
+ launcher:x="3"
+ launcher:y="0" >
+ <favorite
+ launcher:packageName="com.google.batterychargetool"
+ launcher:className="com.google.batterychargetool.MainActivity" />
+ </resolve>
+
+ <resolve
+ launcher:container="-101"
+ launcher:screen="4"
+ launcher:x="4"
+ launcher:y="0" >
+ <favorite
+ launcher:packageName="com.google_cte.barcodescanner"
+ launcher:className="com.google_cte.barcodescanner.MainActivity" />
+ </resolve>
+
+</favorites>
diff --git a/factory/settings/Android.bp b/factory/settings/Android.bp
new file mode 100644
index 00000000..adc3ea41
--- /dev/null
+++ b/factory/settings/Android.bp
@@ -0,0 +1,15 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+runtime_resource_overlay {
+ name: "FactoryOverlaySettings",
+ product_specific: true,
+}
diff --git a/factory/settings/AndroidManifest.xml b/factory/settings/AndroidManifest.xml
new file mode 100644
index 00000000..72e7838a
--- /dev/null
+++ b/factory/settings/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<!-- Pixel specific factory overlays -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.providers.settings.overlay.factory">
+ <application android:hasCode="false" />
+ <overlay
+ android:targetPackage="com.android.providers.settings"
+ android:targetName="resources"
+ android:isStatic="true"
+ android:priority="2"/>
+</manifest>
diff --git a/factory/settings/res/values/defaults.xml b/factory/settings/res/values/defaults.xml
new file mode 100644
index 00000000..b7febd9e
--- /dev/null
+++ b/factory/settings/res/values/defaults.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <integer name="def_lockscreen_sounds_enabled">0</integer>
+ <bool name="def_lockscreen_disabled">true</bool>
+ <bool name="def_dtmf_tones_enabled">false</bool>
+ <bool name="def_sound_effects_enabled">false</bool>
+ <bool name="def_charging_sounds_enabled">false</bool>
+ <string name="def_immersive_mode_confirmations" translatable="false">confirmed</string>
+</resources>
diff --git a/factory_common.mk b/factory_common.mk
new file mode 100644
index 00000000..5434fbf4
--- /dev/null
+++ b/factory_common.mk
@@ -0,0 +1,82 @@
+#
+# Copyright 2020 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.
+#
+
+$(call inherit-product, device/google/gs101/aosp_common.mk)
+$(call inherit-product-if-exists, vendor/google_devices/gs101/factory/pixel/device-factory.mk)
+
+PRODUCT_PROPERTY_OVERRIDES += service.adb.root=1 \
+ ro.vendor.factory=1 \
+ ro.adb.secure=0
+
+# Factory Libraries of Audio
+PRODUCT_PACKAGES += audioroute libaudioroutelite
+
+# Enable fatp by default for factory builds
+PRODUCT_SYSTEM_DEFAULT_PROPERTIES += \
+ persist.vendor.camera.fatp.enable=1
+
+# Disable camera related features for factory builds
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.vendor.camera.partial_result_count=1 \
+ vendor.camera.debug.bypass_face_ssd_processor=1 \
+ vendor.camera.debug.enable_face_detection=0 \
+ vendor.camera.debug.force_dpm_on=0 \
+ vendor.camera.debug.force_eis_on=0 \
+ vendor.camera.debug.force_eaf_on=0 \
+ vendor.camera.debug.force_local_tone_mapping_on=0 \
+ vendor.camera.debug.force_mesh_warp_on=0 \
+ vendor.camera.debug.force_rectiface_node_on=0 \
+ vendor.camera.debug.force_steadiface_on=0 \
+ vendor.camera.debug.force_tnr_on=0 \
+ vendor.camera.debug.local_tone_mapping_controller_v1.mode=0 \
+ vendor.camera.debug.force_segmentation_node_on=0 \
+ vendor.camera.debug.enable_saliency=0
+
+# Disable ScreenDecorations for factory builds
+PRODUCT_PROPERTY_OVERRIDES += \
+ debug.disable_screen_decorations=true
+
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.set_idle_timer_ms=80
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.set_touch_timer_ms=200
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.set_display_power_timer_ms=1000
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.use_content_detection_for_refresh_rate=true
+
+# factory should always has SELinux permissive
+BOARD_BOOTCONFIG += androidboot.selinux=permissive
+BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
+
+# Disable Bluetooth as default in factory build
+DEVICE_PACKAGE_OVERLAYS += device/google/gs101/overlay-factory
+
+PRODUCT_COPY_FILES += \
+ device/google/gs101/conf/init.factory.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.factory.rc
+
+# Add factory-friendly changes
+PRODUCT_PACKAGES += \
+ FactoryOverlaySettings \
+ FactoryOverlayLauncher3 \
+ FactoryOverlayFrameworkRes
+
+# Disable DebugFS restrictions in factory builds
+PRODUCT_SET_DEBUGFS_RESTRICTIONS := false
+
+# PixelLogger for RF testing
+PRODUCT_PACKAGES_DEBUG += \
+ PixelLogger
+
+# Tool for installing Widevine keybox
+PRODUCT_PACKAGES_DEBUG += \
+ WvInstallKeybox
diff --git a/fingerprint/extension/Android.bp b/fingerprint/extension/Android.bp
new file mode 100644
index 00000000..fa2f13e3
--- /dev/null
+++ b/fingerprint/extension/Android.bp
@@ -0,0 +1,15 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["device_google_gs101_license"],
+}
+
+sh_binary {
+ name: "fingerprint.extension.sh",
+ init_rc: ["init.fingerprint.extension.rc"],
+ src: "fingerprint.extension.sh",
+ system_ext_specific: true,
+}
diff --git a/fingerprint/extension/fingerprint.extension.mk b/fingerprint/extension/fingerprint.extension.mk
new file mode 100644
index 00000000..1ef23746
--- /dev/null
+++ b/fingerprint/extension/fingerprint.extension.mk
@@ -0,0 +1,11 @@
+# Fingerprint extension feature
+ifneq (,$(filter userdebug, $(TARGET_BUILD_VARIANT)))
+SOONG_CONFIG_fp_hal_feature += report_bug_support
+SOONG_CONFIG_fp_hal_feature_report_bug_support := true
+BOARD_SEPOLICY_DIRS += hardware/google/pixel-sepolicy/fingerprint-extension/vendor/
+SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS += hardware/google/pixel-sepolicy/fingerprint-extension/system_ext/public/
+SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS += hardware/google/pixel-sepolicy/fingerprint-extension/system_ext/private/
+PRODUCT_PACKAGES += \
+ fps_ext_bug_lib \
+ fingerprint.extension.sh
+endif
diff --git a/fingerprint/extension/fingerprint.extension.sh b/fingerprint/extension/fingerprint.extension.sh
new file mode 100644
index 00000000..cceae9f8
--- /dev/null
+++ b/fingerprint/extension/fingerprint.extension.sh
@@ -0,0 +1,63 @@
+#!/system/bin/sh
+
+# BetterBug required fields
+am='am start -a com.google.android.apps.betterbug.intent.FILE_BUG_DEEPLINK --ez EXTRA_DEEPLINK true '
+issueTitle=' --es EXTRA_ISSUE_TITLE '
+additionalComment=' --es EXTRA_ADDITIONAL_COMMENT '
+componentId=' --el EXTRA_COMPONENT_ID '
+requireBugReport=' --ez EXTRA_REQUIRE_BUGREPORT '
+bugAssign=' --es EXTRA_BUG_ASSIGNEE '
+ccGroup=' --es EXTRA_CC '
+
+# BetterBug title
+kAuthTitle="UDFPS Fingerprint authentication has high failed rate"
+kLockoutTitle="UDFPS Fingerprint has too many lockout counts"
+kLatencyTitle="UDFPS Fingerprint took long to unlock device"
+
+# BetterBug context comment
+kAuthComment="This bug is auto created by fingerprint HAL to track fingerprint authentication"
+kLockoutComment="This bug is auto created by fingerprint HAL to track fingerprint lockout"
+kLatencyComment="This bug is auto created by fingerprint HAL to track fingerprint latency"
+
+# BetterBug assign & CC owner
+kBugAssign='udfps_data_study@google.com'
+kCcGroup='eddielan@google.com'
+kComponentId='817555'
+
+# Command to send intent to BetterBug
+commonCommand="$componentId ${kComponentId//\ /\\ }
+ $requireBugReport true
+ $bugAssign ${kBugAssign//\ /\\ }
+ $ccGroup ${kCcGroup//\ /\\ }"
+authCommand="$am $issueTitle ${kAuthTitle//\ /\\ }
+ $additionalComment ${kAuthComment//\ /\\ }"
+lockoutCommand="$am $issueTitle ${kLockoutTitle//\ /\\ }
+ $additionalComment ${kLockoutComment//\ /\\ }"
+latencyCommand="$am $issueTitle ${kLatencyTitle//\ /\\ }
+ $additionalComment ${kLatencyComment//\ /\\ }"
+
+# Type of bug being triggered
+# 1. Latency
+# 2. Lockout
+# 3. Finerprint authentication(FRR)
+bug_type="$1"
+
+send=1
+if [ "$bug_type" == "latency" ]; then
+ intentCommand="$latencyCommand $commonCommand"
+elif [ "$bug_type" == "lockout" ]; then
+ intentCommand="$lockoutCommand $commonCommand"
+elif [ "$bug_type" == "auth" ]; then
+ intentCommand="$authCommand $commonCommand"
+else
+ send=0
+ echo "Unknown bug_type $bug_type"
+fi
+
+if [ $send -eq 1 ]
+then
+ eval $intentCommand
+fi
+
+# Exit
+exit 0
diff --git a/fingerprint/extension/init.fingerprint.extension.rc b/fingerprint/extension/init.fingerprint.extension.rc
new file mode 100644
index 00000000..9277ce09
--- /dev/null
+++ b/fingerprint/extension/init.fingerprint.extension.rc
@@ -0,0 +1,19 @@
+# init-fingerprint-extension-sh is to send intent command to app
+# for tracking fingerprint issue.
+service fingerprint-extension-bug-latency /system_ext/bin/fingerprint.extension.sh latency
+ group shell
+ user shell
+ disabled
+ oneshot
+
+service fingerprint-extension-bug-lockout /system_ext/bin/fingerprint.extension.sh lockout
+ group shell
+ user shell
+ disabled
+ oneshot
+
+service fingerprint-extension-bug-auth /system_ext/bin/fingerprint.extension.sh auth
+ group shell
+ user shell
+ disabled
+ oneshot
diff --git a/fingerprint/fpc1540/fp_tool/Android.bp b/fingerprint/fpc1540/fp_tool/Android.bp
new file mode 100644
index 00000000..8b95194d
--- /dev/null
+++ b/fingerprint/fpc1540/fp_tool/Android.bp
@@ -0,0 +1,28 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["device_google_gs101_license"],
+}
+
+cc_binary {
+ srcs: [
+ "fp_test.cpp"
+ ],
+ include_dirs: [
+ "device/google/gs101/fingerprint/fpc1540/fp_tool"
+ ],
+ name: "fp_test",
+ shared_libs: [
+ "liblog",
+ "libdl",
+ "libutils",
+ "libcutils",
+ "libhidlbase",
+ "android.hardware.biometrics.fingerprint@2.1"
+ ],
+ proprietary:true,
+
+}
diff --git a/fingerprint/fpc1540/fp_tool/fp_test.cpp b/fingerprint/fpc1540/fp_tool/fp_test.cpp
new file mode 100644
index 00000000..f7e76771
--- /dev/null
+++ b/fingerprint/fpc1540/fp_tool/fp_test.cpp
@@ -0,0 +1,200 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <log/log.h>
+#include "fp_test.h"
+#include <cutils/properties.h>
+
+#define TAG "[FP_TEST] "
+#define LOGI(format,...) ALOGI(TAG format,##__VA_ARGS__)
+#define LOGD(format,...) ALOGD(TAG format,##__VA_ARGS__)
+#define LOGE(format,...) ALOGE(TAG format,##__VA_ARGS__)
+#define CLOGI(format,...) printf(TAG format,##__VA_ARGS__)
+#define CLOGD(format,...) printf(TAG format,##__VA_ARGS__)
+#define CLOGE(format,...) printf(TAG format,##__VA_ARGS__)
+
+#define LOGI_BOTH(format,...) { \
+ ALOGI(TAG format,##__VA_ARGS__) \
+ prinft(TAG format, ##__VA_ARGS__) \
+} \
+
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
+#define STRING_SIZE 32
+
+#define FPS_SRV_PROP "fps_hal"
+#define FPS_SRV_FULL_PROP "init.svc.fps_hal"
+#define FPS_SRV_STATUS_PROP "vendor.fp.status"
+
+enum ErrorType {
+ OK,
+ ERROR
+};
+
+static const char* const cmdUsage[] = {
+ "-------fp_test tool usage--------",
+ "fp_test -e: Enable FPS service",
+ "fp_test -d: Disable FPS service",
+ "fp_test -i: Idle Mode",
+ "fp_test -n: Navigation Mode",
+ "fp_test -a: Authentication Mode",
+ "---------------------------------",
+};
+
+void toolUsage(void) {
+ int numCmdUsage = ARRAY_SIZE(cmdUsage);
+ for(int i = 0; i< numCmdUsage; i++)
+ CLOGI("%s\n",cmdUsage[i]);
+}
+
+int checkParameter(int num, char **strArray)
+{
+ int ret = 0;
+ char parameter[STRING_SIZE] = {0,};
+ if (num != 2 || (strlen(strArray[1]) > STRING_SIZE)) {
+ return -ERROR;
+ }
+ strcpy(parameter, strArray[1]);
+ if (!strncmp(parameter, "-a", sizeof("-a"))) {
+ CLOGI("Start Authentication Mode!\n");
+ LOGI("Start Authentication Mode!\n");
+ ret = 'a';
+ } else if (!strncmp(parameter, "-n", sizeof("-n"))) {
+ CLOGI("Start Navigation Mode!\n");
+ LOGI("Start Navigation Mode!\n");
+ ret = 'n';
+ } else if (!strncmp(parameter, "-i", sizeof("-i"))) {
+ CLOGI("Start Idle Mode!\n");
+ LOGI("Start Idle Mode!\n");
+ ret = 'n';
+ } else if (!strncmp(parameter, "-e", sizeof("-e"))) {
+ CLOGI("Start enabling FPS service!\n");
+ LOGI("Start enabling FPS service!\n");
+ ret = 'e';
+ } else if (!strncmp(parameter, "-d", sizeof("-d"))) {
+ CLOGI("Start disabling FPS service!\n");
+ LOGI("Start disabling FPS service!\n");
+ ret = 'd';
+ } else {
+ ret = -ERROR;
+ }
+ return ret;
+}
+
+int enable_disable_fps(bool set)
+{
+ int ret = 0;
+ // Set property to enable/disable fingerprint service
+ if (set == true) {
+ ret = property_set("ctl.start", FPS_SRV_PROP);
+ } else {
+ ret = property_set("ctl.stop", FPS_SRV_PROP);
+ }
+
+ if (ret != 0) {
+ CLOGE("Failed to %s FPS service\n", set? "enable" : "disable");
+ LOGE("Failed to %s FPS service\n", set? "enable" : "disable");
+ return -ERROR;
+ }
+
+ return ret;
+}
+
+int run_auth_cmd() {
+ RequestStatus hidlRet;
+ uint64_t operationId = 0;
+ uint32_t gid = 0;
+ char tempbuf[PROPERTY_VALUE_MAX];
+
+ property_get(FPS_SRV_FULL_PROP, tempbuf, 0);
+ LOGE("%s : current fp service status is %s!\n",__func__, tempbuf);
+ if (!strncmp(tempbuf, "stopped", strlen("stopped"))) {
+ return -ERROR;
+ }
+
+ sp<IBiometricsFingerprint> service = IBiometricsFingerprint::getService();
+ if (service == nullptr) {
+ CLOGE("%s : Fail to get FingerprintService!\n",__func__);
+ LOGE("%s : Fail to get FingerprintService!\n",__func__);
+ return -ERROR;
+ }
+
+ hidlRet = service->authenticate(operationId, gid);
+ if (hidlRet == RequestStatus::SYS_OK) {
+ return OK;
+ } else {
+ return -ERROR;
+ }
+}
+
+int run_cancel_cmd() {
+
+ RequestStatus hidlRet;
+ char tempbuf[PROPERTY_VALUE_MAX];
+
+ property_get(FPS_SRV_FULL_PROP, tempbuf, 0);
+ LOGE("%s : current fp service status is %s!\n",__func__, tempbuf);
+ if (!strncmp(tempbuf, "stopped", strlen("stopped"))) {
+ return -ERROR;
+ }
+
+ sp<IBiometricsFingerprint> service = IBiometricsFingerprint::getService();
+ if (service == nullptr) {
+ CLOGE("%s : Fail to get FingerprintService!\n",__func__);
+ LOGE("%s : Fail to get FingerprintService!\n",__func__);
+ return -ERROR;
+ }
+
+ hidlRet = service->cancel();
+ if (hidlRet == RequestStatus::SYS_OK) {
+ return OK;
+ } else {
+ return -ERROR;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ int input=0;
+ int32_t ret = 0;
+ LOGI("%s",__func__);
+ input = checkParameter(argc, argv);
+ if (input == -ERROR){
+ LOGE("Invalid Parameter\n");
+ CLOGE("Invalid Parameter\n");
+ toolUsage();
+ return -ERROR;
+ }
+
+ switch (input) {
+ case 'e':
+ CLOGI("%s: Enable fingerprint service\n",__func__);
+ LOGI("%s: Enable fingerprint service\n",__func__);
+ ret = enable_disable_fps(true);
+ break;
+ case 'd':
+ CLOGI("%s: Disable fingerprint service\n",__func__);
+ LOGI("%s: Disable fingerprint service\n",__func__);
+ ret = enable_disable_fps(false);
+ break;
+ case 'a':
+ ret = run_auth_cmd();
+ break;
+ // For the rear fingerprint module, calling cancel() will go to the
+ // navigation mode by default.
+ // For other device not enabling naivgation feature, default mode will
+ // be "Idle" by invoking cancel().
+ case 'n':
+ case 'i':
+ default:
+ ret = run_cancel_cmd();
+ break;
+ }
+
+ if (ret != OK)
+ CLOGE("FP HIDL fail to excute cmd '%c'\n", input);
+ else
+ CLOGI("FP HIDL excute cmd '%c' successfully\n", input);
+
+ return ret;
+
+}
+
diff --git a/fingerprint/fpc1540/fp_tool/fp_test.h b/fingerprint/fpc1540/fp_tool/fp_test.h
new file mode 100644
index 00000000..15b3311d
--- /dev/null
+++ b/fingerprint/fpc1540/fp_tool/fp_test.h
@@ -0,0 +1,16 @@
+#ifndef FP_TEST
+#define FP_TEST
+
+#include <android/hardware/biometrics/fingerprint/2.1/IBiometricsFingerprint.h>
+#include <android/hardware/biometrics/fingerprint/2.1/IBiometricsFingerprintClientCallback.h>
+
+using android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprint;
+using android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprintClientCallback;
+using android::hardware::biometrics::fingerprint::V2_1::RequestStatus;
+using android::sp;
+
+
+int main(int argc, char *argv[]);
+void toolUsage(void);
+
+#endif //FP_TEST
diff --git a/fingerprint/fpc1540/sw33/fingerprint_aidl_config.mk b/fingerprint/fpc1540/sw33/fingerprint_aidl_config.mk
new file mode 100644
index 00000000..1697ce55
--- /dev/null
+++ b/fingerprint/fpc1540/sw33/fingerprint_aidl_config.mk
@@ -0,0 +1,18 @@
+# ----------------------------
+# Add feature flags below
+# ----------------------------
+FPC_CONFIG_BUILD_VERSION=33_aidl
+FPC_CONFIG_GOOGLE_CUSTOMIZE=1
+FPC_CONFIG_MAX_NR_TEMPLATES=5
+FPC_CONFIG_NAVIGATION=1
+FPC_CONFIG_SENSE_TOUCH_CALIBRATION_PATH=/data/fpc/calibration_sense_touch.dat
+FPC_CONFIG_SENSORTEST=1
+FPC_CONFIG_TA_FS=1
+FPC_DEFECTIVE_PIXEL_LIST_SIZE=5000
+FPC_HAL_SHARED_LIB=1
+FPC_SENSOR_SDK_LOG_LEVEL=3
+FPC_TEE_RUNTIME=TRUSTY
+LIBFPC_NAME=libfpc1541_S_nav_debug.a
+FPC_CONFIG_DEBUG=1
+FPC_CONFIG_ENGINEERING=1
+FPC_CONFIG_PRODUCT_DEFAULT=FPC_PRODUCT_TYPE1541_S
diff --git a/fingerprint/fpc1540/sw33/fingerprint_hidl_config_factory.mk b/fingerprint/fpc1540/sw33/fingerprint_hidl_config_factory.mk
new file mode 100644
index 00000000..642a0bfe
--- /dev/null
+++ b/fingerprint/fpc1540/sw33/fingerprint_hidl_config_factory.mk
@@ -0,0 +1,20 @@
+# ----------------------------
+# Add feature flags below
+# ----------------------------
+FPC_CONFIG_BUILD_VERSION=33
+FPC_CONFIG_CAPACITIVE=1
+FPC_CONFIG_MAX_NR_TEMPLATES=5
+FPC_CONFIG_NAVIGATION=0
+FPC_CONFIG_SENSE_TOUCH_CALIBRATION_PATH=/data/fpc/calibration_sense_touch.dat
+FPC_CONFIG_SENSORTEST=1
+FPC_CONFIG_TA_FS=1
+FPC_DEFECTIVE_PIXEL_LIST_SIZE=5000
+FPC_SENSOR_SDK_LOG_LEVEL=3
+FPC_TEE_RUNTIME=TRUSTY
+LIBFPC_NAME=libfpc1541_S_nav_debug.a
+FPC_CONFIG_DEBUG=1
+FPC_CONFIG_ENGINEERING=1
+FPC_CONFIG_PRODUCT_DEFAULT=FPC_PRODUCT_TYPE1541_S
+
+# Google configuration
+GOOGLE_CONFIG_FP_STATUS=1
diff --git a/fingerprint/fpc1540/sw33/fpc1540.mk b/fingerprint/fpc1540/sw33/fpc1540.mk
new file mode 100644
index 00000000..7aff143a
--- /dev/null
+++ b/fingerprint/fpc1540/sw33/fpc1540.mk
@@ -0,0 +1,30 @@
+# Factory build, use HIDL hal & extension so that we can use Test tool
+ifneq ( ,$(findstring factory, $(TARGET_PRODUCT)))
+include device/google/gs101/fingerprint/fpc1540/sw33/fingerprint_hidl_config_factory.mk
+PRODUCT_PACKAGES += \
+ android.hardware.biometrics.fingerprint@2.1-service.fpc \
+ fpc_tee_test\
+ SensorTestTool \
+ ImageTool \
+ ImageCollection \
+ fp_test \
+
+PRODUCT_PACKAGES += \
+ com.fingerprints.extension.xml \
+ com.fingerprints.extension \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml
+
+else
+# Non facotry build, use fingerprint AIDL version
+include device/google/gs101/fingerprint/fpc1540/sw33/fingerprint_aidl_config.mk
+
+PRODUCT_PACKAGES += \
+ android.hardware.biometrics.fingerprint-service.fpc \
+ fingerprint.fpc \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml
+
+endif
diff --git a/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk b/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
new file mode 100644
index 00000000..1880f604
--- /dev/null
+++ b/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
@@ -0,0 +1,26 @@
+# ----------------------------
+# Add feature flags below
+# ----------------------------
+FPC_BUILD_ID='ff334fee0631b7d5e424e22d18287f4f'
+FPC_CONFIG_BUILD_VERSION=35
+FPC_CONFIG_GOOGLE_CUSTOMIZE=1
+FPC_CONFIG_MAX_NR_TEMPLATES=5
+FPC_CONFIG_SENSE_TOUCH_CALIBRATION_PATH=/data/fpc/calibration_sense_touch.dat
+FPC_CONFIG_SENSORTEST=1
+FPC_CONFIG_TA_FS=1
+FPC_DEFECTIVE_PIXEL_LIST_SIZE=5000
+FPC_HAL_SHARED_LIB=1
+FPC_SENSOR_SDK_LOG_LEVEL=3
+FPC_TEE_RUNTIME=TRUSTY
+LIBFPC_NAME=libfpcmulti_debug.a
+FPC_CONFIG_DEBUG=1
+FPC_CONFIG_ENGINEERING=1
+
+FPC_CONFIG_GOOGLE_CUSTOMIZE=1
+GOOGLE_CONFIG_PERFORMANCE=1
+
+# Enable Suez
+$(call soong_config_set,fp_hal_feature,biometric_suez_support,true)
+
+# Must add below method to each project's device.mk to show sensorLocation
+#$(call soong_config_set,fp_hal_feature,pixel_product, project_XX)
diff --git a/fingerprint/fpc1540/sw35/fingerprint_hidl_config_factory.mk b/fingerprint/fpc1540/sw35/fingerprint_hidl_config_factory.mk
new file mode 100644
index 00000000..72ef96ce
--- /dev/null
+++ b/fingerprint/fpc1540/sw35/fingerprint_hidl_config_factory.mk
@@ -0,0 +1,20 @@
+# ----------------------------
+# Add feature flags below
+# ----------------------------
+FPC_BUILD_ID='ff334fee0631b7d5e424e22d18287f4f'
+FPC_CONFIG_BUILD_VERSION=35
+FPC_CONFIG_GOOGLE_CUSTOMIZE=1
+FPC_CONFIG_CAPACITIVE=1
+FPC_CONFIG_MAX_NR_TEMPLATES=5
+FPC_CONFIG_SENSE_TOUCH_CALIBRATION_PATH=/data/fpc/calibration_sense_touch.dat
+FPC_CONFIG_SENSORTEST=1
+FPC_CONFIG_TA_FS=1
+FPC_DEFECTIVE_PIXEL_LIST_SIZE=5000
+FPC_SENSOR_SDK_LOG_LEVEL=3
+FPC_TEE_RUNTIME=TRUSTY
+LIBFPC_NAME=libfpcmulti_debug.a
+FPC_CONFIG_DEBUG=1
+FPC_CONFIG_ENGINEERING=1
+
+# Google config
+GOOGLE_CONFIG_FP_STATUS=1
diff --git a/fingerprint/fpc1540/sw35/fpc1540.mk b/fingerprint/fpc1540/sw35/fpc1540.mk
new file mode 100644
index 00000000..03a93dcc
--- /dev/null
+++ b/fingerprint/fpc1540/sw35/fpc1540.mk
@@ -0,0 +1,30 @@
+# Factory build, use HIDL hal & extension so that we can use Test tool
+ifneq ( ,$(findstring factory, $(TARGET_PRODUCT)))
+include device/google/gs101/fingerprint/fpc1540/sw35/fingerprint_hidl_config_factory.mk
+PRODUCT_PACKAGES += \
+ android.hardware.biometrics.fingerprint@2.1-service.fpc \
+ fpc_tee_test\
+ SensorTestTool \
+ ImageTool \
+ ImageCollection \
+ fp_test \
+
+PRODUCT_PACKAGES += \
+ com.fingerprints.extension.xml \
+ com.fingerprints.extension \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml
+
+else
+# Non facotry build, use fingerprint AIDL version
+include device/google/gs101/fingerprint/fpc1540/sw35/fingerprint_aidl_config.mk
+
+PRODUCT_PACKAGES += \
+ android.hardware.biometrics.fingerprint-service.fpc35 \
+ fingerprint.fpc \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml
+
+endif
diff --git a/fingerprint/fpc1540/sw42/fingerprint_aidl_config.mk b/fingerprint/fpc1540/sw42/fingerprint_aidl_config.mk
new file mode 100644
index 00000000..fe8cf8ba
--- /dev/null
+++ b/fingerprint/fpc1540/sw42/fingerprint_aidl_config.mk
@@ -0,0 +1,28 @@
+# ----------------------------
+# Add feature flags below
+# ----------------------------
+FPC_CONFIG_BUILD_VERSION=42
+FPC_CONFIG_GOOGLE_CUSTOMIZE=1
+FPC_CONFIG_HAL_SHARED_LIB=1
+FPC_CONFIG_MAX_NR_TEMPLATES=5
+FPC_CONFIG_NO_TU=0
+FPC_CONFIG_SENSE_TOUCH_CALIBRATION_PATH=/data/fpc/calibration_sense_touch.dat
+FPC_CONFIG_SENSORTEST=1
+FPC_CONFIG_TA_FS=1
+FPC_DEFECTIVE_PIXEL_LIST_SIZE=5000
+FPC_OTP_DECODE_ERRORS_IGNORE=1
+FPC_SENSOR_SDK_LOG_LEVEL=3
+FPC_TEE_RUNTIME=TRUSTY
+LIBFPC_NAME=libfpcmulti_debug.a
+FPC_CONFIG_DEBUG=1
+FPC_CONFIG_ENGINEERING=1
+FPC_CONFIG_GOOGLE_RELEASE=1
+FPC_CONFIG_TRUSTY_CLEAN_TA=1
+
+GOOGLE_CONFIG_PERFORMANCE=1
+
+# Enable Suez
+$(call soong_config_set,fp_hal_feature,biometric_suez_support,true)
+
+# Must add below method to each project's device.mk to show sensorLocation
+#$(call soong_config_set,fp_hal_feature,pixel_product, project_XX)
diff --git a/fingerprint/fpc1540/sw42/fingerprint_hidl_config_factory.mk b/fingerprint/fpc1540/sw42/fingerprint_hidl_config_factory.mk
new file mode 100644
index 00000000..4b2567d8
--- /dev/null
+++ b/fingerprint/fpc1540/sw42/fingerprint_hidl_config_factory.mk
@@ -0,0 +1,18 @@
+# ----------------------------
+# Add feature flags below
+# ----------------------------
+FPC_CONFIG_BUILD_VERSION=42
+FPC_CONFIG_GOOGLE_CUSTOMIZE=1
+FPC_CONFIG_MAX_NR_TEMPLATES=5
+FPC_CONFIG_NO_TU=0
+FPC_CONFIG_SENSE_TOUCH_CALIBRATION_PATH=/data/fpc/calibration_sense_touch.dat
+FPC_CONFIG_SENSORTEST=1
+FPC_CONFIG_TA_FS=1
+FPC_DEFECTIVE_PIXEL_LIST_SIZE=5000
+FPC_OTP_DECODE_ERRORS_IGNORE=1
+FPC_SENSOR_SDK_LOG_LEVEL=3
+FPC_TEE_RUNTIME=TRUSTY
+LIBFPC_NAME=libfpcmulti_debug.a
+FPC_CONFIG_DEBUG=1
+FPC_CONFIG_ENGINEERING=1
+
diff --git a/fingerprint/fpc1540/sw42/fpc1540.mk b/fingerprint/fpc1540/sw42/fpc1540.mk
new file mode 100644
index 00000000..77705388
--- /dev/null
+++ b/fingerprint/fpc1540/sw42/fpc1540.mk
@@ -0,0 +1,30 @@
+# Factory build, use HIDL hal & extension so that we can use Test tool
+ifneq ( ,$(findstring factory, $(TARGET_PRODUCT)))
+include device/google/gs101/fingerprint/fpc1540/sw42/fingerprint_hidl_config_factory.mk
+PRODUCT_PACKAGES += \
+ android.hardware.biometrics.fingerprint@2.1-service.fpc \
+ fpc_tee_test\
+ SensorTestTool \
+ ImageTool \
+ ImageCollection \
+ fp_test \
+
+PRODUCT_PACKAGES += \
+ com.fingerprints.extension.xml \
+ com.fingerprints.extension \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml
+
+else
+# Non facotry build, use fingerprint AIDL version
+include device/google/gs101/fingerprint/fpc1540/sw42/fingerprint_aidl_config.mk
+
+PRODUCT_PACKAGES += \
+ android.hardware.biometrics.fingerprint-service.fpc42 \
+ fingerprint.fpc \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml
+
+endif
diff --git a/fingerprint/udfps_common.mk b/fingerprint/udfps_common.mk
new file mode 100644
index 00000000..9d413196
--- /dev/null
+++ b/fingerprint/udfps_common.mk
@@ -0,0 +1,38 @@
+#
+# Copyright (C) 2020 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.
+#
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.fingerprint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.fingerprint.xml
+
+# Fingerprint manifest
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+DEVICE_MANIFEST_FILE += \
+ device/google/gs101/fingerprint/vendor.goodix.hardware.biometrics.fingerprint@2.1-service.xml
+endif
+
+# Include the Goodix AIDL HAL namespaces.
+PRODUCT_SOONG_NAMESPACES += vendor/goodix/udfps/fp_utils
+ifeq ($(GOODIX_CONFIG_BUILD_VERSION), g6_trusty)
+PRODUCT_SOONG_NAMESPACES += vendor/goodix/udfps/g6_trusty
+PRODUCT_SOONG_NAMESPACES += vendor/goodix/udfps/g6_aidl_trusty
+else ifeq ($(GOODIX_CONFIG_BUILD_VERSION), g7_trusty)
+PRODUCT_SOONG_NAMESPACES += vendor/goodix/udfps/g7_trusty
+PRODUCT_SOONG_NAMESPACES += vendor/goodix/udfps/g7_aidl_trusty
+else
+$(error Invalid udfps build version)
+endif
+
+$(call soong_config_set,fp_hal_feature,biometric_suez_support,true)
diff --git a/fingerprint/udfps_factory.mk b/fingerprint/udfps_factory.mk
new file mode 100644
index 00000000..40993fb6
--- /dev/null
+++ b/fingerprint/udfps_factory.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2020 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.
+#
+
+PRODUCT_PACKAGES += \
+ android.hardware.biometrics.fingerprint@2.1-service.goodix \
+ GF_delmar_factory \
+ udfps_test
+
+PRODUCT_PROPERTY_OVERRIDES += \
+ gf.debug.dump_data=1
diff --git a/fingerprint/udfps_shipping.mk b/fingerprint/udfps_shipping.mk
new file mode 100644
index 00000000..ed88f66b
--- /dev/null
+++ b/fingerprint/udfps_shipping.mk
@@ -0,0 +1,18 @@
+#
+# Copyright (C) 2021 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.
+#
+
+PRODUCT_PACKAGES += \
+ android.hardware.biometrics.fingerprint-service.goodix
diff --git a/fingerprint/vendor.goodix.hardware.biometrics.fingerprint@2.1-service.xml b/fingerprint/vendor.goodix.hardware.biometrics.fingerprint@2.1-service.xml
new file mode 100644
index 00000000..e42448fa
--- /dev/null
+++ b/fingerprint/vendor.goodix.hardware.biometrics.fingerprint@2.1-service.xml
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="device">
+ <hal format="hidl">
+ <name>vendor.goodix.hardware.biometrics.fingerprint</name>
+ <transport>hwbinder</transport>
+ <version>2.1</version>
+ <interface>
+ <name>IGoodixFingerprintDaemon</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/firmware/BCM.btaddr b/firmware/BCM.btaddr
new file mode 100644
index 00000000..4bf70ebc
--- /dev/null
+++ b/firmware/BCM.btaddr
@@ -0,0 +1 @@
+22:22:3b:ff:0d:50
diff --git a/firmware/BCM4362A2_001.003.006.0027.0033.hcd b/firmware/BCM4362A2_001.003.006.0027.0033.hcd
new file mode 100644
index 00000000..27b0dbc2
--- /dev/null
+++ b/firmware/BCM4362A2_001.003.006.0027.0033.hcd
Binary files differ
diff --git a/firmware/BCM4389C0_003.001.010.0101.0000_Google_eval_USI_ES10.hcd b/firmware/BCM4389C0_003.001.010.0101.0000_Google_eval_USI_ES10.hcd
new file mode 100644
index 00000000..8e73e471
--- /dev/null
+++ b/firmware/BCM4389C0_003.001.010.0101.0000_Google_eval_USI_ES10.hcd
Binary files differ
diff --git a/firmware/BCM4389C1_003.002.009.0050.0000_Google_eval_USI_ES10_ePA_Updated.hcd b/firmware/BCM4389C1_003.002.009.0050.0000_Google_eval_USI_ES10_ePA_Updated.hcd
new file mode 100644
index 00000000..47120b34
--- /dev/null
+++ b/firmware/BCM4389C1_003.002.009.0050.0000_Google_eval_USI_ES10_ePA_Updated.hcd
Binary files differ
diff --git a/gnss/47765/Android.bp b/gnss/47765/Android.bp
new file mode 100644
index 00000000..47ac1685
--- /dev/null
+++ b/gnss/47765/Android.bp
@@ -0,0 +1,232 @@
+// Copyright (C) 2020 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.
+
+soong_namespace {
+}
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+cc_prebuilt_library_shared {
+ name: "android.hardware.gnss@2.1-impl-google",
+ arch: {
+ arm64: {
+ srcs: ["bin/android.hardware.gnss@2.1-impl-google.so"],
+ shared_libs: [
+ "liblog",
+ "libhidlbase",
+ // "libhidltransport",
+ "libutils",
+ "android.hardware.gnss@1.0",
+ "android.hardware.gnss@1.1",
+ "android.hardware.gnss@2.0",
+ "android.hardware.gnss@2.1",
+ "android.hardware.gnss.measurement_corrections@1.0",
+ "android.hardware.gnss.visibility_control@1.0",
+ "android.hardware.gnss-V2-ndk",
+ "libhardware",
+ "libc++",
+ "libc",
+ "libm",
+ "libdl",
+ ],
+ },
+ },
+ compile_multilib: "64",
+ vendor: true,
+ relative_install_path: "hw",
+ strip: {
+ none: true,
+ },
+ // Bypass because libhidltransport is deprecated
+ check_elf_files: false,
+}
+
+cc_prebuilt_binary {
+ name: "android.hardware.gnss@2.1-service-brcm",
+ arch: {
+ arm64: {
+ srcs: ["bin/android.hardware.gnss@2.1-service-brcm"],
+ shared_libs: [
+ "liblog",
+ "libutils",
+ "libhardware",
+ "android.hardware.gnss@1.0",
+ "libhidlbase",
+ // "libhidltransport",
+ // "libhwbinder",
+ "android.hardware.gnss@1.1",
+ "android.hardware.gnss@2.0",
+ "android.hardware.gnss@2.1",
+ "android.hardware.gnss-V2-ndk",
+ "libc++",
+ "libc",
+ "libm",
+ "libdl",
+ ],
+ },
+ },
+ compile_multilib: "64",
+ vendor: true,
+ relative_install_path: "hw",
+ strip: {
+ none: true,
+ },
+ // Bypass because libhidltransport is deprecated
+ // Bypass because libhwbinder is deprecated
+ check_elf_files: false,
+ vintf_fragments: ["android.hardware.gnss@2.1-service-brcm.xml"]
+}
+
+cc_prebuilt_library_shared {
+ name: "flp.default",
+ arch: {
+ arm64: {
+ srcs: ["bin/flp.default.so"],
+ shared_libs: [
+ "liblog",
+ "libcutils",
+ "libutils",
+ "libc++",
+ "libc",
+ "libm",
+ "libdl",
+ ],
+ },
+ },
+ compile_multilib: "64",
+ vendor: true,
+ relative_install_path: "hw",
+ strip: {
+ none: true,
+ },
+ // Bypass because soname mismatch
+ check_elf_files: false,
+}
+
+cc_prebuilt_binary {
+ name: "gpsd",
+ arch: {
+ arm64: {
+ srcs: ["bin/gpsd"],
+ shared_libs: [
+ "liblog",
+ "libutils",
+ "libhardware_legacy",
+ "libcutils",
+ "libssl",
+ "libcrypto",
+ // "libsitril-gps",
+ "android.frameworks.sensorservice@1.0",
+ "libhidlbase",
+ "libandroid_net",
+ "libc++",
+ "libc",
+ "libm",
+ "libdl",
+ ],
+ },
+ },
+ compile_multilib: "64",
+ vendor: true,
+ relative_install_path: "hw",
+ strip: {
+ none: true,
+ },
+ // Bypass because libsitril-gps is Android.mk module
+ check_elf_files: false,
+}
+
+cc_prebuilt_library_shared {
+ name: "gps.default",
+ arch: {
+ arm64: {
+ srcs: ["bin/gps.default.so"],
+ shared_libs: [
+ "liblog",
+ "libcutils",
+ "libutils",
+ "libc++",
+ "libc",
+ "libm",
+ "libdl",
+ ],
+ },
+ },
+ compile_multilib: "64",
+ vendor: true,
+ relative_install_path: "hw",
+ strip: {
+ none: true,
+ },
+ // Bypass because soname mismatch
+ check_elf_files: false,
+}
+
+cc_prebuilt_binary {
+ name: "lhd",
+ arch: {
+ arm64: {
+ srcs: ["bin/lhd"],
+ shared_libs: [
+ "liblog",
+ "libutils",
+ "libhardware_legacy",
+ "libc++",
+ "libc",
+ "libm",
+ "libz",
+ "android.hardware.contexthub@1.0",
+ "libhidlbase",
+ "libdl",
+ ],
+ },
+ },
+ compile_multilib: "64",
+ vendor: true,
+ relative_install_path: "hw",
+ strip: {
+ none: true,
+ },
+}
+
+cc_prebuilt_binary {
+ name: "scd",
+ arch: {
+ arm64: {
+ srcs: ["bin/scd"],
+ shared_libs: [
+ "liblog",
+ "libutils",
+ "libssl",
+ "libcrypto",
+ "libandroid_net",
+ ],
+ },
+ },
+ compile_multilib: "64",
+ vendor: true,
+ relative_install_path: "hw",
+ strip: {
+ none: true,
+ },
+}
diff --git a/gnss/47765/android.hardware.gnss@2.1-service-brcm.xml b/gnss/47765/android.hardware.gnss@2.1-service-brcm.xml
new file mode 100644
index 00000000..97538b88
--- /dev/null
+++ b/gnss/47765/android.hardware.gnss@2.1-service-brcm.xml
@@ -0,0 +1,7 @@
+<manifest version="1.0" type="device">
+ <hal format="aidl">
+ <name>android.hardware.gnss</name>
+ <version>2</version>
+ <fqname>IGnss/default</fqname>
+ </hal>
+</manifest>
diff --git a/gnss/47765/bin/android.hardware.gnss@2.1-impl-google.so b/gnss/47765/bin/android.hardware.gnss@2.1-impl-google.so
new file mode 100755
index 00000000..b3295e3a
--- /dev/null
+++ b/gnss/47765/bin/android.hardware.gnss@2.1-impl-google.so
Binary files differ
diff --git a/gnss/47765/bin/android.hardware.gnss@2.1-service-brcm b/gnss/47765/bin/android.hardware.gnss@2.1-service-brcm
new file mode 100755
index 00000000..a42f6ebf
--- /dev/null
+++ b/gnss/47765/bin/android.hardware.gnss@2.1-service-brcm
Binary files differ
diff --git a/gnss/47765/bin/flp.default.so b/gnss/47765/bin/flp.default.so
new file mode 100755
index 00000000..fbf5a12c
--- /dev/null
+++ b/gnss/47765/bin/flp.default.so
Binary files differ
diff --git a/gnss/47765/bin/gps.default.so b/gnss/47765/bin/gps.default.so
new file mode 100755
index 00000000..d1af0d2d
--- /dev/null
+++ b/gnss/47765/bin/gps.default.so
Binary files differ
diff --git a/gnss/47765/bin/gpsd b/gnss/47765/bin/gpsd
new file mode 100755
index 00000000..b3989790
--- /dev/null
+++ b/gnss/47765/bin/gpsd
Binary files differ
diff --git a/gnss/47765/bin/lhd b/gnss/47765/bin/lhd
new file mode 100755
index 00000000..fb0d3490
--- /dev/null
+++ b/gnss/47765/bin/lhd
Binary files differ
diff --git a/gnss/47765/bin/scd b/gnss/47765/bin/scd
new file mode 100755
index 00000000..1b2f1369
--- /dev/null
+++ b/gnss/47765/bin/scd
Binary files differ
diff --git a/gnss/47765/config/gps.cer b/gnss/47765/config/gps.cer
new file mode 100644
index 00000000..934e0c5c
--- /dev/null
+++ b/gnss/47765/config/gps.cer
@@ -0,0 +1,161 @@
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFZTCCA02gAwIBAgIPAWv6o5fPZQ5hxva1vuNrMA0GCSqGSIb3DQEBCwUAMDgx
+CzAJBgNVBAYTAkpQMRcwFQYDVQQKDA5SYWt1dGVuIE1vYmlsZTEQMA4GA1UEAwwH
+Um9vdCBDQTAeFw0xOTA3MTYxMTU1NDJaFw0yOTA3MTMxMTU1NDJaMD4xCzAJBgNV
+BAYTAkpQMRcwFQYDVQQKEw5SYWt1dGVuIE1vYmlsZTEWMBQGA1UEAxMNREMgSXNz
+dWluZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAObjAbQ8TkzF
+A+/WvSE6fzDf+rlvBKY1dJJbiJ2/j0lc+tj56dE7+BhZ2JVmAYIYfEoUw69dwxTR
+44EdZln3ZVFmMuOdfxvF9A46pMKzH1skr8ErDgjNyJ9f/JOuQ29p/7BvLC55aRzk
+yj99BYdzJWKs+5W7jQlv7/HyJ/PQ+rUEBOx4o/YiTucDFduWdV6/x5mcEbKD3ufL
+66vUEf3MHGegDkOWAMTchl1RmaYDlf3IMsXC7M2bFPFa/9y/vzaaY6EhnJ861co6
+rkOhTZe/kJZwqQYFmWczBPZK/9zRy3C1zA09tCBk+CDNBrNXe+3dMLFmnW4npxUQ
+oceTPhaaDo5lA6HkkARwVWLrporFZ2B/th2Bqtu6uObLSB6JMA2jxmKwKukM8/jp
+C9tKV9X03rHQIQultc63rivPdgQvqYgW1PVdzV1a3pZEMk5zv257+fxgfUGzfUh7
+tx0OY+BkykSP6ZK/BsbI/BY+rsS0L/0lmC22NU1p+qVeN3ZRHoqntB+FymaBfQ3/
+yfKkDNfnMua5GzLyyYGYUDDx71rtfrs3hGDiwjvE4B0IvsU0E7Oerk5gLqx8t0q/
+MmhI+CJJS1bH2sRBMcqfRAv+eyByFsvLY7Er/ztveaabX9xEwyPNFOcU+SZMhipv
+EUKmUcOAHxzx4HbYEFyM0Z7WgUdlTd1xAgMBAAGjZjBkMB8GA1UdIwQYMBaAFPUI
+BlLFno+y5xdHlCX349iVyS75MB0GA1UdDgQWBBQzVhTSCf8F31Zf0Bu661qymMko
+JzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADANBgkqhkiG9w0B
+AQsFAAOCAgEADQEufjma/6fT/Do4Fh13lZhsowHSsGv5sFYly6224GsciE80ZwYg
+R4EK/TAR0jorBXsu6sQc51pZ5SSHhIxfo2frfprTPaaWN6cZwfrb6UcnD/FaZ1jP
+HzWrI3kRxG9JCDffzE8uMf8Rnc69n1j+TBerk4Ix3Zui2TaaF6LVceJ4RgeNkZl0
+OFkGGFruHz/d83q7A6YjgN0iwMEabdtKH7Sq27LqGPeCS8NuGlrziNAxktdwaYlN
+D5t6ntM/1nHYPmVqdioEU9vAnyB3BiXOlITPHEEMOSlItcUsJ6rN5DZJaJgkBxvN
+Qdi6wmaDlxy8XFyy4KGFKWAl17FlfpqW5VtYQJ4aDpibGlGqamg0vm+IJDIGPlOs
+KQcxG17cOw4MCflAtnzHKHBn52DegQKwxev2ZpqdwVw/NqPq0yTNEbCRqEyiq7+H
+ljKEFiEjEjeXTcqR4DoCseA5UgcriuriV0OCvr8KTlviV4FEUu+IA9ut8YIvf2of
+Zz0z8rO4H+Rb4tMi/yBRM09x3rEW4hXwO0qpCBNBa0wEJBxufF3f6l9efEle+YTR
+XS92gutaoVluqMfRSJckjwWokToi32/FvF79guZymD0qHkOSi5dewsIW7zsdobvv
+t2CWLfTAb9cx222ELBpVPkfcgUKfF4RCGWPzuAlK6OueuDrInOiz8ag=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFUjCCAzqgAwIBAgICBpAwDQYJKoZIhvcNAQELBQAwODELMAkGA1UEBhMCSlAx
+FzAVBgNVBAoMDlJha3V0ZW4gTW9iaWxlMRAwDgYDVQQDDAdSb290IENBMB4XDTE5
+MDcxNjEwNTkwMVoXDTM5MDcxNTEwNTkwMVowODELMAkGA1UEBhMCSlAxFzAVBgNV
+BAoMDlJha3V0ZW4gTW9iaWxlMRAwDgYDVQQDDAdSb290IENBMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAqiPMbNudotG8afkk5Fwo2QdDcFFmC+qGpGjw
+yQs57QtGPRk1HsIhZFfr6zn8t1tZw6Zo+A0biFA7d2N93nYsseHBy/bZlhhOL+Js
+Jb907UM09L5xaJIgnbFYVT1QjtB7ksLAy3rHpdSKiggfT1ynwM/u6wIdWRSx24QU
+Vxpq5iFpVj041+/RnpCPASL5pSnbYZKQyOb/XsOaR+hz7aSjwiUzk2cRjAmRqYxY
+qYVe135IAy377inJRtUPvi3IhtmUHJToiMLBH5tChkjkIpdRG1lVIj4vGdzrIb+Q
+Kvg/k7BDVZ3sstsLvJ8evNonBzrqcr80ek/X+HFrgY/3M1VEru4ohLAiA877CuuG
+UAfrxFh9qjP1yue+dlrQWk+WHMbGMzKI1zCKEMphJatyNHfpRtD8LUWtLV96DD78
+qLwQwrSYrEMd2u/akeBFKINYWqpqkVBhSsV3eukXVIdSbtSAxZNv+4m6QddEcUvG
+2ZLf+yCf2tl+LPGXNL08vwMVbQqcDw8m+nDP4vu0VUixddyoqnnDlWOoQESuQFQ1
+IqYFQhRPs2dFRf5TJzkmbqRUXbaPxsrKGjTtVpPgENbv40nyRGyBbl1CzqpBFEp5
+7w4MPYDIzWKYbRyCnUE5WScRBFmym7242KA3SOfkylzGMb8KGJxohVME+7oMbNf5
+EjLWVgECAwEAAaNmMGQwHwYDVR0jBBgwFoAU9QgGUsWej7LnF0eUJffj2JXJLvkw
+HQYDVR0OBBYEFPUIBlLFno+y5xdHlCX349iVyS75MA4GA1UdDwEB/wQEAwIBBjAS
+BgNVHRMBAf8ECDAGAQH/AgEBMA0GCSqGSIb3DQEBCwUAA4ICAQCDGIeYrtivFt3p
+8k5vXKFUT072C7wMvfrAGYCYgIdUthWCqJoMwnG3Fsg7Ngu70La7ESBzEKpnpPWz
+eIdnREJkNP9iqiKHXnaUV2P/21AS1q6enVKBFOl7dYiVjqOZ+vac3a1UjLWkvm0g
+x4sg/f3PpiEzZM7ecnQYk2wfMSq8Jw0w1Lf0SEeoYZTkf12cqSJVSa/G7gEdL/Cn
+LO3yyBq0KPNdd87eIfvCLJj55UJ5dCr0JXRTUteBvJwflbPXmOqfI8fA05fwlJZS
+o1SBpMI9cEBwaPXQM9CPNKaWLvyOR1KpviRzbCnaKf44Fs2OuZboo3avZrC9eUoU
+HU2HKXRj8UMRlFeCdNugbOdGyK+CpXwMHVtIrtpf0iOUqo0rOekgnUSNi9qyjD1g
+IV3Y/NLVl9fqe8q66IWUn8NYndxigMKWcMCBFUjfP0yMZeqSHFiIv7zk9PuV/62k
+Yele7cK9iHnEUwWBj6VCEs6pZBS1QSmhRw3GWlSDc/gHXd38PG20zH7xg4z2H9Rc
+Op9P1ZW2kjqv5D2+q/qtaePAyHn3B05UZrQYUmx7LaHNO7op6dZgCdoR0sVsR+Fc
+Zyr0AhgiuTWrjtUEOGx2qJVwAsHkpqtlN+DaGT08dT64LvIf0bfGvmtm++/WEDWJ
+HInwg85pGm+sEkYbYFRBD0woPBsL3g==
+-----END CERTIFICATE-----
diff --git a/gnss/47765/config/gps.xml b/gnss/47765/config/gps.xml
new file mode 100644
index 00000000..8b531e05
--- /dev/null
+++ b/gnss/47765/config/gps.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<glgps xmlns="http://www.glpals.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.glpals.com/ glconfig.xsd" >
+ <hal
+ PortName="/dev/ttyBCM"
+ BaudRate="921600"
+ GpioNStdbyPath="/sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby"
+ CustGpioDelayMs="250"
+ LogEnabled="true"
+ Log="JAVA"
+ SecondaryConfigPath="/data/vendor/gps/overlay/gps_overlay.xml"
+ LogDirectory="/sdcard/gps/broadcom/storage/"
+ CtrlPipe="/data/vendor/gps/glgpsctrl"
+ NmeaOutName="/data/vendor/gps/nmea_out"
+
+ acSuplServer="supl.google.com"
+ SuplPort="7275"
+ SuplLogEnable="true"
+ SuplLogFullName="/data/vendor/gps/suplflow.txt"
+ tlsEnable="true"
+
+ SuplSslMethod="SSLv23_NO_TLSv1_2"
+ SuplEnable="true"
+ SuplUseApn="false"
+ SuplUseApnNI="true"
+ SuplDummyCellInfo="true"
+ SuplUseFwCellInfo="false"
+ SuplTlsCertDirPath="/etc/security/cacerts"
+ SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
+ SuplUT1Seconds="20"
+ SuplUT2Seconds="20"
+ SuplUT3Seconds="20"
+ TcpConnectionTimeout="20"
+ SuplLppCapable="true"
+ SuplEcidCapable="true"
+ SuplVersion="2"
+ SuplMinorVersion="0"
+ SuplOtdoaCapable="true"
+ SuplOtdoaCapable2="true"
+ SuplGlonassCapable = "true"
+ SuplGalileoCapable = "true"
+ SuplBdsCapable = "true"
+ SuplMgpsCapable = "true"
+
+ RtoEnable="true"
+ RtiEnable="true"
+ HttpSyncLto="true"
+ LtoFileName="lto2.dat"
+ LtoDir="/data/vendor/gps/"
+ LtoSyncThresholdDays="1"
+
+ GnssYearOfHardware="2020"
+ CpGuardTimeSec="1"
+ CpLppGuardTimeSec="1"
+ IgnoreInjectedSystemTime="true"
+
+ AttributionAppPkgName="com.google.android.carrierlocation"
+
+ AssertEnabled="true"
+ CpLppeCancelDbhOnAgnssProvideLoc="true"
+ CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
+ />
+
+ <gll
+ PpsEnable="true"
+ LogPriMask="LOG_INFO"
+ LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
+ FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
+ MultiCarrRFMode="GL_MULTI_CARR_RF_MODE_L1_L5"
+ MultiCarrLnaMask="L1_EXT_ON|L5_EXT_ON"
+ RfType="GL_RF_4776_BRCM"
+ ExtL5Bias="13.0"
+ EnableFilteringForLTEB13="true"
+
+ WarmStandbyTimeout1Seconds="10"
+ WarmStandbyTimeout2Seconds="15"
+
+ EnableGnssPropagateInStandby="true"
+
+ RfPathLossDb_Ap="3.5"
+ RfPathLossDb_Cp="3.5"
+ RfPathLossDb_Ap_L5="3.5"
+ RfPathLossDb_Cp_L5="3.5"
+ OnChipGpsCarrierType="3,2,3,3,2,3,2,3,3,3,1,2,1,3,2,1,2,3,1,1,1,1,3,3,3,3,3,1,2,3,2,3"
+
+ EnableOnChipStopNotification="2"
+ PowerMode="3"
+ MinGpsWeekNumber="2216"
+ />
+
+ <gll_features
+ EnableNicAutoSwitch="true"
+ EnableNavic="true"
+ />
+
+</glgps>
+
diff --git a/gnss/47765/config/gps.xml.oriole b/gnss/47765/config/gps.xml.oriole
new file mode 100644
index 00000000..d2550aff
--- /dev/null
+++ b/gnss/47765/config/gps.xml.oriole
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<glgps xmlns="http://www.glpals.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.glpals.com/ glconfig.xsd" >
+ <hal
+ PortName="/dev/ttyBCM"
+ BaudRate="921600"
+ GpioNStdbyPath="/sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby"
+ CustGpioDelayMs="250"
+ LogEnabled="true"
+ Log="JAVA"
+ SecondaryConfigPath="/data/vendor/gps/overlay/gps_overlay.xml"
+ LogDirectory="/sdcard/gps/broadcom/storage/"
+ CtrlPipe="/data/vendor/gps/glgpsctrl"
+ NmeaOutName="/data/vendor/gps/nmea_out"
+
+ acSuplServer="supl.google.com"
+ SuplPort="7275"
+ SuplLogEnable="true"
+ SuplLogFullName="/data/vendor/gps/suplflow.txt"
+ tlsEnable="true"
+
+ SuplSslMethod="SSLv23_NO_TLSv1_2"
+ SuplEnable="true"
+ SuplUseApn="false"
+ SuplUseApnNI="true"
+ SuplDummyCellInfo="true"
+ SuplUseFwCellInfo="false"
+ SuplTlsCertDirPath="/etc/security/cacerts"
+ SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
+ SuplUT1Seconds="20"
+ SuplUT2Seconds="20"
+ SuplUT3Seconds="20"
+ TcpConnectionTimeout="20"
+ SuplLppCapable="true"
+ SuplEcidCapable="true"
+ SuplVersion="2"
+ SuplMinorVersion="0"
+ SuplOtdoaCapable="true"
+ SuplOtdoaCapable2="true"
+ SuplGlonassCapable = "true"
+ SuplGalileoCapable = "true"
+ SuplBdsCapable = "true"
+ SuplMgpsCapable = "true"
+
+ RtoEnable="true"
+ RtiEnable="true"
+ HttpSyncLto="true"
+ LtoFileName="lto2.dat"
+ LtoDir="/data/vendor/gps/"
+ LtoSyncThresholdDays="1"
+
+ GnssYearOfHardware="2020"
+ CpGuardTimeSec="1"
+ CpLppGuardTimeSec="1"
+ IgnoreInjectedSystemTime="true"
+
+ AttributionAppPkgName="com.google.android.carrierlocation"
+
+ AssertEnabled="true"
+ CpLppeCancelDbhOnAgnssProvideLoc="true"
+ CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
+ />
+
+ <gll
+ PpsEnable="true"
+ LogPriMask="LOG_INFO"
+ LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
+ FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
+ MultiCarrRFMode="GL_MULTI_CARR_RF_MODE_L1_L5"
+ MultiCarrLnaMask="L1_EXT_ON|L5_EXT_ON"
+ RfType="GL_RF_4776_BRCM"
+ ExtL5Bias="9.3"
+ EnableFilteringForLTEB13="true"
+
+ WarmStandbyTimeout1Seconds="10"
+ WarmStandbyTimeout2Seconds="15"
+
+ EnableGnssPropagateInStandby="true"
+
+ RfPathLossDb_Ap="4.2"
+ RfPathLossDb_Cp="4.2"
+ RfPathLossDb_Ap_L5="4.1"
+ RfPathLossDb_Cp_L5="4.1"
+ OnChipGpsCarrierType="3,2,3,3,2,3,2,3,3,3,1,2,1,3,2,1,2,3,1,1,1,1,3,3,3,3,3,1,2,3,2,3"
+
+ EnableOnChipStopNotification="2"
+ PowerMode="3"
+ MinGpsWeekNumber="2216"
+ />
+
+ <gll_features
+ EnableNicAutoSwitch="true"
+ EnableNavic="true"
+ />
+
+</glgps>
+
diff --git a/gnss/47765/config/gps.xml.raven b/gnss/47765/config/gps.xml.raven
new file mode 100644
index 00000000..1b748e22
--- /dev/null
+++ b/gnss/47765/config/gps.xml.raven
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<glgps xmlns="http://www.glpals.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.glpals.com/ glconfig.xsd" >
+ <hal
+ PortName="/dev/ttyBCM"
+ BaudRate="921600"
+ GpioNStdbyPath="/sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby"
+ CustGpioDelayMs="250"
+ LogEnabled="true"
+ Log="JAVA"
+ SecondaryConfigPath="/data/vendor/gps/overlay/gps_overlay.xml"
+ LogDirectory="/sdcard/gps/broadcom/storage/"
+ CtrlPipe="/data/vendor/gps/glgpsctrl"
+ NmeaOutName="/data/vendor/gps/nmea_out"
+
+ acSuplServer="supl.google.com"
+ SuplPort="7275"
+ SuplLogEnable="true"
+ SuplLogFullName="/data/vendor/gps/suplflow.txt"
+ tlsEnable="true"
+
+ SuplSslMethod="SSLv23_NO_TLSv1_2"
+ SuplEnable="true"
+ SuplUseApn="false"
+ SuplUseApnNI="true"
+ SuplDummyCellInfo="true"
+ SuplUseFwCellInfo="false"
+ SuplTlsCertDirPath="/etc/security/cacerts"
+ SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
+ SuplUT1Seconds="20"
+ SuplUT2Seconds="20"
+ SuplUT3Seconds="20"
+ TcpConnectionTimeout="20"
+ SuplLppCapable="true"
+ SuplEcidCapable="true"
+ SuplVersion="2"
+ SuplMinorVersion="0"
+ SuplOtdoaCapable="true"
+ SuplOtdoaCapable2="true"
+ SuplGlonassCapable = "true"
+ SuplGalileoCapable = "true"
+ SuplBdsCapable = "true"
+ SuplMgpsCapable = "true"
+
+ RtoEnable="true"
+ RtiEnable="true"
+ HttpSyncLto="true"
+ LtoFileName="lto2.dat"
+ LtoDir="/data/vendor/gps/"
+ LtoSyncThresholdDays="1"
+
+ GnssYearOfHardware="2020"
+ CpGuardTimeSec="1"
+ CpLppGuardTimeSec="1"
+ IgnoreInjectedSystemTime="true"
+
+ AttributionAppPkgName="com.google.android.carrierlocation"
+
+ AssertEnabled="true"
+ CpLppeCancelDbhOnAgnssProvideLoc="true"
+ CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
+ />
+
+ <gll
+ PpsEnable="true"
+ LogPriMask="LOG_INFO"
+ LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
+ FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
+ MultiCarrRFMode="GL_MULTI_CARR_RF_MODE_L1_L5"
+ MultiCarrLnaMask="L1_EXT_ON|L5_EXT_ON"
+ RfType="GL_RF_4776_BRCM"
+ ExtL5Bias="10.6"
+ EnableFilteringForLTEB13="true"
+
+ WarmStandbyTimeout1Seconds="10"
+ WarmStandbyTimeout2Seconds="15"
+
+ EnableGnssPropagateInStandby="true"
+
+ RfPathLossDb_Ap="4.1"
+ RfPathLossDb_Cp="4.1"
+ RfPathLossDb_Ap_L5="4"
+ RfPathLossDb_Cp_L5="4"
+ OnChipGpsCarrierType="3,2,3,3,2,3,2,3,3,3,1,2,1,3,2,1,2,3,1,1,1,1,3,3,3,3,3,1,2,3,2,3"
+
+ EnableOnChipStopNotification="2"
+ PowerMode="3"
+ MinGpsWeekNumber="2216"
+ />
+
+ <gll_features
+ EnableNicAutoSwitch="true"
+ EnableNavic="true"
+ />
+
+</glgps>
+
diff --git a/gnss/47765/config/gps_user.xml b/gnss/47765/config/gps_user.xml
new file mode 100644
index 00000000..f125fe0f
--- /dev/null
+++ b/gnss/47765/config/gps_user.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<glgps xmlns="http://www.glpals.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.glpals.com/ glconfig.xsd" >
+ <hal
+ PortName="/dev/ttyBCM"
+ BaudRate="921600"
+ GpioNStdbyPath="/sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby"
+ CustGpioDelayMs="250"
+ LogEnabled="false"
+ Log="JAVA"
+ LogDirectory="/sdcard/gps/broadcom/storage/"
+ CtrlPipe="/data/vendor/gps/glgpsctrl"
+ NmeaOutName="/data/vendor/gps/nmea_out"
+
+ acSuplServer="supl.google.com"
+ SuplPort="7275"
+ SuplLogEnable="false"
+ SuplLogFullName="/data/vendor/gps/suplflow.txt"
+ tlsEnable="true"
+
+ SuplSslMethod="SSLv23_NO_TLSv1_2"
+ SuplEnable="true"
+ SuplUseApn="false"
+ SuplUseApnNI="true"
+ SuplDummyCellInfo="true"
+ SuplUseFwCellInfo="false"
+ SuplTlsCertDirPath="/etc/security/cacerts"
+ SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
+ SuplUT1Seconds="20"
+ SuplUT2Seconds="20"
+ SuplUT3Seconds="20"
+ TcpConnectionTimeout="20"
+ SuplLppCapable="true"
+ SuplEcidCapable="true"
+ SuplVersion="2"
+ SuplMinorVersion="0"
+ SuplOtdoaCapable="true"
+ SuplOtdoaCapable2="true"
+ SuplGlonassCapable = "true"
+ SuplGalileoCapable = "true"
+ SuplBdsCapable = "true"
+ SuplMgpsCapable = "true"
+
+ RtoEnable="true"
+ RtiEnable="true"
+ HttpSyncLto="true"
+ LtoFileName="lto2.dat"
+ LtoDir="/data/vendor/gps/"
+ LtoSyncThresholdDays="1"
+
+ GnssYearOfHardware="2020"
+ CpGuardTimeSec="1"
+ CpLppGuardTimeSec="1"
+ IgnoreInjectedSystemTime="true"
+
+ AttributionAppPkgName="com.google.android.carrierlocation"
+
+ AssertEnabled="false"
+ CpLppeCancelDbhOnAgnssProvideLoc="true"
+ CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
+ />
+
+ <gll
+ PpsEnable="true"
+ LogPriMask="LOG_INFO"
+ LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
+ FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
+ MultiCarrRFMode="GL_MULTI_CARR_RF_MODE_L1_L5"
+ MultiCarrLnaMask="L1_EXT_ON|L5_EXT_ON"
+ RfType="GL_RF_4776_BRCM"
+ ExtL5Bias="13.0"
+ EnableFilteringForLTEB13="true"
+
+ WarmStandbyTimeout1Seconds="10"
+ WarmStandbyTimeout2Seconds="15"
+
+ EnableGnssPropagateInStandby="true"
+
+ RfPathLossDb_Ap="3.5"
+ RfPathLossDb_Cp="3.5"
+ RfPathLossDb_Ap_L5="3.5"
+ RfPathLossDb_Cp_L5="3.5"
+ OnChipGpsCarrierType="3,2,3,3,2,3,2,3,3,3,1,2,1,3,2,1,2,3,1,1,1,1,3,3,3,3,3,1,2,3,2,3"
+
+ EnableOnChipStopNotification="false"
+ PowerMode="3"
+ MinGpsWeekNumber="2216"
+ />
+
+ <gll_features
+ EnableNicAutoSwitch="true"
+ EnableNavic="true"
+ />
+
+</glgps>
+
diff --git a/gnss/47765/config/gps_user.xml.oriole b/gnss/47765/config/gps_user.xml.oriole
new file mode 100644
index 00000000..0f8ff323
--- /dev/null
+++ b/gnss/47765/config/gps_user.xml.oriole
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<glgps xmlns="http://www.glpals.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.glpals.com/ glconfig.xsd" >
+ <hal
+ PortName="/dev/ttyBCM"
+ BaudRate="921600"
+ GpioNStdbyPath="/sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby"
+ CustGpioDelayMs="250"
+ LogEnabled="false"
+ Log="JAVA"
+ LogDirectory="/sdcard/gps/broadcom/storage/"
+ CtrlPipe="/data/vendor/gps/glgpsctrl"
+ NmeaOutName="/data/vendor/gps/nmea_out"
+
+ acSuplServer="supl.google.com"
+ SuplPort="7275"
+ SuplLogEnable="false"
+ SuplLogFullName="/data/vendor/gps/suplflow.txt"
+ tlsEnable="true"
+
+ SuplSslMethod="SSLv23_NO_TLSv1_2"
+ SuplEnable="true"
+ SuplUseApn="false"
+ SuplUseApnNI="true"
+ SuplDummyCellInfo="true"
+ SuplUseFwCellInfo="false"
+ SuplTlsCertDirPath="/etc/security/cacerts"
+ SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
+ SuplUT1Seconds="20"
+ SuplUT2Seconds="20"
+ SuplUT3Seconds="20"
+ TcpConnectionTimeout="20"
+ SuplLppCapable="true"
+ SuplEcidCapable="true"
+ SuplVersion="2"
+ SuplMinorVersion="0"
+ SuplOtdoaCapable="true"
+ SuplOtdoaCapable2="true"
+ SuplGlonassCapable = "true"
+ SuplGalileoCapable = "true"
+ SuplBdsCapable = "true"
+ SuplMgpsCapable = "true"
+
+ RtoEnable="true"
+ RtiEnable="true"
+ HttpSyncLto="true"
+ LtoFileName="lto2.dat"
+ LtoDir="/data/vendor/gps/"
+ LtoSyncThresholdDays="1"
+
+ GnssYearOfHardware="2020"
+ CpGuardTimeSec="1"
+ CpLppGuardTimeSec="1"
+ IgnoreInjectedSystemTime="true"
+
+ AttributionAppPkgName="com.google.android.carrierlocation"
+
+ AssertEnabled="false"
+ CpLppeCancelDbhOnAgnssProvideLoc="true"
+ CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
+ />
+
+ <gll
+ PpsEnable="true"
+ LogPriMask="LOG_INFO"
+ LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
+ FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
+ MultiCarrRFMode="GL_MULTI_CARR_RF_MODE_L1_L5"
+ MultiCarrLnaMask="L1_EXT_ON|L5_EXT_ON"
+ RfType="GL_RF_4776_BRCM"
+ ExtL5Bias="9.3"
+ EnableFilteringForLTEB13="true"
+
+ WarmStandbyTimeout1Seconds="10"
+ WarmStandbyTimeout2Seconds="15"
+
+ EnableGnssPropagateInStandby="true"
+
+ RfPathLossDb_Ap="4.2"
+ RfPathLossDb_Cp="4.2"
+ RfPathLossDb_Ap_L5="4.1"
+ RfPathLossDb_Cp_L5="4.1"
+ OnChipGpsCarrierType="3,2,3,3,2,3,2,3,3,3,1,2,1,3,2,1,2,3,1,1,1,1,3,3,3,3,3,1,2,3,2,3"
+
+ EnableOnChipStopNotification="false"
+ PowerMode="3"
+ MinGpsWeekNumber="2216"
+ />
+
+ <gll_features
+ EnableNicAutoSwitch="true"
+ EnableNavic="true"
+ />
+
+</glgps>
+
diff --git a/gnss/47765/config/gps_user.xml.raven b/gnss/47765/config/gps_user.xml.raven
new file mode 100644
index 00000000..664aa94c
--- /dev/null
+++ b/gnss/47765/config/gps_user.xml.raven
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<glgps xmlns="http://www.glpals.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.glpals.com/ glconfig.xsd" >
+ <hal
+ PortName="/dev/ttyBCM"
+ BaudRate="921600"
+ GpioNStdbyPath="/sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby"
+ CustGpioDelayMs="250"
+ LogEnabled="false"
+ Log="JAVA"
+ LogDirectory="/sdcard/gps/broadcom/storage/"
+ CtrlPipe="/data/vendor/gps/glgpsctrl"
+ NmeaOutName="/data/vendor/gps/nmea_out"
+
+ acSuplServer="supl.google.com"
+ SuplPort="7275"
+ SuplLogEnable="false"
+ SuplLogFullName="/data/vendor/gps/suplflow.txt"
+ tlsEnable="true"
+
+ SuplSslMethod="SSLv23_NO_TLSv1_2"
+ SuplEnable="true"
+ SuplUseApn="false"
+ SuplUseApnNI="true"
+ SuplDummyCellInfo="true"
+ SuplUseFwCellInfo="false"
+ SuplTlsCertDirPath="/etc/security/cacerts"
+ SuplTlsCertPath="/vendor/etc/gnss/gps.cer"
+ SuplUT1Seconds="20"
+ SuplUT2Seconds="20"
+ SuplUT3Seconds="20"
+ TcpConnectionTimeout="20"
+ SuplLppCapable="true"
+ SuplEcidCapable="true"
+ SuplVersion="2"
+ SuplMinorVersion="0"
+ SuplOtdoaCapable="true"
+ SuplOtdoaCapable2="true"
+ SuplGlonassCapable = "true"
+ SuplGalileoCapable = "true"
+ SuplBdsCapable = "true"
+ SuplMgpsCapable = "true"
+
+ RtoEnable="true"
+ RtiEnable="true"
+ HttpSyncLto="true"
+ LtoFileName="lto2.dat"
+ LtoDir="/data/vendor/gps/"
+ LtoSyncThresholdDays="1"
+
+ GnssYearOfHardware="2020"
+ CpGuardTimeSec="1"
+ CpLppGuardTimeSec="1"
+ IgnoreInjectedSystemTime="true"
+
+ AttributionAppPkgName="com.google.android.carrierlocation"
+
+ AssertEnabled="false"
+ CpLppeCancelDbhOnAgnssProvideLoc="true"
+ CpLppeUseAgnssLocForEmptyDbh="true"
+ ReAidingOnHotStart="false"
+ ReAidingIntervalSec="1200"
+ PpsDevice="/sys/class/pps/pps0/assert_elapsed"
+ />
+
+ <gll
+ PpsEnable="true"
+ LogPriMask="LOG_INFO"
+ LogFacMask="LOG_NMEA | LOG_GLLIOS | LOG_GLLAPI"
+ FrqPlan="FRQ_PLAN_26MHZ_2PPM_49_152MHZ_300PPB"
+ MultiCarrRFMode="GL_MULTI_CARR_RF_MODE_L1_L5"
+ MultiCarrLnaMask="L1_EXT_ON|L5_EXT_ON"
+ RfType="GL_RF_4776_BRCM"
+ ExtL5Bias="10.6"
+ EnableFilteringForLTEB13="true"
+
+ WarmStandbyTimeout1Seconds="10"
+ WarmStandbyTimeout2Seconds="15"
+
+ EnableGnssPropagateInStandby="true"
+
+ RfPathLossDb_Ap="4.1"
+ RfPathLossDb_Cp="4.1"
+ RfPathLossDb_Ap_L5="4"
+ RfPathLossDb_Cp_L5="4"
+ OnChipGpsCarrierType="3,2,3,3,2,3,2,3,3,3,1,2,1,3,2,1,2,3,1,1,1,1,3,3,3,3,3,1,2,3,2,3"
+
+ EnableOnChipStopNotification="false"
+ PowerMode="3"
+ MinGpsWeekNumber="2216"
+ />
+
+ <gll_features
+ EnableNicAutoSwitch="true"
+ EnableNavic="true"
+ />
+
+</glgps>
+
diff --git a/gnss/47765/config/lhd.conf b/gnss/47765/config/lhd.conf
new file mode 100644
index 00000000..c000d582
--- /dev/null
+++ b/gnss/47765/config/lhd.conf
@@ -0,0 +1,34 @@
+LheName=bbd
+
+LheRsmResetTimeoutMS=10000
+GpioNStdbyPath=/sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby
+
+LhePatch=/vendor/firmware/SensorHub.patch
+Lhe477xDebugFlags=RPC:FACILITY=65535-dKP+CUST+LHE:STDOUT_PUTS:STDOUT_LOG
+LheConsole=/data/vendor/gps/LheConsole
+
+LogEnabled=true
+Log=JAVA
+LogDirectory=/sdcard/gps/broadcom/storage
+
+LheBbdPacket=/dev/ttyBCM
+
+LheBbdControl=/dev/bbd_control
+
+# LheBbdSensor=/dev/bbd_sensor
+
+LheFailSafe=/data/vendor/gps/logs/esw-crash-dump.txt
+LogLevel=*:I
+
+NvStorageDir=/data/vendor/gps/
+
+# Enable BBD debugging at these stages:
+# LheDriverDebugFlags=PATCH_BBD:LHE_BBD:FSC_BBD
+
+LheAutoBaudDelayMS=10
+TrafficLogEnabled=false
+SecondaryConfigPath=/data/vendor/gps/overlay/lhd_overlay.conf
+
+SkipSensorWakeLock=true
+LoggerWakeLockEnable=false
+PpsEnable=true
diff --git a/gnss/47765/config/lhd_user.conf b/gnss/47765/config/lhd_user.conf
new file mode 100644
index 00000000..682d03a3
--- /dev/null
+++ b/gnss/47765/config/lhd_user.conf
@@ -0,0 +1,32 @@
+LheName=bbd
+
+LheRsmResetTimeoutMS=10000
+GpioNStdbyPath=/sys/devices/platform/10940000.spi/spi_master/spi5/spi5.0/nstandby
+
+LhePatch=/vendor/firmware/SensorHub.patch
+Lhe477xDebugFlags=RPC:FACILITY=65535-dKP+CUST+LHE:STDOUT_PUTS:STDOUT_LOG
+# LheConsole=/data/vendor/gps/LheConsole
+
+LogEnabled=false
+Log=JAVA
+LogDirectory=/sdcard/gps/broadcom/storage
+
+LheBbdPacket=/dev/ttyBCM
+
+LheBbdControl=/dev/bbd_control
+
+# LheBbdSensor=/dev/bbd_sensor
+
+# LheFailSafe=/data/vendor/gps/esw-crash-dump.txt
+
+NvStorageDir=/data/vendor/gps/
+
+# Enable BBD debugging at these stages:
+# LheDriverDebugFlags=PATCH_BBD:LHE_BBD:FSC_BBD
+
+LheAutoBaudDelayMS=10
+TrafficLogEnabled=false
+
+SkipSensorWakeLock=true
+LoggerWakeLockEnable=false
+PpsEnable=true
diff --git a/gnss/47765/config/scd.conf b/gnss/47765/config/scd.conf
new file mode 100644
index 00000000..43f9cd27
--- /dev/null
+++ b/gnss/47765/config/scd.conf
@@ -0,0 +1,6 @@
+LogEnabled=true
+Log=JAVA
+LogDirectory=/sdcard/gps/broadcom/storage
+NvStorageDir=/data/vendor/gps/
+TcpConnectionTimeout=20
+SecondaryConfigPath=/data/vendor/gps/overlay/scd_overlay.conf
diff --git a/gnss/47765/config/scd_user.conf b/gnss/47765/config/scd_user.conf
new file mode 100644
index 00000000..e75f209b
--- /dev/null
+++ b/gnss/47765/config/scd_user.conf
@@ -0,0 +1,5 @@
+LogEnabled=false
+Log=JAVA
+LogDirectory=/sdcard/gps/broadcom/storage
+NvStorageDir=/data/vendor/gps/
+TcpConnectionTimeout=20
diff --git a/gnss/47765/firmware/SensorHub.patch b/gnss/47765/firmware/SensorHub.patch
new file mode 100644
index 00000000..b8684ca0
--- /dev/null
+++ b/gnss/47765/firmware/SensorHub.patch
@@ -0,0 +1,7050 @@
+<FormatVersion=0x00010003>
+
+<Crc=250>
+<BlobLength=161839>
+<AsicVersion=0x004776A0>
+<ChangeList=565105>
+<PatchLevel=0>
+<PostPatchLevel=1>
+<CustomerVersion=None>
+<Name=./bin/SensorHub_A0>
+<Type=Application>
+<PatchAddress=0x00800141>
+<Blob=F19403000080000003890041018000B9010100BF010100
+C5010100CB010100D10101000000000000000000000000
+0000000000B1030200B903020000000000050780001DBB
+0100C9030200190402003D8F0100498F01005D8F010069
+8F0100758F0100818F01008D8F0100998F0100A58F0100
+B18F0100D9030200E103020011BD8100EDC00100FDC001
+0019C1010079E90100B161010011620100ADE10100591D
+010045FF0000E9030200D9D80100E9D801001D84010071
+B3010075B30100FDDB01005946010069460100E1950100
+F1030200F9C5010019C60100FDBF810000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+000000000072B60D494FF0E020C0F8081D0B4880F30888
+4FF0000080F31488BFF36F8FC046C0462FF4B9F32AF4D9
+F34FF002001BF431F400F005F800000000800000038900
+2AF4C9F3002801D000F008F80020C046C04600F097F82A
+F4D5F3000010B5074979441831064C7C44163404E00A68
+081D511888470146A142F8D110BD304D02005C4D020000
+B587B04FF4B07000904FF4C07102914B48019000F5B071
+039100F5387070210590049168461EF4B7F707B000BD00
+0010B5444C0FF49EF5C4E90201207808B114F44EF7A078
+48B1022019F461F4282011F4AEF3292011F4ABF307E019
+F458F4282011F495F3292011F492F3607810B1052019F4
+2DF5BDE8104012F465B30000314830B1FF30020A120230
+4900201AF43BB1704738B512F453F200240546A80F0328
+08D1002C18BF032C04D10121204600F05EF806E0A4F128
+00022824BF204600F078F8641C322CE9D331BD00B583B0
+18F480F01BF4C2F3FFF7DCFF1C4882B00CC869460CC10C
+C80CC10CBC19491A4826F490F5022000F0F3F8BDE80740
+BFE780B514F447F514F447F5FFF779FFFFF7DDFF1BF41F
+F300F071F9FFF789FF10F45DF70E49884204D0E6210FF2
+380000F0D5F90B490120087000F055FA002002BDC0C491
+0070D791005A58020000008000A888890050848900907B
+8900A0764700A1D19100696E69745F6D61696E2E630038
+B50446322C0D4605D3224627210FF2A81000F0B6F96648
+50F8241040F20112114315B921F0020109E041F0020101
+2D0CBF0122002221F0040141EA820140F8241031BD0828
+16BF0B2802210021D7E7584AD2E900017047F8B50446F1
+940390038000322C0D4604D357210FF2501000F080F900
+F074F82A78DFF840C112B1012A07D02CE0DCE9002347F0
+01071043194303E0DCE9002300F05AF8CCE90001687848
+B1022803D01AD247F0060705E0012060F3420701E027F0
+0207A87807280ED8000127F0780100F070000843E97840
+EAC100297920F4C07040EAC11747E00020F2BDF8B50446
+322C0D4604D3A0210FF2CC0000F03EF900F032F8DFF8BC
+C095F800E0DCE90023BEF1000F03D0BEF1010F05D019E0
+47F001071043194301E000F016F8CCE90001687858B102
+2805D00BD247F0060727F4807719E0012060F34207F8E7
+27F00207F5E70020F2BD00007F087F0022EA000023EA01
+0170470000154E56F824700120002122462AF468B246F8
+24700120F2BD2DE9F0438146002400250027DFF8308058
+F82760F00706D5012000213A462AF453F204430D4369F3
+061648F827607F1C322FEDD30348C0E900450120BDE8F0
+8300015040C0A4890070617463685F6770696F2E630000
+000000B585B000F0BAF94FF42041394826F437F3012107
+2011F4BDF00121082011F4B9F001210B2011F4B5F00121
+252011F4B1F0062019F44CF3012019F421F30120049001
+232A200390012201200290012100200190012000904FF4
+A04000F016FA05B05DF804EB00201BF446B238B54FF4FA
+7000F449F0204C04F190052146284601F05EFB29462046
+02F03EFB4FF4FA7000F43AF00FF288050FF2680184232A
+468F2013F467F0206801F0ECFC86232A460FF2D4018F20
+13F45DF0BDE83240002001F4C1B300B583B0FFF79AFF02
+F087FE022102914FF4005101915B220748084B00F13801
+009102A101F438F703B000BD4170700080BD8900708989
+00805D8A006905800025643A2564095374617274206368
+70704170705461736B0A00000000633A5C77735C626F64
+5F3437373631333033325F3536353130355C637573746F
+6D6572735C676F6F676C655C503231466C61677461696C
+6D63755C64656C69766572795C53656E736F724875625F
+5032315C7372635C6875625F636F6E74726F6C6C65722E
+63000025643A256409456E642063687070417070546173
+6B0A00000000000072B600B50FF4E4F45DF804EB4FF000
+0011490FF4EBB472B600B50FF4D9F45DF804EB4FF00100
+0D490FF4E0B472B600B50FF4CEF45DF804EB4FF0020008
+490FF4D5B472B600B50FF4C3F45DF804EB4FF0FF300FF4
+CBB40000A1068000B7068000CD0680004848816861B971
+4611F0100F1CBF08B016E045490A6822F001020A60F194
+03200780001AB00FE0EFF309821EF0100F03D1A2F14002
+82EC108AA2F12802036882E8F84F83685A60FFF7A7DD81
+68B9B14A6892E8F84F036002F128021EF0100F01D1B2EC
+108A82F3098890693149324A884201DB904202DB13F47F
+4F51D070472E482F490968401A80F308884FF08071C161
+2C4981617FF0060E7047FFF74EDF01BC2046DFF8A0E000
+BDFFF7DCDE2748006823490968401A20F0070080F30888
+4FF000011948417081F3118862B600F020F8FEE703680C
+B44FF0000141704FF0000181F311881A491A4A0A60BFF3
+4F8FBFF36F8F4FF0800181F311880CBC03607047134913
+4A0A60BFF34F8FBFF36F8F70470F490F4A0A60BFF34F8F
+BFF36F8F70474FF0000181F31188704760D0910034EF00
+E0D1078000FD078000E0028900C8E50F00FDBB0100A707
+80000000800004ED00E000000010C0F3C041002914BF4F
+F048614FF0C861C0F34532C004C00C02EB8010B1FBF0F0
+7047000030B585B00121002002F02AFE0121012002F026
+FE0121022002F022FE0121032002F01EFE0121042002F0
+1AFE14F46CF3840F05D0022C09D004D3032C10D016E001
+2004E002208DF80C0015E003208DF80C0000208DF81000
+6920ADF812000BE004218DF80C10FFF7B9FF049004E075
+210FF27400FFF7D8FE4FF0FF300290012001904FF40050
+164D009005F5105338334FF4C05205F6384103A822F493
+F421F499F3022002904FF44060019005F1380000905A22
+0B4B0FF24801284601F490F5032C0AD16946032011F478
+F000208DF8010069460320FFF75FFD05B030BD0000D876
+9100A5050300696E69745F686F73745F696E7465726661
+63652E630000005472616E73706F72744C617965720000
+7FB5204C204E606000250120207425606174A274E37408
+981C4D2075099860750A98A0750B98A0612046FBF433F5
+2860E66004F5D2401C30A0600C9802F008FE2B68134883
+4205D3324698210FF27000FFF778FE4FF4006002900394
+4FF4807001904FF4C05304F5C0401C30009004F11C0204
+F5C0504FF490411C3002F024FE7FBD00004C888A007085
+0600A0F891007185060000B585B00020049001232A2003
+90012201200290012100200190012000904FF4F040FFF7
+A3FF05B000BD00007076745F636F6E74726F6C6C65722E
+6370700000012100F435B100F452B1012101F4D8B401F4
+5EB501F4C0B502F04CBE02F055BE02F05BBE02F072BE02
+F0B2BE10B517F469F502460B464FF47A74A4FB020104FB
+031110BD30B5044683B0E06802900D4601956C23F19403
+B00A8000207ADFF8942B0FF2140100908F2012F4D7F500
+20E060257203B030BD25643A2564094368616E67696E67
+205258207472616E73706F72742073746174652066726F
+6D202568687520746F202568687520616674657220257A
+752062797465730A0000000038B50446002502E0E0606D
+1C491C95423CBFE068022811D2030008D10B78682B0AD0
+087868280CBF01200020ECE7012804BF0B78432BF4D140
+1CE5E7E068022807D1FFF797FFC4E9060101212046FFF7
+9DFF284632BD7CB504460E46E0680828154606D3002300
+22B121DFF8C80AFFF7A3FDE068C0F108018D4288BF0D46
+00192A463146303028F43BF5E06828180828E06033D120
+4600F07FFB30B100F00F01204600F077FC002125E0A08E
+08B9032121E0E26B12B902F029FE03E08118206C02F096
+FE80B9D720DFF8682ADFF8641D01900092D7238B2012F4
+40F50221204600F058FC002106E02064A18EE06B10FA81
+F0E06302212046FFF748FF284676BD70B504460E46E068
+A18E8842154606D300230022F221DFF81C0AFFF74DFDA0
+8EE168401A854288BF0546206C236A2A463146181828F4
+E4F4206AA18E28182062E06828188842E06003D1032120
+46FFF71DFF284670BDF0B5044685B0E06804280E461546
+07D3002300224FF48871DFF8C409FFF721FDE068C0F104
+018D4288BF0D4600192A463146383028F4B9F4E0682818
+0428E06040F0858004F13006707800F0F000302818BF40
+2877D0204600F0AEFADFF8807998B9B0880FF2F0010190
+4FF49473F07800903A468B2012F4C6F4204600F005F901
+21204600F0DBFB5DE07078F27800F0F001102919D100F0
+0F00019000924FF498733A460FF2D8018E2012F4ACF404
+F20C563046FFF7A2FE00222021204600F0B1FE3046FFF7
+98FE3DE094F82935022B08D1B0880FF2D4010092019040
+F239133A4617E020290CD100924FF49F733A460FF2EC01
+8E2012F486F4204600F024F921E0B1886BB90191009240
+F243133A460FF2F4018B2012F476F4204600F0B5F811E0
+049040F24B1330780390B0780290019200913A460FF2FC
+018F2012F463F4204600F01CF900212046FFF774FE2846
+05B0F0BD000025643A25640942616420636865636B7375
+6D2E207365713D25686875206C656E3D2568750A000000
+25643A2564095258205245534554207061636B65742073
+65713D25686875206572723D256868750A000000002564
+3A25640952582064697363617264656420696E20706572
+6D206661696C2E207365713D25686875206C65F1940340
+0E80006E3D2568750A000025643A256409525820524553
+45542D41434B207061636B65742E207365713D25686875
+0A0000000025643A256409525820646973636172646564
+20696E2072657365742E207365713D25686875206C656E
+3D2568750A000025643A256409525820676F6F64207061
+636B65742E206C656E3D2568752C207365713D25686875
+2C2061636B5365713D256868752C20666C6167733D3078
+256868782C20636F64653D3078256868780A000000007C
+B504460025207A002638B1022803D004D3032827D029E0
+A58EE668002D40D0E06BA84207D2002300224FF4BD71DF
+F82407FFF7D1FB206AB04207D20023002240F27B11DFF8
+0C07FFF7C6FBE06B401BE063206AE16B801B2062206C79
+B902F0A2FC00201CE0A58E2E46D7E70023002240F27311
+DFF8DC06FFF7AEFB11E06A1802F0C6FC60B94FF4C570DF
+F8C826DFF8C4190190009203468B2012F46FF300E02064
+2046BDE87C4000217FE5012180F829150021A0F82A1500
+F5A7605EE510B50446FFF7F3FF04F1310104F110000A78
+42708978491C0170204600F0A7F9216C204601F0A2F820
+4600F01CF92046BDE81040A7E0F0B583B00446FFF74BFD
+DFF85026002304F1100528F4F4F3E86104F13106002730
+786870204600F087F9A08E00281FBFB078297888420527
+02D194F86800C8B13946204600F03CFA052F13D1A08EDF
+F810260FF23401029040F2332328780190B07800908B20
+12F40FF3204603B0BDE8F0404BE7A08E20B1204603B0BD
+E8F04022E003B0F0BD000025643A2564094F7574206F66
+206F72646572205258206469736361726465642E207365
+713D256868756578706563743D25686875206C656E3D25
+68750A000000F0B5044685B0207C401C04F13005207429
+78DFF88465C90710D5C0B2039040F24D23E8680FF26401
+02903246A8880190E87800908F2012F4C3F221E004F20C
+573846FFF7B8FCEA682969206801F0BAFD3846FFF7AEFC
+287E0FF29001049040F25F23207C03903246A8880290E8
+780190E86800908F2012F4A3F2204600F074F8204605B0
+BDE8F0400021B5E125643A2564095258207061636B6574
+20666F7220756E66696E69736865642064617461677261
+6D2E205365713D25686875206C656E3D2568752E204461
+74616772616D206C656E3D257A752E2053656E64696E67
+2041434B3D256868750A000025643A256409417070206C
+617965722070726F63657373656420646174616772616D
+2077697468206C656E3D257A752C20656E64F19403D011
+8000696E67207061636B6574207365713D256868752C20
+6C656E3D2568752E2053656E64696E672041434B3D2568
+6875202870726576696F75736C792073656E743D256868
+75290A000000210162C1630164704730B5044683B00822
+04F13001002002F0A6FBA28E236A216C9B1A591802F09F
+FB0546A06BA8420DD0A18EDFF8F8230090083102910195
+4FF424730FF214018B2012F405F2A06BA8420CBF012000
+2003B030BD25643A25640952782042414420636865636B
+73756D3A20666F6F7465723D307825782C2063616C633D
+307825782C206C656E3D257A750A0010B584B0818E0024
+40F2F34291420FDB04240291039440F2AA23017CDF4A01
+9190F833000FF2100100908B2012F4CAF1204604B010BD
+000025643A256409426164206865616465722E20736571
+3D25686875206578706563743D25686875206C656E3D25
+6875206572723D256868750A000000002DE9F041044604
+F1320586B0A07C2E780146B1424AD0401CC0B2B042DFF8
+08830AD00196009140F2BE2342460FF284018B2012F48D
+F139E004F14C074FF43273787F04EBC002126F05923A69
+039004924246387F0290019600918F200FF2800112F476
+F1A674386802280BD3401E019040F2CD2368780FF2E801
+009042468C2012F466F100203860797F386900F5806004
+EBC1013861096F884207D300203861F860204600F042F9
+00B9287606B0BDE8F081000025643A2564094F7574206F
+66206F726465722041434B3A206C6173743D2568687520
+72783D256868750A000025643A25640941434B20726563
+656976656420286C61737420726567697374657265643D
+256868752C2072656365697665643D25686875292E2050
+72696F722071756575652064657074683D256868752C20
+66726F6E7420646174616772616D3D2568687520617420
+6C6F633D257A75206F66206C656E3D257A750A00000000
+25643A256409536571202568687541434B207263762764
+20616674657220257A75726574780A000010B5044604F1
+4A0082B001220270417000914FF44073624A0FF214018F
+2012F4D3F004F21450BDE81C400221FFF7D6BA25643A25
+640963687070456E717565756554785061636B65742063
+616C6C65642077697468207061636B657420636F64653D
+3078256868780A000000682101704321417002207047D0
+F8F02011180832C0F8F020F43100F14802D3784B70D378
+03F0F003D370007C8870107008467047F0B583B0044604
+F1580604F1F605707C7168DFF8702704EBF19403601580
+00C00040F23B33006F471A307C0FF2440102900197E878
+00908F2012F479F0B7F5806F86BF01204FF48067002028
+70AF80707C7168AA8804EBC000406F091804F1F00000F0
+9AF97068A98810FA81F0306003B0F0BD25643A25640941
+6464696E67207061796C6F616420746F207365713D2568
+68752C2072656D61696E696E6742797465733D257A7520
+6F662070656E64696E6720646174616772616D733D2568
+68750A0010B5044684B02068821EA11D002002F0B5F903
+904FF4587320680FF6B8320190011D0398029100908F20
+DFF8981A12F41DF0042203A9204600F04DF904B010BD40
+420F00D821800030B5054605F1680485B020780FF67C32
+38B940F26E330FF260018B2012F402F027E06178029043
+1E05EBC100039340F27733006F019000918F200FF27401
+11F4F1F7607805EBC000406F02F000F9607805EBC00000
+214167607805EBC00001672078401E20706078401C6070
+00F00F006070207805B030BD25643A25640943616E206E
+6F74206465717565756520646174616772616D20626563
+6175736520717565756520697320656D7074790A000025
+643A256409446571756575696E672066726F6E74206461
+74616772616D207769746820696E6465783D256868752C
+206C656E3D257A752E2051756575652064657074683A20
+256868752D3E25640A0038B5044604F14A0502E02046FF
+F778FFA87F0028F9D1287031BD2DE9F043044604F20C58
+04F1490987B04046FFF773F904F14C0699F80110002500
+27307D00294AD0002848D101253575C4F8F07040F20E41
+04F1F407384627F414F73846FFF7B3FED4F8F0104018C4
+F8F0002046FFF7B1FE0746307F40B3A07CF87089F80000
+306805281AD394F82905B8B1042000904FF471730FF6F4
+120FF66C218B2011F441F74046FFF739F9072210212046
+00F048F94046FFF72FF9002508E02046FFF79DFE306840
+1C306001E089F8010004F1F000FFF7F1FE13E0227A0592
+40F2DE3399F800200492A27C0392327F0292019000918C
+200FF694120FF6302111F412F74046FFF70AF92DB3307F
+0FF680120FF69021069040F2E933B888059004F5A865F8
+780490B87803907878029038780190D4F8F00000908F20
+11F4F4F6D4F8F02004F1F401284602F049F901001CBF28
+4600F01EFC204600F039F9050016D0A8780FF628120FF6
+9C21029040F2FA33A8880190287800908B2011F4D4F620
+68294607B0BDE8F043062201F0CEB94FE370B504460E46
+20681546281840F20F41884207D30023F19403F0188000
+002240F20A410FF6E000FEF7E7FE206800192A46314600
+1D27F484F620682818206070BD00F0F000102806D02028
+07D0302808D0402809D00BE00FF6542070470FF6542070
+470FF65C2070470FF66020704702A07047000040228000
+000000002DE9F04788B08046894617461D4600248DB90F
+F674050FF6442140F237432A468B2011F47DF600230022
+4FF487612846FEF7A4FE62E0062D08F1680603D3F02019
+EA000F11D04846FFF7BCFF31780FF63802491CC9B20391
+02950190CDF800904FF488630FF6142114E030780FF618
+020FF64021401CC0B2069040F24743B8880590F8780490
+B8780390787802903878019000958E2011F443F608F20C
+5A5046FFF737F830780146102909DB40F24D430FF2D472
+0FF654218B2011F431F61AE0727851FA82F150FA82F0CA
+1001EB12710911A0EB011080B208EBC000056747673078
+401C3070C0B2012803D149464046FFF732FD01245046FF
+F70DF8204608B0BDE8F08710B50446282104F1080027F4
+B7F504F13C000021002206C0202104F1480027F4ADF588
+2104F1680027F4A8F5FF2084F84900002084F8290510BD
+2DE9F047044604F20C5A884691465046FEF7E0FF256800
+2084F8290594F8600018B104F5A86002F074F804F13C06
+306830B100203060706801F0E8FE0020706004F1740610
+2756F8040C20B1306801F0DDFE0020306008367F1EF4D1
+2046FFF7B2FF04F13100017861748078401C20745046FE
+F7B1FF4A464146204600F00BFB2846BDE8F04701F002B9
+2DE9F04F044604F20C5983B04846FEF79CFFFEF7ADFFD4
+F800C00025DCE918239942A84679D301D8904276D34FF0
+FF300146AE4625E0D26A07EB470302EBC30B9BF8102001
+2A10D1DBE90223002B08BF002A0AD08B4208D828BF8242
+05D210461946F2463E464FF001087F1C0CEB8E02BFB292
+6B138E9F42DDD30EF101025FFA82FE9CF834209645B8BF
+0027EEDBB8F1000F0FF22C670FD1DCE91801CDE9000140
+F2DF433A460FF6C0018B2011F454F5206802F065F830E0
+B6B25FFA8AFA0196CDF800A040F2E6433A460FF6C4018B
+2011F442F5062001F017FE05000AD140F2E94301930097
+3A460FF23C618B2011F433F512E00AF11000287006EB46
+0101206870206800EB8A00806BC06A00EBC100407CA870
+0620E870AE804846FEF717FF2846E7E0F8B504000D460F
+F2945606D10023002240F201513046FEF73BFD35B90023
+002240F202513046FEF733FD94F8280570B140F204573B
+4632460FF658018B2011F4F9F40023F19403801C800000
+2239463046FEF721FD40F2065332460FF668018F2011F4
+EBF42046FFF7DAFE04F20C50FEF7DAFE04F21450FEF7E2
+FE04F5A760FEF7DAFE2560012084F8280504F5A860BDE8
+F24001F0D9BED82180002DE9F04F0D0083B0044616460F
+F2F84806D10023002240F231514046FEF7EEFC34B90023
+002240F232514046FEF7E6FC04F20C50FEF7ADFE207AC8
+B1FEF7BCFED4E90679DFF8B8230023BA1849EB03038B42
+0DD828BF82420AD24FF4A76342460FF2EC718B2011F49B
+F42046FFF7DAF804F20C50FEF78FFE207A0FF2F0710FF6
+0C0A0190009640F23E5342468F2011F487F4FEF791FEDF
+F86423002327F43CF5A0620027606A3018606240F25F59
+40F25E5B14E000905B46424651468B2011F46FF4002300
+2249464046FEF797FC00212046FEF77DFE04F20C50FEF7
+5CFEB74224D204F20C50FEF754FE207A28B1022810D009
+D3032813D0DCE7F21B79192046FEF7A0FEC719E6E7F21B
+79192046FEF7C4FEF7E7F21B79192046FEF713FFF1E7F2
+1B79192046FEF738FFEBE7207A20B9E068401E8041C00F
+00E0002003B0BDE8F08FF0B583B00C4690F8291500264F
+1EBF411546FF0F8DB90FF2AC340FF24C7140F27D532246
+8B2011F41AF40023002240F27E512046FEF741FC18E02F
+B92B4622460021FFF77CFD80B920780FF278320FF23871
+02900195009740F284538B2011F4FEF3204601F010FD00
+E00126304603B0F0BD70B50D46022D82B0044602D00F2D
+07D010E040F293530FF23C320FF2347105E040F297530F
+F22C320FF25C718F2011F4DDF311E00FF21C360FF28871
+009540F29C5332468B2011F4D1F30023002240F29D5130
+46FEF7F8FB05F00F012046BDE87C40FFF7DFBA2DE9F043
+87B00746FEF7C9FD044638680D46D0E9186897F84A0010
+B997F8290598B9D7E91401002902BF0028204629466E4A
+0023871841EB0309C84505D301D8BE4202D3861841EB03
+08371B68EB0509CDE90479CDE90245CDE9006840F2B353
+0FF28C220FF220718F2011F48CF34FF0FF300146884508
+BF864209D0454505D301D8B44202D30020002101E03846
+494607B0BDE8F08338B504460022102100F0CCF840F2C1
+530FF244220FF20C718F2011F469F304F214552046FFF7
+A1FF002908BF002803D12846FEF761FD0EE04FF0FF3291
+4208BF904203D12846FEF759FD04E002460B462846FEF7
+55FD0146204600F003F80028DFD131BDF8B504460D46E8
+070AD540F2D4530FF2E4120FF2CC618F2011F438F30020
+F2BDA80744BF2046FFF7ACFB002DF19403102080004ED1
+FEF739FDD4E91423801A9941002399422C4A01D890420B
+D340F2E1530FF2A8120FF2B4618B2011F41AF32046FFF7
+92FB94F8290598BBFEF71EFD04F5A662D2E90067801BB9
+41002399421E4A01D8904225D3B4F82A050FF26C12401C
+032811DA40F2E9530FF284618B2011F4F8F2B4F82A0540
+1CA4F82A05062210212046FFF7FDFC0CE040F2EE530FF2
+84618B2011F4E6F2022084F829052046FFF74EFB280C00
+0405D0290C090404F5A86001F04EFD0120F2BD0000A0B0
+810040420F0000B4C40400E1F505002F685938B5012904
+4609D0009140F204630FF2EC020FF254618B2011F4BCF2
+A4F5A86404F20C552846FEF7AEFC5034FEF7BEFCC4E900
+01002020742846BDE83240FEF7A4BC084601F0BBBB2DE9
+F041044604F168000D460178002904BF40780028164610
+D00FF298080FF2206140F271673B4642468B2011F48EF2
+0023002239464046FEF7B6FA0A2001F05DFB0746012038
+700020787078804FF4A060B8800120F880202D4FF47A70
+38810FF250000BD1024640F286630FF2F0518F2011F46B
+F22046FEF700FF07E002464FF4D1630FF2F4518F2011F4
+5FF2FEF769FC04F5A6620A23C2E9000105F0F00006F00F
+0101433A462046BDE8F041FFF7BDBB0000633A5C77735C
+626F645F3437373631333033325F3536353130355C6375
+73746F6D6572735C676F6F676C655C503231466C616774
+61696C6D63755C64656C69766572795C53656E736F7248
+75625F5032315C7372635C636870705C7472616E73706F
+72742E63000025643A2564094F4F4D2061742025733A25
+640A0025643A256409526573657474696E672061667465
+7220256420726574726965730A00000025643A25640944
+6F576F726B206E6F7468696E6720746F2073656E642E20
+6861735061636B6574733D25642C206C696E6B42757379
+3D25642C2070656E64696E673D256868752C2052782041
+434B3D256868752C205478207365713D256868752C2052
+582073746174653D256868750A0000000025643A256409
+54582D3E4C696E6B3A206C656E3D257A7520666C616773
+3D30782568687820636F64653D3078256868782061636B
+5365713D25686875207365713D25686875207061796C6F
+61644C656E3D2568752070656E64696E673D256868750A
+000025643A256409526573706F6E73652074696D656F75
+742048232568687520636D643D2568752049443D256868
+750A000028524553455429002852455345542D41434B29
+00284C4F4F502D524551290000F19403A0238000284C4F
+4F502D52455329000025643A256409456E717565756520
+74782077697468206C656E20300A0000000025643A2564
+09456E71756575652054583A20636F64653D3078256868
+782573206C656E3D257A752070656E64696E673D256868
+750A00000025643A256409456E71756575652054583A20
+6C656E3D257A752048232568687520747970653D307825
+6868782049443D25686875206572723D2568687520636D
+643D30782568782070656E64696E673D256868750A0000
+0025643A25640943616E6E6F7420656E71756575652054
+5820646174616772616D0A00000025643A25640954696D
+656F757420617420256C6C7520627574206E6F20636C69
+656E740A0000000025643A256409436C69656E743D2568
+687520636D643D2568752074696D6564206F75740A0000
+000025643A25640943485050207472616E73706F727420
+616C726561647920696E697469616C697A65640A000000
+25643A256409496E697469616C697A696E672043485050
+207472616E73706F72740A000025643A2564095061636B
+65742052582074696D656F75740A0000000025643A2564
+09525820257A752062797465733A2073746174653D2568
+68750A0025643A256409496E76616C6964205258207374
+61746520256868750A0000000025643A256409456E7175
+65756520646174616772616D206C656E20300A00000025
+643A256409526573657474696E673D25642E2044697363
+617264696E6720257A7520627974657320666F72204823
+256868750A0000000025643A256409417070206C617965
+7220656E7175657565696E6720434850505F5452414E53
+504F52545F4552524F525F4F4F4D0A0000000025643A25
+6409417070206C6179657220656E7175657565696E6720
+434850505F5452414E53504F52545F4552524F525F4150
+504C415945520A00000025643A25640941707020656E71
+75657565696E6720696E76616C6964206572723D256868
+750A000025643A2564094E657874446F576F726B3D256C
+6C752063757272656E7454696D653D256C6C752064656C
+74613D256C6C640A000025643A2564094348505020576F
+726B2054687265616420737461727465640A0025643A25
+64094348505020576F726B20546872656164207465726D
+696E617465640A000025643A25640941434B2074696D65
+6F75740A000025643A25640952455345542D41434B2074
+696D656F75743B207265747279696E670A000025643A25
+640952455345542D41434B20F194033027800074696D65
+6F75743B20676976696E672075700A0025643A25640941
+73796E632073656E64206661696C7572653A2025686875
+0A0025643A2564094E6F7420696E697420746F2073656E
+642072657365740A00000025643A25640953656E64696E
+672052455345542D41434B0A0000000025643A25640953
+656E64696E672052455345540A00000000FEF7A79A0121
+FFF72D9EFFF7179F30B50C4683B021780125012904D002
+2906D00F2908D01CE0214601F0DAFA06E0214601F087FB
+02E0214601F02DFC68B9A0780FF200620FF2CC5102907F
+23A0880190207800908B2010F42FF7284603B030BD0025
+FAE700207047002070470020704770B584B00D78102D14
+464FF0FF3616DA280006D0012D06D0022D18BF0F2D04D0
+05E0012629E0022627E0062625E0009540F20F130FF29C
+520FF2FC511AE0497811F00F0118BF022903D007D30329
+05D009E0294600F068F8066B0EE0294600F078F8466B09
+E0009140F221130FF264520FF2EC518B2010F4E7F6B442
+0ED20296019400954FF495730FF248520FF2F0518B2010
+F4D9F6002004B070BD012004B070BD38B5044612F00F00
+0D4605D002281ED007D3032820D012E0204600F034F880
+6A32BD204600F088F8C07950B94FF4A4730FF200520FF2
+DC518B2010F4B4F6002032BD2946204600F033F8C06932
+BD204600F019F8C06A32BD204600F06DF8C07930B94FF4
+AC730FF2C8420FF2D451E3E72946204600F01CF8006A32
+BD00EB8100C068406A704738B504460D46217AA5F11000
+884207DB002300224FF4C7710FF29040FDF7AEFE04EB85
+0050F8340C32BD38B504460D1994F8341095F858008842
+07D30023002240F29F110FF26440FDF798FE95F8580004
+EB8000806B32BD38B504460D46217AA5F11000884207DB
+002300224FF4D8710FF23840FDF782FE04EB850050F820
+0C32BD38B504460D4694F83410A5F11000884207DB0023
+002240F2C1110FF20C40FDF76CFE281990F8580004EB80
+00C06C32BD12F00F0308BFFFF7CEBF00B5022B83B003D0
+06D3032B04D007E003B05DF804EBC1E703B05DF804EBD2
+E7019100924FF4F0730FF2C4320FF204518B2010F417F6
+002003B000BD70B50D4684B00446687810F00F00164605
+D0022807D00AD303280CD00FE02046FFF7ADFE0AE02046
+FFF7D6FE06E02046FFF7D0FE02E02046FFF7D0FEA0B9A8
+780FF270320FF2D441039002964FF40373687801902878
+00908B2010F4E5F5206804B0BDE87040A6E004B070BD2D
+E9F0430D4687B004466878F19403C02A80002978164600
+F00F0842462046FFF799FF07001ED1A8780FF224370FF2
+C441039002964FF40973687801903A46287800908B2010
+F4BDF520680F21FFF7C3F9384607B0BDE8F04300230022
+40F22721FDF7DDBD297842462046FFF7D7FE030014D1A8
+780FF2D8220FF2B0410390029640F22F23687801902878
+00908B2010F498F5206807B0BDE8F04359E03246294638
+4698475FEA000931D005964FF40F73A8880FF298270FF2
+A84104903A46A87803906878029028780190CDF800908B
+2010F477F5B8F1000F37D10621284601F020FB50B940F2
+4323019300973A460FF2BC418B2010F465F527E080F803
+900146206807B0BDE8F0430622FFF72BB9B8F1010F1AD1
+07F10C00FFF7F7FD387A0FF22C220FF29C4140F0040038
+724FF415738F2010F446F507F11400FFF7EBFD07F10C00
+07B0BDE8F043E1E507B0BDE8F0830F21FFF740B938B504
+460D46FF220121684626F4E2F4009A2946204600F001F8
+31BD76B504000D460FF2D41606D10023002240F26D2130
+46FDF749FD40F26F2332460FF288418F2010F413F59021
+204626F4BFF49DF8040084F86D0025604FF0FF30C4E918
+00204601F06BFC2046BDE8764001F046BAF0B5160087B0
+04460D460FF27C170FD14FF426733A460FF250418B2010
+F4EEF40023002240F299213846FDF715FD1CE02878062E
+07D20190009640F29E233A460FF23C410EE0A988059140
+F2A523E97804913A46A978039169780291019000960FF2
+50418F2010F4C9F4324629462046FFF7A0FD88B1287828
+B932462946204601F072FC09E0102832462946204602DA
+FFF7A0FE01E0FFF7D3FE2068294607B0BDE8F040FFF701
+BA2DE9F04383B0044600250FF26C460FF2D00940F2D728
+11E00290009505F11000019043464A4631468F2010F493
+F41FB104EB8500006AB8476D1CEDB2207A854208DA2946
+2046FFF7F0FD00280746E3D00120E1E703B0BDE8F08310
+B590B00C46C17B0FF248420E91817B0D91417B0C91017B
+0B91C17A0A91817A0991417A0891017A0791C179069181
+7905914179049101790391C17802918178019141780091
+25210378204626F4F1F510B010BD000025643A25640948
+232568687520756E6B6E6F776E20726571756573742E20
+636D643D2523782C2049443D256868750A00633A5C7773
+5C626F645F3437373631333033325F3536353130355C63
+7573746F6D6572735C676F6F676C655C503231466C6167
+7461696C6D63755C64656C69766572795C53656E736F72
+4875625F5032315C7372F19403502E8000635C63687070
+5C6170702E630000000025643A256409496E76616C6964
+20707265646566696E65642068616E646C652025686875
+0A00000025643A256409496E76616C6964206D65737361
+676520747970652025640A000025643A25640944617461
+6772616D20746F6F2073686F72743A204823256868752C
+206C656E3D257A75203C20257A750A0000000025643A25
+64095278207365727669636520726573706F6E73652062
+757420636C69656E7420636C6F7365640A000000002564
+3A25640952782073657276696365206E6F746966696361
+74696F6E2062757420636C69656E7420636C6F7365640A
+0000000025643A256409556E6B6E6F776E20747970653D
+3078256868782028482325686875290A0025643A256409
+48232568687520756E646566696E6564206D7367207479
+70653D30782568687820286C656E3D257A752C2049443D
+25686875290A000025643A256409482325686875206D69
+7373696E672063747820286D73673D307825686878206C
+656E3D257A752C2049443D25686875290A0025643A2564
+0948232568687520756E737570706F72746564206D7367
+3D30782568687820286C656E3D257A752C2049443D2568
+6875290A0025643A256409525820646973706174636820
+6572723D30782568782048232568687520747970653D30
+78256868782049443D2568687520636D643D3078256878
+206C656E3D257A750A00000025643A2564094F4F4D2061
+742025733A25640A0025643A25640946696E6973686564
+206469737061746368696E672061207365727669636520
+726573706F6E73652E204E6F74696679696E6720612070
+6F74656E7469616C2073796E6368726F6E6F757320636C
+69656E740A0000000025643A25640941707020496E6974
+0A0025643A25640941707020727820772F206C656E2030
+0A000025643A256409417070206C617965722052582064
+6174616772616D20286C656E3D257A752920666F722048
+23256868750A00000025643A256409417070206C617965
+7220525820646174616772616D20286C656E3D257A7529
+20666F722048232568687520747970653D307825686878
+207472616E73616374696F6E2049443D25686875206572
+723D2568687520636F6D6D616E643D30782568780A0000
+000025643A256409536572766963652023256868752028
+4823256429207265736574206E6F74696669657220666F
+756E643D25640A00253032782530327825303278253032
+782D25303278253032F19403E0318000782D2530327825
+3032782D25303278253032782D25303278253032782530
+32782530327825303278253032780000000010B53B4C04
+F63800FFF776DF2146BDE810400120FDF75C9E10B582B0
+01780FF20812FE2913D14178837841EA0321C378007941
+EA034141EA006400945F230FF2C4018F2010F40CF22A48
+046013BD009164230FF238118F2010F402F213BD10B582
+B0254C0CE069462046FEF795DA0146012905DB0098FFF7
+CFFF2046FEF7F4D92046FEF765DA0128EDDA13BD80B581
+230FF294020FF218118F2010F4E1F1144800F65C014FF4
+807200F63800FEF79CD9002112481EF426F74FF0FF30FD
+F752DEC007F9D5FFF7CBFFF6E700B583B0022102914FF4
+0061019132220548084B00F1380100910FF2E801FFF7AE
+D803B000BDF07E8A000C53890028878A00113280009D32
+800025643A256409434850502042617564726174652069
+732073657420746F20256C640A0A00633A5C77735C626F
+645F3437373631333033325F3536353130355C63757374
+6F6D6572735C676F6F676C655C503231466C6167746169
+6C6D63755C64656C69766572795C53656E736F72487562
+5F5032315C7372635C73656E736F725F6875622E630000
+25643A256409496E76616C696420686F737420636F6D6D
+616E6420307825782E0A0A000025643A25640953746172
+74696E672053656E736F724875625461736B0A0A000053
+656E736F724875625461736B0000005248704752490028
+086812BF40F0010040084000086070477047000038B504
+46FFF7EEFF0025322C0AD2E10800EB810004F00701D0F8
+F0008900C84000F00F05444800781A2C04D01B2C08BF05
+09284632BD00F00F05FAE72DE9F047044688469146FFF7
+CDFF00F1EC0A00200125322C38D2384801781A2C2CD01B
+2C08D101F00F0141EA0811B8F1010F04BF0025A846314F
+01702046396888470646796820468847EFF3108772B60F
+213268814008FA00F08A4308401043B9F1000F306003D0
+E1080AEB81014860002D204605D00EF459F204E068F303
+01D5E70EF443F287F310880120BDE8F0870122B5E7F8B5
+04460D46FFF785FFEC30184900221BE05FEAC67C05D54F
+F00F0C0CFA07FC4CEA03033F1DFFB27608F2D13BB100EB
+82070E687F689E433B4033430B60240A44EA0564521C09
+1D2D0A002D08BF002C04D00023E6B20027002EE6E7F1BD
+0000007E4040E40F414068F591006C7B89000004414070
+B594B004464FF4C0500990002300200890079006900590
+0022012004900021F1940370358000A7200390A0690290
+0020019000900AA8D6F414F0DCF4EEF70546DCF4F7F761
+68C91D4019C90800EBC1050AA831F4ECF7064600200490
+A07D0390E07C0290A07C0190607D0090237D627C217CA0
+6901F05BF880190830441900F00AF808B104F6A8442046
+14B070BD0349087070470000014800787047000098CB91
+00F8E70000DCF420B77047000038B5F9F4BFF70FF2BC01
+294C972010F433F0216E04F16400DCF452F705460FF2BC
+01972010F428F02968096928468847A06704F170012A68
+926C284690471D491D48C8614FF41662BDE838401B4800
+F12401FDF7D59F00003EB5154C04F51B75E9602A606B60
+A860089B079A069904F51170FAF439F109982066F8F491
+F7E968A868FF2226F45EF06A68296804F13800FDF7B6DF
+002002903222E868084B0FF258010190A86800902046FE
+F7D9DE37BDF4F89100A4F8910095B981003CBB9100ADC2
+0F004372656174652053797374656D204F626A65637473
+0A00004372656174652047756C704D654368696E6F6F6B
+456E67696E650A00466C61677461696C5461736B000000
+000121FDF7E39AFDF7009B0121FEF7869E10B5044604F1
+0800FFF7F2FF2046BDE81040FEF7039F38B5044604F108
+00FFF7EAFF256910E038B5044606E004F10800FFF7E3FF
+2046FEF7C3DF04F10800FFF7DAFF2569002DF1D0002020
+6104F10800FFF7D3FF284632BDF8B506461D464FF0FF30
+1446854208BF844203D13046BDE8F240D8E706F10800FF
+F7BDFF14F4ECF6074620462946144A002326F425F0C419
+0BE006F10800FFF7B0FF29463046FEF7B3DF06F10800FF
+F7A6FF14F4D5F6251A012DB8BF0125306918B914F4CDF6
+A042E7D334690020306106F10800FFF795FF2046F2BD00
+00000040420F0038B504460D4604F10800FFF786FF2069
+284320612046FEF7F7DE04F10800BDE832407CE70121FD
+F75B9AFDF7789A0121FEF7FE9D70B5554C0546207828B9
+0120207004F11000FFF7EDFF04F11000FFF7ECFF616801
+22680A4D4D25F83120400205EBC10100F50070488028F4
+4BF40646606805EBC0014E6035F8301041F0800125F830
+10401C2421B0FBF1F101EBC102A0EB82006060A068401C
+A060E068401CE06004F11000FFF7C2FF304670BD70B536
+4C0646207828B90120207004F11000FFF7B0FF04F11000
+FFF7AFFF6068304D022125F8301005EBC0004660304628
+F46CF5606835F8301041F0800125F83010401C2421B0FB
+F1F101EBC102A0EB82006060A068401CA060E068401EE0
+6004F11000BDE8F194030039800070408AE7F8B51C4C05
+4620780E4628B90120207004F11000FFF77AFF04F11000
+FFF779FF6068154F042127F8301007EBC0003146468028
+4629F459F40546606807EBC0014D6037F8301041F08001
+27F83010401C2421B0FBF1F101EBC102A0EB82006060A0
+68401CA06004F11000FFF754FF2846F2BD0000D87E8A00
+B87D8A0030B4C043AAB10FF2300311F8014B84EA000505
+F00F0553F8255085EA101080EA241404F00F0453F82440
+521E84EA1010EBD130BCC0437047000000006410B71DC8
+206E3BAC30D9269041DC76F4516B6B5861B24D3C710550
+2083B8ED44930FF0E8A3D6D68CB361CBB0C2649BD4D2D3
+8678E20AA01CF2BDBDFFF7F8BE38B50C46A0F5A8652004
+07D00023002240F27F210FF29010FCF75AFE05F2145021
+0CBDE834400904E8E738B53D4C206930B9002300229921
+0FF2E010FCF748FE20694FF0FF324FF4807100F65C4001
+F013F80546012D06DA00232A469F210FF2BC10FCF735FE
+206900F65C412A4600F65C50FFF74BDB20694FF48031FF
+F7C0FFDEE730B5040083B006D100230022A7210FF28810
+FCF71CFE224D286900283ED101202060207101210C200D
+F4F3F501210D200DF4EFF501210E200DF4EBF501210F20
+0DF4E7F500202870E86868601120288110206881284600
+F062FF30B100230022B8210FF23410FCF7F2FD4FF40062
+04F5586104F65C50FDF780DD022002902C614FF4806001
+9004F65C0000905A22054B0FF2801104F62400FEF79FDC
+03B030BD000000538900273A800070B50C461546002600
+E08619AE4210D22946204600F067FF0028F6D510F1040F
+01D1022070BD10F1020F0CBF0320FF2070BD012070BD70
+B5C90382B0A0F5A86419D500F65C552846FDF7F6DD0600
+12D00020009069462846FDF712DE761E012804DB024600
+992046FEF79EF82846FDF76FDD002EECD173BD70470000
+633A5C77735C626F645F3437373631333033325F353635
+3130355C637573746F6D6572735C676F6F676C655C5032
+31466C61677461696C6D63755C64656C69766572795C53
+656E736F724875625F5032315C7372635C636870705C69
+6E636C7564655C636870702F7472616E73706F72742E68
+00633A5C77735C626F645F3437373631333033325F3536
+353130355C637573746F6D6572735C676F6F676C655C50
+3231466C61677461696C6D63755C64656C69766572795C
+53656E736F724875625F5032315C7372635C636870705C
+706C6174666F726D5C62636D5C42434D343737785C6C69
+6E6B2E630000F19403903C80004C696E6B20527800F0B5
+83B04FF0FF32C0E91822002101E0491CC9B290F8342091
+421FDA002400EB810504E016461F46C0E91867641CAA6B
+138EA4B29C42EBD2D26A04EB440302EBC306327C012AF1
+D1D6E90223D0E918679F42E7D8E8D39642E4D2E5E7D0E9
+1823CDE900230FF27C010FF2100240F21E238F200FF4B1
+F403B0F0BD0000633A5C77735C626F645F343737363133
+3033325F3536353130355C637573746F6D6572735C676F
+6F676C655C503231466C61677461696C6D63755C64656C
+69766572795C53656E736F724875625F5032315C737263
+5C636870705C636C69656E74732E630000000025643A25
+64096E65787452657154696D656F75743D256C6C750A00
+00F0B50446164683B00D463046FFF73CFD07000FD12520
+0FF24C020FF234010190009225238B200FF457F4206802
+21FEF75DF80AE03246294625F420F40120787032462068
+3946FEF718F8012003B0F0BD25643A2564094F4F4D2061
+742025733A25640A00633A5C77735C626F645F34373736
+31333033325F3536353130355C637573746F6D6572735C
+676F6F676C655C503231466C61677461696C6D63755C64
+656C69766572795C53656E736F724875625F5032315C73
+72635C636870705C73657276696365735C6C6F6F706261
+636B2E63000010B514F477F302460B464FF47A74A4FB02
+0104FB031110BD70B50546084684B00E2100F09FF90600
+0FF28C0412D1322001900094322322460FF268018B200F
+F4E1F3204604B0BDE87040002300223321FCF706BCFFF7
+D4FFC6F80600C6F80A103923D6F80600D6F80A10CDE902
+0122460E2000908F200FF2B0010FF4C3F32868314604B0
+BDE870400E22FDF78CBF10B58B880124012B02D1FFF7BE
+FF00E00024204610BD25643A2564094F4F4D2061742025
+733A25640A00633A5C77735C626F645F34373736313330
+33325F3536353130355C637573746F6D6572735C676F6F
+676C655C503231466C61677461696C6D63755C64656C69
+766572795C53656E736F724875625F5032315C7372635C
+636870705C73657276696365735C74696D6573796E632E
+63000025643A2564096368707054696D6573796E634765
+7454696D652072657475726E696E6720257A7520627974
+65732061742074696D653D256C6C750A002DE9F0430446
+83B00846217A01EBC10291008D1D294600F0F3F8060014
+D13B2001903B230FF280040FF26801009422468B200FF4
+35F3204603B0BDE8F043002300223C21FCF75ABB0020F0
+70814604F1F19403204080000C08B71D08E058F8041B38
+46242225F4F1F209F101092437207A8145F3D320682A46
+314603B0BDE8F043FDF7E2BE10B58A880124012A02D1FF
+F7BAFF00E00024204610BD25643A2564094F4F4D206174
+2025733A25640A00633A5C77735C626F645F3437373631
+333033325F3536353130355C637573746F6D6572735C67
+6F6F676C655C503231466C61677461696C6D63755C6465
+6C69766572795C53656E736F724875625F5032315C7372
+635C636870705C73657276696365735C646973636F7665
+72792E630010B514F439F202460B464FF47A74A4FB0201
+04FB031110BD90F86D10890748BF00F081BF7047F0B515
+0093B004460F460FF2CC1605D1002300225A213046FCF7
+D1FA207A05280ADB00905E2332460FF218218B200FF498
+F2002013B0F0BD04EB800008A9C560207A04EB80000762
+2846FEF70DFE207A296B07917223698C0691324695F821
+10059195F820100491009008A9039105F11001029100F1
+100101918F200FF2EC110FF46FF2207A411C21721030C0
+B213B0F0BD10B50446062C06D20023002279210FF23810
+FCF78BFA2046FFF732FB38B10021017003214170002181
+70C170818010BD38B50D46062D044606D2002300228821
+0FF20410FCF772FA2846FFF719FB050007D02146062225
+F40DF2012068700020E870284632BD30B5044683B00D46
+D4E90201002908BF00280FD1D4E90001002908BF002809
+D0CDE9000197230FF2B8020FF2B0118B200FF41BF2FFF7
+55FFC4E900010020C4E90200A878607403B030BD2DE970
+43064686B0D6E90245FFF744FFC6E90201D6E90089B9F1
+000F08BFB8F1000F0FF2740206D1CDE90001A3230FF28C
+118B201AE0002D08BF002C08D0CDE90201CDE90001A723
+0FF294118C200DE0B0EB0804CDE90201CDE9000161EB09
+05CDE90445AD230FF2AC118F200FF4D8F106B0BDE87083
+70B50446084615461E46FFF7BEFF3246294620680068BD
+E87040FDF797BD00000000633A5C77735C626F645F3437
+373631333033325F3536353130355C637573746F6D6572
+735C676F6F676C655C503231466C61677461696C6D6375
+5C64656C69766572795C53656E736F724875625F503231
+5C7372635C636870705C73657276696365732E63000000
+25643A2564094D61782073657276696365732072656769
+7374657265643A202320256868750A000025643A256409
+5265676973746572656420736572766963652023202568
+6875206F6E2068616E646C652025642077697468206E61
+6D653D25F19403B0438000732C20555549443D25732C20
+76657273696F6E3D256868752E256868752E2568752C20
+6D696E5F6C656E3D257A75200A0000000025643A256409
+4475706C69636174652072657175657374207278206174
+20256C6C75206E730A000025643A256409547820726573
+706F6E736520772F206E6F2072657120743D256C6C750A
+0025643A256409526573656E6420726573706F6E736520
+743D256C6C7520666F7220726571756573742061742074
+3D256C6C750A0025643A25640953656E64696E6720696E
+697469616C20726573706F6E736520617420743D256C6C
+7520666F72207265717565737420617420743D256C6C75
+20285254543D256C6C75290A000010B514F455F002460B
+464FF47A74A4FB020104FB031110BDF2E70CB410B5ADF5
+027D04460A4684AB4FF4007101A826F481F21CB1022C13
+D009D31AE001A8009038230FF264020FF250018B2019E0
+01A800903B230FF250020FF23C018C2010E001A800903E
+230FF240020FF22C018E2007E001A8009042230FF22C02
+0FF218018F200FF49DF00DF5027D10BC5DF80CFB0FF284
+014160704725643A25640950414C3A2025730A0000633A
+5C77735C626F645F3437373631333033325F3536353130
+355C637573746F6D6572735C676F6F676C655C50323146
+6C61677461696C6D63755C64656C69766572795C53656E
+736F724875625F5032315C7372635C636870705C706C61
+74666F726D5C70616C5F6170692E6300000000000001C9
+448000CB448000213880009B388000704700002DE9F047
+88B08946139E90F87D1014461D4609B900203CE000F10C
+074FF4C471FA6D0FF2E40A302033F4FCF4B9F1080F8046
+03DB2D215046FCF742F80F2C03DB2E215046FCF73CF8FA
+6D4FF42071312033F4E8F4B8606020FA6D10FB04F13220
+33F4E0F4B8F1000F786011D01499069105960195009023
+4612990491404611990391109902910821BA689FF43BF6
+3860386808B0BDE8F08730B50499002409B148F2781406
+9909B104F6481468254FF4B871454341436F3501F27711
+ED0805EBD10145000935ED0801EB450100EB5000582568
+43C01D01EBD000C00000F5D56000190BB100F6780012B1
+00F5D850D830059900F5B47011B100F5A850C830079909
+B100F5B15030BD70617463685F676C70656F626A666163
+742E63707000000010B582B0044601208DF80000002100
+208DF8010020460DF4C3F169462046FBF777FE13BD80B5
+0021ADF800106946FBF76FFE01BD10B5DFF84C4342F654
+000059F19403404780000DF43AF204F52051BDE8104014
+318020FCF7C69B10B5DFF82C4304F520511431022005E0
+10B5C74C04F5205114310420FCF7B6DB2089BDE810400D
+F41DB238B5044600210220FCF743DC802080F3118800BF
+00BFBB4DBC4A288901210DF49AF128890DF4D9F16CB928
+890DF463F1012808D105F5205114310220FCF791DB2889
+0DF4FAF1002080F3118831BD10B500210420FCF71DDC80
+2080F3118800BF00BFA84CAA4A208900210DF474F12089
+0DF4B3F120890DF43EF140B904F5205114310420FCF76D
+DB20890DF4D6F1002080F3118810BD80B500218020FCF7
+F9DB9C480068BDE802400DF497B1974A01212DE9F84394
+4C974E20890DF44CF1208904F520554C350DF488F1A868
+934A00210DF441F115F49FF1002707E0608900210DF41F
+F129681020FCF73BDB3846FFF787FF64212320FCF7CCDB
+00275FEA000807D115F492F12320FCF799DB804615F482
+F15FEA886005D56968BDE8F4434020FCF71F9B306A00F5
+7A79FFF7B4FF608901210DF4F6F05FEA887005D4642102
+20FCF7A7DB0028C9D05FEAC87004D400210120FCF79EDB
+98B12269E16820784FF0FF3310F40EF1804620780FF408
+F32069296880450CBF08201020FCF7F2DA09E0306AA9EB
+00018020FCF783DB10B16420FDF7D3DDA8680DF450F1FF
+F758FF608900210DF4BEF0306AA9EB00010129B8BF0021
+0420FCF76DDB002897D120890DF43CF1012792E700B54F
+4889B04168029100F1140200218DF80610ADF804100692
+FF218DF80C104FF48051ADF81C10ADF8141000F5805114
+3104910D210278012A42F6540208BF1121115001210091
+06AB007804AA01A90FF458F709B000BD10B584B020B101
+78012918BF002903D04FF0FF3004B010BD334C21780429
+18BF6FF0010023D10EC80EC4FFF7BDFF0C3CE8B92089FF
+F7A8FE6089FFF793FE42F654000059FFF7A0FE02200290
+4FF40060019004F500501430009004F52050284B0FF2A0
+0150221430FDF728DD002004B010BD38B50C461C490A78
+012A18BF002A02D06FF0060032BD08B1002C02D54FF0FF
+3032BDC8600C6142F64C0216488068505001F520511431
+0120FCF74BDA4FF4FA611820FCF7DEDA050007D1002300
+224FF4CC710FF24C00FBF732FE28074CBF20466FF00700
+32BD13460A4601460248007810F469B000001453890055
+47800065478000687B890060D09100354780002B488000
+436870704C696E6B5461736B00000000633A5C77735C62
+6F645F3437373631333033325F3536353130355C637573
+746FF19403D04A80006D6572735C676F6F676C655C5032
+31466C61677461696C6D63755C64656C69766572795C53
+656E736F724875625F5032315C7372635C636870705C70
+6C6174666F726D5C62636D5C42434D343737785C706C61
+74666F726D5F636870705F6C696E6B2E63000000002DE9
+F04104460D46AE1DA888971F05284DD8DFE800F003141E
+28344004F110084046FFF754FB2946204600F042F80446
+10B14046FFF770FB2046BDE8F08104F128084046FFF743
+FB2946204600F086F8EDE704F140084046FFF739FB2946
+204600F0C9F8E3E704F158084046FFF72FFB3B46324629
+46204600F0EFF8D7E704F170084046FFF723FB3B463246
+2946204600F0F7F8CBE704F188084046FFF717FB3B4632
+462946204600F0FCF8BFE70124C2E7F0B5054683B06879
+0FF2A047002404280E460ED1F7233A460FF26C418B200E
+F432F500230022F8213846FBF75AFD012438E02868AA68
+406852680FF2D461904770B9FE233A460FF2CC418B200E
+F41BF500230022FF213846FBF743FD0C2421E040F20313
+3A460FF2C8418E200EF40BF50420687106213046FFF7B5
+FA58B940F20B13019300973A460FF2C4418B200EF4FAF4
+042406E00246062305F110012846FFF71CFB204603B0F0
+BDF0B5044683B0A0680FF2F43780680D46804700266671
+40F227133A460FF298418E200EF4DBF406212846FFF787
+FA60B94FF497700190034600973A460FF264418B200EF4
+CBF4042606E00246062304F128012046FFF7EDFA304603
+B0F0BD10B504460FF29C326079042808D0BDE8104040F2
+43130FF25C418C200EF4AFB440F245130FF27C418E200E
+F4A8F400206071A0688068BDE810400047F0B504460846
+83B00A21FFF74AFA002506000FF250370BD140F25F1301
+9300973A460FF2E4318B200EF48BF4042516E0A068C068
+8047C6F806000A21019100904FF4B3733A460FF240418F
+200EF479F40A23324604F140012046FFF79DFA284603B0
+F0BD38B500250446092B104638BF022509D3A368D0F805
+20D0F8011000781B69984700B9FF25284632BD38B50025
+052B044638BF022507D3D2F801101078A2689269904700
+B9FF25284632BD7CB504460D4600260BB902261FE0A168
+1078096A884708B9FF2618E006212846FFF7E8F960B90F
+F290220FF23031009240F2E11301938B200EF42CF40426
+06E00246062304F188012046FFF74EFA304676BD1CB506
+20FFF7B5F9A8B940F2F9130FF254240FF2F42101930094
+22468B200EF410F4204602B0BDE81040002300224FF4FD
+71F19403604E8000FBF734BC814B197901700622062181
+8001461868006802B0BDE81040FCF7C9BF70B504460FF2
+8840784E84B0D0E90023CDE9022330798DF808000D4696
+F869008DF80A00082102A8FFF792F980B940F219230FF2
+E0140FF280210193009422468B200EF4D5F30023002240
+F21A2162E08471C5710246082306F1580160E030B583B0
+044601AA694600F0F5FA5F4D48B940F22F230FF29C120F
+F2FC218B200EF4B7F313E0009928790870032000994870
+0020009988700099C8700720009988802868019A009900
+68FCF773FFA96849692046884703B030BD70B504460FF2
+D8304A4E84B0D0E90023CDE9022330798DF808000D4696
+F881008DF80A00082102A8FFF736F980B940F256230FF2
+28140FF2C8110193009422468B200EF479F30023002240
+F2572106E08471C5710246082306F1700104E02046FBF7
+98FB04B070BD3046FFF790F904B070BD30B583B0044602
+AA01A900F063FA2C4D60B995F881000FF2D0020FF26421
+009040F26F238B200EF44EF315E0019928790870032001
+994870019995F88100887000200199C870082001998880
+2868029A01990068FCF708FFA968C9692046884703B030
+BD38B504464FF0827000F0B5FC144DA86078B90FF27004
+0FF24C214FF4237322468B200EF41EF30023002240F28D
+2120460EE02C6029460FF280222046FFF760F8287150B9
+0023002240F293210FF2380001B0BDE83040FBF732BB31
+BD0000D088890025643A256409474E5353207365727669
+636520616C7265616479206F70656E0A00000000633A5C
+77735C626F645F3437373631333033325F353635313035
+5C637573746F6D6572735C676F6F676C655C503231466C
+61677461696C6D63755C64656C69766572795C53656E73
+6F724875625F5032315C7372635C636870705C73657276
+696365735C676E73732E63000025643A256409474E5353
+2050414C206F70656E206661696C65640A0025643A2564
+09474E53532073657276696365206F70656E65640A0000
+25643A2564094F4F4D2061742025733A25640A0025643A
+256409474E5353207365727669636520636C6F7365640A
+000025643A256409474E53532073657276696365207265
+73657420627574207761736E2774206F70656E0A000000
+25643A256409474E535320736572766963652072657365
+742E20436C6F73696E670A000025643A25640963687070
+476E7373536572766963654765744361706162696C6974
+6965732072657475726E696E6720307825782C20257A75
+F19403F05180002062797465730A0025643A2564096368
+7070476E73734C6F636174696F6E4576656E7446726F6D
+43687265206661696C656420284F4F4D3F290A00002564
+3A25640963687070476E7373446174614576656E744672
+6F6D43687265206661696C656420284F4F4D3F292E2054
+72616E73616374696F6E204944203D20256868750A0000
+0025643A256409474E53532050414C2041504920766572
+73696F6E206E6F7420636F6D70617469626C6520776974
+6820434850502E2043616E6E6F74207265676973746572
+20474E535320736572766963650A00003A6411A2505B44
+42AFDB418E3A74FAF4474E535300000000000000000000
+000001000000F34C8000394B800000000000060000002F
+4E8000814E8000DF4E8000394F8000AB4F800000000000
+030000000000000004000000407880013A307047D0E900
+230A604B60D0E902238A60CB6002690A6142694A618269
+8A61C269CA61026A0A62808C888401F126000021017041
+707047D0E900230A604B60D0E902238A60CB60D0E90423
+0A614B61D0E906238A61CB61026A41F8202F426A4A6082
+6A8A60C26ACA60026B0A61828E8A82C28ECA82028F0A83
+00F13A0213788B765278CA76C06BC86170472DE9F84304
+460D46002028709046607868701F460621A81C25F42AF3
+05F1080104F10800FFF7A8FF089E308880446078800168
+86318810FA81F0874206D2002300225F210FF22010FBF7
+68F9688EE0B1318810FA81F0874217D30027B94609E020
+6B41464844FFF7A1FF7F1C08F1400809F1400960788742
+F2D33088698E2886308808183080BDE8F18300202886BD
+E8F183D0E900230A604B60002382688A60C268CA600269
+0A6142694A6182698A61C269CA61028C0A8401F1220213
+705370426A4A62826A8A62C06AC8627047F0B50D0083B0
+0446164606D10023002282210FF28400FBF71AF936B900
+23002283210FF27400FBF712F92046FFF739FF0746FEF7
+B6F9286060B13421ADF80410821D01A900913B46811D20
+46FFF771FF3760012003B0F0BD70B50D000446164606D1
+0023002295210FF23000FBF7EFF836B90023002296210F
+F22000FBF7E7F83620FEF78EF9286030B1811D2046FFF7
+99FF36203060012070BD633A5C77735C626F645F343737
+3631333033325F3536353130355C637573746F6D657273
+5C676F6F676C655C503231466C61677461696C6D63755C
+64656C69766572795C53656E736F724875625F5032315C
+7372635C636870705C636F6D6D6F6E5C676E73735F63F1
+9403805580006F6E766572742E63000000002DE9F04304
+4683B060780FF26C480FF22841DFF8C863019031230FF2
+0840009042468F200EF45EF0716800291CBF607800282F
+D0C96838208847070005D10023002235214046FBF77BF8
+38222146384624F41AF00020386371686078C968850128
+4688475FEA000905D1002300223C214046FBF765F8216B
+2A46484624F404F0C7F83090B16829B10969384603B0BD
+E8F043084703B0BDE8F08300000FB42DE9F0412DED028B
+84B00FF2CC389DF878600FF250440FF26041C84D019600
+94472342468F200EF40EF06968002963D0F00761D5C968
+30208847060005D1002300224E214046FBF72CF8DDE90C
+0129F46EF6C6E900019FEDBA8B0EA806F10807D0E90623
+51EC180B22F4E1F623F425F038600EA8D0E9082351EC18
+0B22F4D7F623F41BF078600EA8C16A806A25F4B1F0B860
+DDE90E01AC4AAE4B23F412F125F4A8F0F8600EA8C16880
+6825F4A2F038610EA8C16B806B25F49CF0786186231F20
+388342460020B876F8761EA80FF2D431C068F8611EA800
+6938621EA840697862388B0290019600948F200DF4ACF7
+A96811B189683046884704B0BDEC028BBDE8F0015DF814
+FB10B58D4C82B06060A1600020F7F4C8F0A06808B10068
+80470FF2A4300FF2B4220FF2A831009095238F200DF489
+F7012016BD80B50FF2A0300FF298220FF28C3100909A23
+8F200DF47BF700F0D1FC00F023FCF7F4A9F07848002141
+60816001BD00B583B007200190A8230FF27C300FF26422
+0FF28C3100908F200DF461F7072003B000BD70B588B004
+0014BF54204620019003920E460FF27C300FF238220FF2
+9431654D00900296B2238F200DF448F7B6F57A7F38BF4F
+F47A76B4B10020029000964FF4C8700390019605208DF8
+100000208DF811005E480590002006900790684600F027
+FC064606E000F081FC0646287808B9F7F4C2F0AA6852B1
+2EB90021601E8041C043C00F01E0012100205268904770
+1E8041C00F08B070BD1CB504460FF228300FF2AC120FF2
+3C3100900194D3238F200DF404F73F48416821B12046BD
+E81C400969084713BD70B50C4686B0B4F57A7F054638BF
+4FF47A7445B13A48049003940020059003A800F055FB01
+E000F092FB06463048826852B12EB90021681E8041C043
+C00F01E001210020D2689047002D14BF54204620019002
+94EB230FF2E0200FF22C120FF2FC2100908F200DF4C6F6
+701E8041C00F06B070BD38B504460FF2F8200FF20C120F
+F200211A4D0090F3238F200DF4B3F6696849B1206BF194
+031059800009698847696821B12046BDE8344009690847
+31BD1CB5040014BF542046200190FA230FF2DC200FF2CC
+020FF2FC2100908F200DF495F6084804703CB180680028
+1CBF8068002804D0094800E00020F7F425F0012016BD00
+001CA5890000000000D0126341B4C876BE8D5580009F1A
+FF3F295680001CB504460FF2BC200FF274020FF29C1100
+90019440F217138F200DF467F6200E012814BF00200FF2
+B02016BD6272636D476E73734F6E4D6561734461746100
+0025643A2564095B25735D204D6561737572656D656E74
+2064617461206576656E74203A206D6561737572656D65
+6E745F636F756E74203D20282564290A000000633A5C77
+735C626F645F3437373631333033325F3536353130355C
+637573746F6D6572735C676F6F676C655C503231466C61
+677461696C6D63755C64656C69766572795C53656E736F
+724875625F5032315C7372635C636870705C706C617466
+6F726D5C62636D5C42434D343737785C73657276696365
+735C706C6174666F726D5F676E73732E63000000006272
+636D476E73734F6E506F736974696F6E000025643A2564
+095B25735D20706F736974696F6E56616C696469747928
+307825303278290A0000000025643A2564095B25735D20
+6576656E7428307825303878292C203078253034780A00
+0000676E737350616C4F70656E0025643A2564095B2573
+5D0A00676E737350616C436C6F736500000000676E7373
+50616C4765744361706162696C6974696573000025643A
+2564095B25735D203078253038780A0000676E73735061
+6C436F6E74726F6C4C6F636174696F6E53657373696F6E
+00000025643A2564095B25735D2025632C2025642C2025
+640A0000676E737350616C52656C656173654C6F636174
+696F6E4576656E740025643A2564095B25735D20657665
+6E7428307825303878290A000000676E737350616C436F
+6E74726F6C4D6561737572656D656E7453657373696F6E
+0000000025643A2564095B25735D2025632C2025640A00
+00676E737350616C52656C656173654D6561737572656D
+656E74446174614576656E740000676E737350616C436F
+6E666967757265506173736976654C6F636174696F6E4C
+697374656E65720025643A2564095B25735D2025630A00
+006368726550616C476E73734765744170690000000000
+0401315780006357800091578000B55780004D5880007B
+588000EF5880002559800038B504460D4604F12000F6F4
+93F485ED000BE06B24F40AF6C5E90201A06B24F4F19403
+A05C800005F6C5E904010020C5E9060094ED000B85ED08
+0B94ED020B85ED0A0B206924F4F5F5C5E90C01606924F4
+F0F5C5E90E01A06924F4EBF5C5E91001606B00F00101C0
+F3401030B1206BDFF87024904238BF41F0020105F14800
+0170616C4160A16C8160E16CC160216D0161616D416131
+BD2DE9F0410446DFF84804DFF84854ADF5327D86693000
+04BF2868002870D0E4B28DED580BADF8684100204FF680
+7843E001EBC0020DF5B07C537803F00F07062343439C44
+4FF67F0EBCF83CC00EEA0C0C4CEAC7170DF5B07C9C440D
+F5B07EACF83C708644177807F03F0C8EF80AC00DF5B07E
+17F0C00C674618BF01279E4492F806C0BEF83CE00CF03F
+0C08EA0E0E4CEA87170DF5B07C9C4447EA0E07ACF83C70
+0DF5B07C57889C44401CACF83E7058AF9288DB19A3F840
+20A042B9D33000DFF8987307D03868569058A984B000F0
+1CF80FBCB0472D68280007D03868569058A984B000F011
+F80FBCA84722460DF5327DBDE8F04132230FF284319720
+0DF430B40DF5327DBDE8F08168464FF4B47223F409B400
+002DE9F0470F00AEB002D1562100F0C6F8DFF83493D7ED
+060A99ED000A97F83400DFF82883C54CB8EE400AB4EE60
+0A00F00106F1EE10FA48BF002609D4002E1CBF20680028
+04D0D8F80000401CC8F8000016A93846FFF702FF002E14
+BF542546256069DFF8ECA20690DAF800000590D9F80000
+DFF8D0920490B86924F405F5CDE902010095DDE916230F
+F2143197200DF4DDF36569D9F800002DB9DAF800A05FEA
+0A0133D029E0216851B1A16831B1D8F800209142BF41FF
+43FF0F02E0012700E000272EB99DF8A01001F0FE018DF8
+A01047B1149016A984B06846602223F498F30FBCA847DA
+F800A05FEA0A001CBF61698A450BD057B1D9F800001490
+16A984B06846602223F484F30FBCD047A06828B1D8F800
+10814228BF00F0F0F82EB0BDE8F087000010B5040088B0
+02D1DC2100F035F80ECC87480EC04FF47A72B1FBF2F151
+4340F80C1D7D4802686AB90020029000914FF4C8700390
+01910020ADF8100005900690079009E06B4690EC080B83
+EC080B8A4238BF114601910091012000F0D5F9684600F0
+EAF96946734891EC080B80EC080B002008B010BD00000F
+F2E810FAF76CBB80B5002000F0C0F96949002008602021
+684823F4F9F26048016811B9F7F466F501E000F0C9F900
+2002BD0000F0B58FB004460D461646684638215D4F23F4
+E4F23A680FF218312B4697200DF42DF3386888B17F6838
+000ED000208DF800008DF8015002A831462822F1940330
+60800023F400F34C4801680C946846B8470FB0F0BD0000
+10B54E4C23784BB1022A07D130B129B90FF2DC10F7F46A
+F50020207010BD000030B5050091B003D140F22F11FFF7
+A6FFE2F446F74249394C00F014FE95EC080B84EC080BE0
+6923680FF2BC120FF2C8110790A069069060690590607C
+0490207C0390E0680290A06801906068009097200DF4DC
+F26069002804BFA069002807D03048F7F47FF40FF21C21
+97200DF4CEF260684FF47A71B0FBF1F1D8B101B901214F
+F47A704843606008A894EC080B80EC080B2148006838B1
+1E4821680068814238BF08460990089008A800F037F917
+4900200860002011B030BD000010B51548006810B9F7F4
+C4F402E0134800F026F90A4CE269100003D00A48016800
+2090472021204623F442F20FF2B41197200DF48DF20020
+10BD0000A125260054F8910080F8910078F8910090F691
+0074F891007CF8910010BB91001CBB91008CF691004560
+8000255E80005075626C697368656420736174656C6C69
+746520696E666F2025642F25640A0070617463685F676E
+73735F6F6E636869702E6370700000004F6E476E737346
+69785374617475732054533A256620563A256320457374
+4572724D3A256620476E73734163634D61736B3A256C75
+206D5F6F6E5F676E73735F706F733A3078253038782C20
+6D5F7265715F706172616D732E676E73734F6E506F7369
+74696F6E3A3078253038780A002470676C69726D2C7374
+6F702C7076744F6E4368697000004272636D476E737353
+7461727400000025732072657120706172616D73203A20
+466978496E744D7320256C752C20527074496E744D7320
+256C752C204D6178466978436E7420256C752C20416363
+4D61736B4D20256C752C205077724D6F64652025642C20
+526571547970652025642C20506F73436220307825702C
+2053617453746174436220307825702C2053746F704362
+20307825700A0000004F6E476E73734669785374617475
+7320726567697374657265640A004F6E476E7373466978
+53746174757320756E726567697374657265640A000000
+4F6E4D65617344617461203A2025642C2075634D656173
+7572656D656E74436F756E74203A2025640A00000030B5
+83B00446F5F425F7806F0168CD6B2CB100210191009102
+23022204E0002101910091022300224FF0FF31A84737BD
+F0B504469BB020684FF47A71B0FBF1F525B952210FF2E4
+00FAF782F9207C0027002608B9304E20E00528304902D1
+0E462F4F1AE0022804D0012804BF627C002AF19403C063
+800003D10E4648F208070FE0032804D0012804BF627C01
+2A03D10E4644F2083704E0042804BF0E4640F60837E068
+0FF2A401019000963B462A4696200DF439F1E068322838
+BF322004D3B0F5C87F88BF4FF4C870E060024617480FF2
+A80102601148036896200DF424F1324639462846F6F4ED
+F7114D287898B9617C0FF2AC028020012908BF4FF4C070
+009048F6A043642101A823F4A9F201A8F7F46AF3012028
+701BB0F0BD747B89000800002008FB00200880002090F6
+91008CF6910070617463685F676E73735F736572766963
+652E63707000005374617274476E737352657175657374
+20256C7520256C7520256C75205265714163634D61736B
+20256C752000000000476E73734163634D61736B20256C
+75204D61784E756D4368616E6E656C7320256C750A0024
+70676C69726D2C7265715F62726561646372756D622C70
+76744F6E436869702C706572696F645365632C25642C62
+617463684F7074696F6E2C2564000000002DE9FC4F83B0
+8046D9F4EEF5002840F0D08000F0F7F901904FF47A7000
+9000200E99012608704FF47A731C2101FB008101F21461
+0A783AB18988D8F88C2659438A42894106EAD176401C03
+28EDD30198DFF8349700F5FA700127029008F5C66408F2
+6A6524E0022F20D199F80000E16A0028029814BF95F800
+A04FF0000A88426BEB0B0B6FEA0B004FEAD07B287848BB
+D9F8080030B300F0B5F9D9F80810D8F88C265118814280
+41C00F1CE0012F38D1E06810B92878002106E002992269
+002091428941C943C90F22780843024228D00198E0604F
+F47A720198A18802FB010020611EE00020217FD9B14AEA
+0B0181F00101314303D0A6B12978084311D00198A0624F
+F47A720198218C02FB0100E06201200E990870BAF1000F
+1CBF002089F800007F1C032F9ED39DF80C1008F5C260B1
+BB08F2BC66717839B13178022902BFA97C012941F28830
+06D0A97C01291CBF0078002801D07068009008F28C6100
+98C96A88420AD008F28C60806802680099D26890470098
+08F28C61C862A87C012804D13078012818BF012000D100
+2004990870404605B0BDE8F04F00220021F7E100790028
+04BF207F002802D10E990120087005B0BDE8F08F00F214
+610A78097F90F84C0642EA410141EA8000C0B270472DE9
+F0474FF6FD748046A14282B008F27465DFF8A8650FF2B0
+593BD100F0CAF80FF2D45276690FF254640E21B0472E6A
+00F000F903463046D8F8C4160FF2E45200910E21366876
+69B04798F869060FF2F852002814BF5421F19403506780
+004621286A00910E210668D8F800307669B04700260DE0
+182101FB0681286A097F009133460768D7F814C022460E
+21E047761CD8F800008642EDD38CE04FF6FF7C614508F2
+1464DFF8187529D1162031F487F30FF2006A40B12DF48E
+F4CDF8009033465246162131F48FF300F077F876695246
+0E21B04700F075F9F8701C21012088F8BE06E068E86320
+4624F421F11C2108F5C66024F41CF1002088F869065AE0
+4FF6FE76B14226D1207850B9E06068602860286A016809
+6988470020B8800120B870F87860B100F04DF903210842
+07D000F084F80546D9F467F72946DAF47AF7404600F0FB
+F9002088F8BE0602B04046BDE8F0476EE04FF6FC76B142
+04D1BDE8FC470121E2F4EAB7180507D501202077E18320
+8463840020E0621CE018061AD4012020706180A280E380
+0A9800B9032020810B9860810D9E0EB9002002E000F04D
+F830182061002E0CBFE86B0020E06066610E98A061BDE8
+F3870000286ACDF800903346066870472DE9F041804682
+B00F461446162031F4F3F258B12DF4FCF30FF2EC31DFF8
+DC330FF2E4420091162131F4FAF208F24C65DFF8C4635F
+B101202870AC8000F01AF80746D9F4FDF63946DAF410F7
+03E000202870A880F0800020286101203070404600F088
+F9404602B0BDE8F04100220121C6E000004046E3F421B0
+00002DE9F0478046894630F44AF34846E3F417F009F214
+658246E86809F5CD6630B9B17821B169694C1EA441E40F
+00E00024002804BF6869002807D0306D29695044A0F5FA
+70884228BF0124B078CB4F58B9B86848B14846E2F4F3F7
+B968726A511881428041C00F00E00020A979890703D5B9
+7809B1B1780C43012100224FF47A734FF01C0C0CFB029C
+0CF2146E9EF800C0BCF1000F0AD0BEF804E0D6F824C003
+FB0EFEF4456CEB0C0C01EADC71521C032AE6D32A7802B3
+84F001020A4303D0D9B1B178084318D0C5F80CA0A88803
+FB00A028614046B5F9021030F41CF13069401C3061B078
+20B1F068401CF060002000E00120B87000206861287F00
+281CBF3078002806D0B5F91E104046BDE8F04730F401B1
+BDE8F08700002DE9F843804608F26A650C46687F954F84
+F0010630430DD100F026F838B9FFF75FFF8146D9F442F6
+4946DAF455F6FFF757FFB8606C7714B900202870B86032
+460021404600F012F87E69300009D0404600F000F90746
+00F007F80146687F3A46B047BDE8F1830000404613E62D
+E9F84F82460AF2BC640027A0786FF0504800281646C146
+4ED10AF27C6531B92078012818BF0228F19403E06A8000
+01D0607870B92F7000215046E2F460F783465046E2F43E
+F75844C345A06006D1012709E028780128EED10121EDE7
+286958453CBF0127D946287B48B31EB13FBBA869012118
+E0E87A88B157B1A86902689268002190470120A8720020
+C145686008D1A86901684968BDE8F44F084747B1C145F6
+D0A8694946BDE8F84F026812681047A86902689268BDE8
+F84F01211047BDE8F18F4FF47A725143C0F88C16704770
+B5044604F5D3660D4635602DF49CF243F410F7706085B9
+4FF4C161204622F417F5434800218180C1808160017001
+21817000214170C160016170BD10B5044600F06EF80128
+08D0204600F069F8022805D1204600F05CF808B1012010
+BD002010BD000032484170704700003048407870470000
+2E48C160026170472C48C3680B600069106070471FB502
+91039200210020D9F451F40168896B884708230468A469
+02AA48F2A311A0471FBD70B500F24C6400F21465217828
+781D4EE8B1C1B1A188A88830F420F3A988B1804FF47A73
+A288F2804343226C9A4214D291FBF0F111FB00F1A980F1
+8891FBF0F111FB00F008E0B08838B1A88070BD00291CBF
+F088002800D0A08070BD0B480170704700000948007870
+4700000848017070470000064800787047000001484161
+70470000787B8900719F080099CB91009ACB91002F2F64
+65706F742F636C69656E742F636F72652F72656C2F476F
+6F676C652F5032322F3535343830332F2E2E2E0000007E
+24247E5056542044756D70203A20474C4C207665722E20
+256C7520666C61677461696C3A25730A000000007E2424
+7E5056542044756D70203A2054203D20256C752C204E54
+203D20256C750A0000007E24247E5056542044756D7020
+3A2047656F66656E6365203A206E756D203D2025642C20
+496E646F6F72203D2025630A000000007E24247E505654
+2044756D70203A2047656F66656E6365203A206964203D
+2025642C20737461747573203D2025640A00474C4C2076
+65722E20256C7520666C61677461696C3A2025730A0000
+474C4C207665722E20256C7520666C61677461696C3A25
+730A000000676C70655F6E6176737466696C7465722E68
+00002DE9F8432DED028B04468EB0A1602AF4E9F40546A0
+690FF2506810B9242100F069FA1020A0876FF000413020
+E08704F586791420A4F8400004F582776E20A063A06888
+4200F0218204F567760020DFF8501530728D421CBFDFF8
+48158D4210D0DFF844158D421CBFDFF840158D4208D0DF
+F83C158D421CBFDFF838158D4240F0F19403706E8000FF
+81A069DFF83015884208D0DFF82C1588422CD0DFF82815
+884217D03AE0207902280AD14FF0E040DFF81815C4E908
+01DFF81405DFF8141529E0DFF81405DFF82C15C4E90801
+DFF80C051EE02079032802D0D22100F00EFADFF8FC04DF
+F8FC14C4E90801DFF8F804DFF8F8140FE02079032802D0
+D82100F0FDF9DFF8EC04DFF8EC14C4E90801DFF8E804DF
+F8E814C4E90A0102E0DE2100F0EDF90120307029462046
+2CF4ABF23073294620462CF4D2F284F8C5030A2104F26A
+30017019214170002181701021C1706C20A063A1870020
+2DF48EF710B93220E0870DE000202DF487F72EF45DF340
+69E08700202DF480F72EF456F3807F00B10A20A4F84000
+002501203870002004EBC00191F8441009B1012502E040
+1C1828F5DB04F2EB16307C08B93220E0870820A4F84000
+38220FF2D841484622F446F3DFF83C0438649FEDC98ADF
+F83804786020462168896C8847032812BF0428DFF82804
+786000207864B0EE480A2168D1F8E01120468847DFF814
+04386587ED138A002D04BF3078002800F03B8138220FF2
+B841484622F41AF33078A8B39FEDB48A97ED100A30EE08
+0A87ED100A204697ED010A30EE080A87ED010A2168896C
+8847032818BF042807D120462EF4EFF218B94FF4A57100
+F052F997ED110A30EE080A87ED110A97ED120A30EE080A
+87ED120A97ED130A30EE080A87ED130A97ED140A30EE08
+0A87ED140A0DF11100039005AB0DF1160002900DF11502
+0DF11200019004A90DF11300009020462CF4BDF59DF810
+00002874D0032803DB4FF4AD7100F01DF99DF810000228
+05D1307830B140F25B1100F013F9307800283BD19DF810
+0097ED100ADFED830A9FED831A01280CBF30EE010A30EE
+200A87ED100A97ED010A0CBF30EE010A30EE200A87ED01
+0A97ED110A0CBF30EE010A30EE200A87ED110A97ED120A
+0CBF30EE010A30EE200A87ED120A97ED130A0CBF30EE01
+0A30EE200A87ED130A97ED140A14BF30EE200A30EE010A
+23E09FEDAE0AD7ED100A70EE800AC7ED100AD7ED010A70
+EE800AC7ED010AD7ED110A70EE800AC7ED110AD7ED120A
+70EE800AC7ED120AD7ED130A70EE800AC7ED130AD7ED14
+0A30EE800A87ED140A9DF815009FED9B8ADFED9B8A88B1
+032803DB40F2731100F0A1F89DF8150097ED010A01280C
+BF30EE280A30EE080A87ED010A9DF8140088B1032803DB
+40F2791100F08CF89DF8140097ED100A01280CBF30EE28
+0A30EE080A87ED100A9FED878A9DF81300DFED868A88B1
+032803DB40F2811100F073F89DF8F19403007280001300
+97ED120A01280CBF30EE280A30EE080A87ED120A9DF812
+0088B1032803DB40F2871100F05EF89DF8120097ED130A
+01280CBF30EE280A30EE080A87ED130A9DF8110088B103
+2803DB40F28D1100F049F89DF8110097ED140A01280CBF
+30EE280A30EE080A87ED140A0020A07421E040F2092100
+F036F81CE064486449C4E9080164486449C4E90A013822
+1220A087E0870020A4F84000012038700FF24821684878
+60684622F4C5F138226946484622F4C0F1E08F312803DB
+40F21F2100F011F820462BF47AF70EB0BDEC028BBDE8F1
+8300009A99954114AE41C37B140BC20AD7CBC14046F9F7
+DBB9000038B50D46044601212CF414F32168896F204688
+47002842D0297809B1212907DB42290EDB512903DB7629
+27DB9A2936DA00F098F802282CD000F094F805280FD127
+E0212901DB3429F2DB342927DB0FF2E41000EBC100A0F5
+D07090ED000B31BD00F080F8012802D19FED310B31BD00
+F079F8042806D19FED300B31BD00F072F8072802D19FED
+2E0B31BD00F06BF8082802D19FED2D0B31BD9FED2D0B31
+BD9FED2F0B31BD11000030110000331100003411000035
+110000371100003880BA8C0100F0490200751903AA9697
+41ABAAAAEA8D737F416666663FDDDDDDA9EC51B8974498
+9741E5174BCAB0757F418FC2F51645989741BF58F273B1
+757F410000E4411F85ABC00000ACC100001AC2D8A314C1
+7B140B420AD7CB41333391418FC2414100FCF8DB1AAC97
+410030C77C15F092413F219BE18F6D4C3F560691E929A2
+61BFFA49C47AF49D47BF133680DA4F965F3FCF68A6D90E
+D6473FAE4719C1000000000000000028462CF48DB70000
+70617463685F676C6D657372645F617369635F636F6E66
+69672E637070000000F628DCBE295C0F3F0AD7233E3D0A
+B7BF14AE07BF295C0F3F8FC2753D48E13ABFC3F5283FB8
+1E05BE8FC2753D8FC2753F48E13ABF8FC2753FF628DCBE
+295C0F3F0AD7233E3D0AB7BF14AE07BF295C0F3F8FC275
+3D48E13ABFC3F5283FB81E05BE8FC2753D8FC2753F48E1
+3ABF8FC2753F0000304000003040333313400000A03F33
+33B33E333333BF9A99B9BF1F85EBBF3333F3BFCDCCCCBF
+CDCC8CBFCDCC0CBF3333B33ECDCC0CBFADF3606CD08062
+BFF365376DA55B5FBF8BE4AC01AAB559BFA62103A9AF0F
+54BF7D40F17A68D34CBFB3BA9DC9738741BF8FDF22CAF3
+ED28BF9A372BFBDE41243FB6D0DF956E5C403F85D3F46C
+65A84B3F2AEB04222E7A533F0FAEAE7A2820593FF47058
+D322C65E3F2E79711F0F36623FF194039075800010B532
+230822DFF8941ADFF8940ADFF8944A28F48FF522460FF2
+1D01002028F43EF6DFF8840AA6F4D5F52246BDE81040DF
+F8A81A28F433B632230822DFF86C1ADFF85C0A28F4EEB5
+2DE9F0430D00D1B0044690461F4600F0A580291DD9F42C
+F100F0AEF8D9F49AF100F0B0F80FF69C2918B12CF461F5
+00F099F8DFF8486A00203070707000F09CF800F008F99D
+F8000030B100F09BF818B12CF44EF500F086F870780028
+EED0002084F8200000F084F805F14C012046D9F4D7F300
+F0010080F001069DF8000030B100F080F818B12CF433F5
+00F06BF8002EE8D100F06DF841462046D9F4EBF500F071
+F818B12CF424F500F05CF800F060F839462046D9F486F6
+00F064F818B12CF417F500F04FF800F057F800F05FF800
+F059F818B12CF40CF500F044F800F052F8B8B100210020
+D8F4FBF60168896A884700F0DCFD03464FF4A072694620
+4600F045FA30B100F03EF818B12CF4F1F400F029F895F8
+4800C00713D5589FD4F80401391A00F025F82046D9F458
+F500F02AF818B12CF4DDF400F015F839462046DAF405F0
+02F0A3FD00F017F8D9F43BF200F019F818B12CF4CCF400
+F004F851B0BDE8F08300006B464A46152130F4C9B30000
+4FF4A0736A4670474FF4A0736A46294620467047152030
+F4A7B300002DE9F0412DED028B8AB0054616461F460FF6
+38131C6809AAB819401E146086423ABF801B441C002408
+68089009A88A6CC2F3812201F5F078105C07909FED208B
+D1E90C0120F49CF70690D8E9022351EC180B20F421F720
+F493F70590D8E9002351EC180B20F418F720F48AF70490
+DFF86C08006820F4BAF7DFF86428DFF8643820F438F6CD
+E90201DFF85C08006820F4A3F7DFF85828DFF8743820F4
+2BF6CDE900012B460FF6A8022146304631F462F33A4631
+46284600F089FA0AB02AE20000000000000000E03F2DE9
+FF4F87B09818401E06900120DFF83818DFF814B8DFF8EC
+8708709BF80000002840F0CE800BF10800A6F4A9F40026
+08EBC60004F012FC761C322EF8DB00262FE00021BAF100
+0F02D19DF80020AA802C706F7001220FF6BC03AA701F68
+009711B100218DF80110761C01981AF80D1042780778F8
+09CC1CA040C7F380178C1CA7400743D0094C1CA040C2F3
+8012EB88384302FA01F108431843E88002A87CF46BF508
+9890F84C00F6B2864280F08980089800EBC6004E300190
+4FF0000A007800F03F070198407800F00F04C0F3011901
+98807900F03F0100F0C00040288DF8001004D0802808BF
+4FF0020A01E04FF0010A082CF194032079800005DB40F2
+A6310FF2F470F8F7B9FE394603A896F493F62046ACF440
+F2014603AA02A8ACF43BF403A880F428F502A90BF10800
+04F0B5FB002550B3A94606E003A87CF420F509F101005F
+FA80F900F0F6F881452EDA08EBC9000590417804A896F4
+6DF618F83900ACF419F2014604AA03A8ACF414F404A880
+F401F502A903A8E4F401F70028DBD0059D03A87CF4FBF4
+0FE000F0D4F8054602A90BF1080004F06CFB08EBC50528
+4604F0A7FB4FEA0910E8802DB940F2C1310FF24470F8F7
+61FE052C08BFBAF1010F7FF442AF012143E7069E09980F
+F25072B0423ABF301A411C00210998022331F468F20999
+441800F0A6F8401D062190FBF1F74FF00009FFB27FB1B4
+423ABF301B411C00219BF800000FF22472401C00903B46
+204631F44DF2041901A80FF63001102221F4F4F59BF800
+00062110FB01FA0AE001AA09F1010952F82020204631F4
+38F204190AF1010A00F075F85FFA8AFA824555D25FFA89
+F9B9F1060F50DA08EBCA05287808B9472317E0012808BF
+532313D0022808BF52230FD0032808BF51230BD0052808
+BF422307D0062808BF452303D007280CBF4E237823B442
+3ABF301B411C002168780FF28C620090204631F400F204
+19A87870B1B5F90430012B0ADBB4423ABF301B411C0021
+0FF27462204631F4EFF10419EB880020B3F5004FA8BF03
+2007DAB3F5006FA8BF022002DA802BA8BF0120B4423ABF
+311B491C002198E7DFF84C15BDF9282000200870099907
+9800F0FBF89BF80000401CC0B2B842A6BF002001210021
+8BF801108BF800000BB0BDE8F08F00000BF10800A6F430
+B32DE9F0412DED028B044698469AB00D4616464046E8F4
+AAF607463868002878D00FF2E8510EA891EC0C0B80EC0C
+0B4146684604F02FFBDDE90001002908BF00282DD0D7E9
+0E21101A0021CDE90E01D7E91021DDE90201101A0021CD
+E91001D7E91421DDE90401101A0021CDE91201D7E91621
+DDE90601101A0021CDE91401D7E91821DDE90801101A00
+21CDE91601D7E91A21DDE90A01101A0021CDE918010EA9
+204600F03BF8386BD7ED078A0C90B0EE408AF86A0B90B8
+6A0A90786A0990386A089018EE900A22F43FF6CDE90601
+059438EE880A38690490B86803903868029010EE100A22
+F430F6CDE9000104230FF24C523146284631F43DF13246
+2946204600F064F8404604F0CBFA4046E8F430F601201A
+B0BDEC028BBDE8F0812DE9F84FD1E90045002D04BF002C
+9FED240A42D0D1E9068B4FF41666A6FB082306FB0B33D1
+E9088B41F2040600F03AF8F19403B07C8000D1E90A8B12
+EB0A027B4142F2747600F031F8D1E9048B12EB0A027B41
+40F2DC5600F028F812EB0A02D1E9028B7B416420A0FB08
+6900FB0B99901943EB090127F41FF406460F4620462946
+27F419F40022DD4B20F4A9F302460B463046394620F4ED
+F522F483F500EE100ABDE8F18F000000000000A6FB08A7
+06FB0B77704700005018002200F8012D491C02E011F801
+3B5A400B78002BF9D1884224BF2A2301F8013B13061B0F
+0A2BB4BF30333733884228BF01F8013B02F00F020A2AB4
+BF30323732884228BF01F8012B884224BF0D2201F8012B
+884224BF0A2201F8012B884224BF0020087070472DE9F9
+4F81B00C462DED0A8B94B01646BDF9A810C818451E1F99
+20220CA821F43DF43088ADF81C0007A97088ADF81E00B0
+88ADF82000F088ADF822003089ADF824007089ADF82600
+B089ADF82800F089ADF82A0000200B901F98D8F429F520
+980FF20842A8423ABF281A411C00211F98009000232098
+31F463F0209946181F9820220CA921F40AF4A81B471C94
+F83400002800F0EA8094ED008B51EC180B21F0004141EC
+190BD4E9020121F0004141EC1A0B51EC190B20F449F403
+909FED80BB51EC1A0B20F442F406909FED7FCB039820F4
+68F400F008F953EC1B2B20F4F0F241EC190B20F432F483
+4620F45BF400F0FBF853EC1C2B20F4E3F220F427F40490
+069820F44FF402460B4651EC1A0B20F461F453EC1B2B20
+F4D3F241EC190B20F415F4824620F43EF400F0DEF853EC
+1C2B20F4C6F220F40AF4814651EC180B0022002320F47D
+F294BF4E205320AE4234BF394600210290CDF800B00498
+039B0FF220320190304630F4EBF78619D4E90201002200
+2320F464F294BF45275727AE423ABFA81B00F101089046
+206922F4C2F4CDE904010297CDF80490CDF800A0414606
+9B0FF2F4220FF20C38304630F4C8F78719AF423ABFE81B
+461C0026A06922F4A9F4CDE90201606922F4A4F400F092
+F8C719AF423ABFE81B461C0026206A22F499F4CDE90201
+E06922F494F400F082F8C7193846291A4E1C04F1340149
+7869B1A84228BF0026A06A22F484F4CDE90201606A22F4
+7FF400F06DF806E0A84228BF00262BA2314630F48BF7C6
+193046291A01F1010804F13401897879B1A84228BF4FF0
+0008E06A22F465F4CDE900010FF270224146304630F473
+F70FE0A84228BF4FF000081FA2414606E0AE4234BF3946
+00210FF25822304630F462F7BDF9A82020991F98FFF788
+FE14B0BDEC0A8BBDE8F78F000019C18000F8C9910094CB
+910008BD890085268200F19403408080003CC991008DED
+B5A0F7C6B03E38C99100FCA9F1D200BD89000000000000
+004E400000000080842E412C2C0000A9E80A004D62503F
+A2CB910000408F402C00000002460B4651EC190B20F470
+B3CDE9000142463146384630F41FB700004F4E43484950
+5F4E4D45415B305D5B2573000000444653002450474C4F
+522C31302C5354412C25732C25342E33662C25342E3366
+2C2568642C2568752C256C642C302C502C25632C4C2C30
+2C432C302C532C30303030303030302C302C302C522C30
+303030303030302C747065662C302C256C752C4C432C2C
+2C44522C302C0070617463685F676C6F6E636869705F6E
+6D65615F67656E657261746F722E637070000000000B07
+002450474C4F522C25642C5341540000002C25642C2564
+00002C2563253032642C00000000253032640000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+002450474C4F522C25642C5057522C6D412C252E31662C
+52462C25752C4F73632C25752C4D6561732C25752C5554
+432C25732C474E53536D412C252E31662C4350552C2575
+2C434F502C25752C537263682C25752C54726B2C25752C
+5270632C25750000002450474C4F522C25642C5354542C
+25732C0000002530326C642530326C642E2530366C642C
+25632C000000002530336C642530326C642E2530366C64
+2C25632C252E31662C000000252E31662C252E31662C00
+00252E31662C3130302E3000002C2C2C2C2C2C2C2C2C2C
+2C2C00000000E0B08100E8B08100F0B08100F8B0810000
+F504505830704780B5DFF8440D03F0D3FFBDE80840DFF8
+3C2DDFF8CC1D27F4C4B7000010B50446DFF82C0D2060DF
+F8BC0D04F06BFA4DF64200005D10B12046D6F4BEF54DF2
+B47000210059D1F4E8F004F559403030E0F4EDF004F559
+400830D6F4E4F704F55840A830E0F489F404F558404830
+E0F48CF404F55740A430E0F48DF400F0E3FBE0F48FF402
+F0FBFCE0F49DF404F5EE40E830E0F4A6F404F5EE401830
+DCF4C7F104F5EA409030CAF464F504F5CC40F830E0F49F
+F404F5A2409830E0F4A0F401F080F8E0F4A2F404F57850
+3830A5F4F1F504F50D50E0F4B5F404F11000E0F4C1F420
+4610BD0000DFF8000D01707047DFF8F80C4170704738B5
+0C464DF2B47115460858D1F4ACF02A462146BDE8384004
+F05CBF2DE9F843DFF8C88D04460D46C8F80C5000220021
+28463FF4D7F63222294604F1100090F48FF004F5804610
+36296830468AF4ACF0F19403D083800041F2984104F558
+47495D17F8D40F01290DD1401C7970387029462046D1F4
+00F63878022802D12046D1F42CF58CE000B97870002038
+7020462168D1F8C8108847204600F087F800F05BFBDDF4
+8BF404F11000CCF451F220B904F557408030DFF4E7F230
+468CF422F73046A5F40DF290B146F62430005D08B900F0
+8EFB47F2E170005D08B900F0F0FB02F048FC18B1012130
+468CF417F4204600F084F84DF278764AF69C29305990ED
+0C3B90ED0A2B90ED081B90ED060B2046D4F4B0F1294620
+4600F040F9286859F80410884204D204F558414FF0FF30
+0860286849F80400787810B92046D1F4CEF401212046D4
+F40CF4207B58B1E0F41EF5E1F42CF3B0F57A7F04D92168
+D1F8E8102046884731592046D6F4EEF159F804102046D4
+F4DBF328B9325929462046D6F41FF228B122683159D2F8
+DC20204690472046D1F47DF42168D1F89C102046884700
+20C8F80C00BDE8F183000038B5044604F5804510352846
+E0F4E6F3E8B100F0CBFA05F04BFE0421284607F0A3F928
+46E0F4DEF304F50D50ABF4AEF60168896888474DF2B470
+00210059D0F4DFF700F075FF0020DFF87C1D487031BD2D
+E9F041064606F55747B4B057F8780F06F50D5880B390F8
+4800C0072CD502A8A2F41AF44046ACF451F005463868DF
+F84C1D90ED060B8DED020B90ED080B8DED040B90ED0A0B
+8DED060B90ED0C0B8DED080B0020CDE90A012846A3F4BD
+F204463868006890F4F2F5002000902346012202A92846
+A3F41CF006F52A44A834204606F58045E0F48AF3103500
+284FD12846A5F428F100284AD0F86BDAF405F7E1F4E1F2
+C00743D42046E1F402F60746C7F4DDF70446411E09B238
+46C7F4F1F701460AA807F093FC002C2ED4CAF455F658B3
+0122294616A88BF49FF516A903A889F429F1002212A906
+A897F47EF0024603A9684696F45BF2684696F492F051EC
+100B20F436F001280FDBDFF87C1D88420BDA31689DED10
+2B896F9DED0E1B9DED0C0B9FED193B304688470AA8CAF4
+E9F5404607F076FCE8B940468EF490F2E1F492F2400616
+D54021404688F476F088B1012128468CF4E5F201F0B7FD
+30B12BF4FAF40FF22C0215212FF4FDF3DFF80C1C002048
+704046B0F4B8F318B1012128468CF4CFF234B0BDE8F081
+000000000070A74053696D756C6174696F6E200A000000
+002DE9F24F2DED068B04464DF27877ADF5A06D38590068
+18B900F05CFC395908609FEDDF8B385901F037FB00F0ED
+FD0028385919BF50F8481F41F0200150F8481F21F02001
+002501604DF2F971F19403608780003859095D50F8482F
+61F3C7120021026001710DF59160A5F4F5F40DF58260A5
+F4F1F4E6A8A5F4EEF403460DF5826000900DF5916204F5
+0D51C8A887F467F6BEA82BF4BAF341F2904A682010FB05
+FBDDF818055AF800000BEB000808F150005BF489F60028
+00F01581385990F84C1000EBC10000F14E0602A85BF41C
+F6024600F071F901A990F850008DF8040004F50D5088F4
+5AF4814600F065F9C06C22F456F000F05CF91FF46EF700
+F03F00B9F1000FB07100F0E6800828C0F2E3809DF80900
+30709DF80810062913D8DFE801F00412060F0A080D0000
+2009E0022007E0062005E00521717007E0072000E00320
+707009E07178052906D19DF80910891F09293CBF203030
+7002A90DF5916003F028FC18B1707840F0100011E002A9
+E6A803F01FFC18B1707840F0200008E002A90DF5826003
+F015FC18B1707840F0300070709DF804008DF80C0008F1
+50002EF4C0F401466B4603AA2046D6F4FCF581469DF800
+0040281BD100F003F9DEF411F00146B4A807F055FC01A9
+B4A83FF4C7F708B149F0400902F00AFA0146AAA807F048
+FC01A9AAA83FF4BAF708B149F080095FEA090007D001A9
+BEA82CF49CF6307849EA00003070B0799DF800100843B0
+71707800F03F00707002F015FB08F150015EF43BF578B1
+707840F040007070DFEDBD0A98ED120AB4EE600AF1EE10
+FA44BF40F08000707004F5CC40F830E0F463F2014604A8
+E0F463F201A988F496F3002801A915D004A883F456F281
+46D9F8080021F495F700F09BF81FF4ADF6B080D9F80400
+21F48CF700F092F81FF4A4F60BE002F0B3F9DCF487F600
+281DBFB0F93810B180B0F93A00B0807080385990F84C10
+491C80F84C10385990F84C00322803D102A87BF4E8F40D
+E0322803DB40F2831100F0E3FF02A87BF4DEF46D1CEDB2
+322DFFF6DBAEBEA83EF4A0F4395981F84D00385900F148
+010A791AB10A6842F040020A6002AD00681FF49CF641EC
+100B04F580406A46294610308BF4C7F5DDE902239FED9C
+9B01F0A9FB41EC1A0BB0EE4A0AF0EE6A0A31F469F52EF4
+99F6DFF8DC4B20601FF474F603F0C2F900F0EAFD00F02E
+F801F08EFD80B2B0F57A7F02D12068401C2060DDE90023
+51EC180B1FF4BFF501F07FFD01212EF448F46060C8A8A5
+F40CF7E6A8A5F409F70DF58260A5F405F70DF59160A5F4
+01F70DF5A06DBDEC068BBDE8F18F0000000000000000E0
+3F53EC182B1FF49CB5DDF818055AF800005844704704F5
+2A40A83070472DE9F043044604F50D598DB00D464846E0
+F4B8F1002838D0F19403F08A800000220021284658F4BB
+F103F0F3F88046687970BB484683F4A5F2294689F4FEF7
+4DF6A007385DC8B14846E0F49FF1A979E0F4A0F160B129
+4668463FF4E3F14846E0F494F16946A1F4B1F2684678F4
+80F4484691F419F1294690F4C6F501203855B8F1000F05
+D13046A4F47EF608B100F003F80DB0BDE8F0832168D1F8
+C410204608470000F8B504460025072600274DF2B47000
+59DAF44AF43946E0F473F128B16D1C022D01D30020F2BD
+3E467F1CFFB2072FECDB304688F4F9F3020009D004F580
+409FED771B9FED780B002110308AF453F70120F2BD0000
+70B5044646F6243186B00120085500F0A1FB00B304F50D
+5528468DF4F5F7E0F4F7F710F0480F11D12846B2F49FF3
+060009D06946DFF8700404F0F4F818B1694630469EF4B3
+F7284607F040FB204602F09FFF00F00DF82046FFF7A8FF
+4DF2B47004210059D0F44AF406B070BD799488322168D1
+F8CC1020460847000070B505460024A87968B105F11000
+C1F455F72DF4E5F530B9A868401C0B28A8601AD3012418
+E0A879AC60A8B105F5804610363046A4F4EEF570B13046
+A4F4F0F547F2E4714959401ADFF8501D884203DB002128
+4602F0ACFE204670BD0000000000408F402DE9F0438146
+09F5804510359DB02846A4F4CEF5002420B12846D8F4CB
+F6804600E0A04609F52A46A8363046DDF40CF601466846
+07F050FA69460AA82BF4B4F70AA82DF49BF508284846BF
+4109F5D645D6F4DEF1FF0F283540B12846B3F434F20078
+012814BF0120002007433046E0F4DFF01F28B641F643F6
+0F8FBB4DF2787050F8090000281EBF90F8481001F00101
+11EA080F24D0416B006BDFF8AC3501221FF46AF31CD247
+F2E07010F80900B8B9DFF8880CDFF8883CC16880680022
+1FF437F30DD82846BFF4BFF10078092807D02846B3F4F9
+F1007803281CBF002E012420461DB0BDE8F083FCA9F1D2
+4D62503F00000000000000002DE9F041044604F5D640AD
+F5047D2830B3F4DEF104F558450078012818BF002015F8
+D71F002900F0FA80E978002940F0F6804AF69021095D01
+4214D0DFF8046C306910B900F000F930612046D6F464F1
+18B1012068700020A87047F2E170005D10B90120E870E0
+E000F0EEF83169401A41F289318842F6D301A82BF47DF0
+06210BA82BF491F000F0DBF804210BA82BF48BF000F0D5
+F8D6E9020104F55747B0370122DFF8A83B1FF4C7F200F2
+808066A8A5F488F148A8A5F485F12AA8A5F482F1024666
+A8009048AB04F50D510CA887F4FDF20CA8A5F418F50521
+2AA8A5F4AAF2F19403808E8000B2F474F288B1052148A8
+A5F4A3F2B2F46DF250B1052166A8A5F49CF2B2F466F200
+F0010080F0010801E04FF0010803212AA8A5F48FF2B2F4
+59F288B1032148A8A5F488F2B2F452F250B1032166A8A5
+F481F2B2F44BF200F0010080F0010000E0012050EA0800
+05D002210BA82BF42CF000F076F84DF6DC00015B10202E
+F4C4F14DF6A4010853D7F403F1A8B138680068D0F800C0
+DCF848C0022302220121E04738680068D0F800C0DCF844
+C0052305220121E047012030700120E8702AA8A5F4B3F4
+48A8A5F4B0F466A8A5F4ADF47868DAF464F2A4F4ACF101
+4631A82AF4E2F704F55845E0350146284652F459F101A9
+0BA852F42BF10BA928462EF44FF131A90BA82EF433F504
+F5EE44E8340EE00BA902F047F9694628463FF46CF418B1
+69462046DFF481F70BA82EF42EF50BA82EF42DF50028EB
+D02046DFF47AF705E020B9E87810B1204600F013F80DF5
+047DBDE8F081000028A5890094CB91003CF600000BA901
+A852F42EB104F11000AAF46EB6F8B50646DFF8EC490020
+06F557452061B03506F5584702F0F1FCA4F451F1014606
+F55840E03052F403F1002007F8D80F3046D6F449F008B1
+0020787006F5EE40E830DFF43DF7B8884DF6A401885300
+20B870207888B1286800680668B66C012301220121B047
+2868006805686D6C052303220121A84700202070F1BD79
+E2810050C891009CCB9100F0B583B004460020CDE90000
+04F52A4601F022FE6A46DFF8501DC2F413F02046FFF7D4
+FD8F360746707800284DF2B07538D1307818B12046FFF7
+FAFD00B98FB301207070285900281CBF006800284DD002
+68D2F8B02001219047D7F41DF0002844D04DF6D700005D
+00283FD14DF640064FF47A71305B90FBF1F22859006807
+68BF6CD3B2D2B20121B847305BB0F5FA6F2CDD28590068
+05686D6C052305220121A84723E0707808B32046D1F47D
+F587F0010108421AD0002070702046FFF75CFF28590028
+1CBF006800280FD00268D2F8B02000219047D6F4DFF738
+B1285900680568AD6C012301220121A8472046FFF71BFE
+F7BD40C991002DE9F0468246BDB00E461446994601F05D
+F850B12AF4A0F731680FF2B002019100944B4615212EF4
+9FF630680027451CB9F1040FEDB208D10F2D43DBA5F126
+0009280DD2203D0127EDB25046D5F482F10AF50D50A5F4
+6AF35FEA000A0BD131E0042102A82AF4EAF531689DF808
+0051318842EAD226E09FB119A831468C2220F421F2681E
+19904B46224619A901A894F4C7F101464FF0FF30009003
+4600220BE0F19403109280004B462246314601A894F4BA
+F14FF0FF3100910B46002201465046A2F44BF701A8ABF4
+40F03DB0BDE8F08600005365744C746F45706820476E73
+7328257529204770735765656B20282575292053617449
+6428257529200A0010B52DED088B02F0C3FD86B000F04C
+F8B0EE41AAF0EE61AAB0EE42BAF0EE62BAB0EE438AF0EE
+638A04D153EC1A2B1FF489F022D000F03EF8F8B100F027
+F8684687F42AF551EC180B00F090FD38BF9FED528B04F5
+2A400322B0EE480AF0EE680A6946A830DDF440F2B0EE48
+3AF0EE683A00F00CF82046D3F485F206B0BDEC088B10BD
+0000BC88890000005940B0EE4B2AF0EE6B2AB0EE4A1AF0
+EE6A1AB0EE490AF0EE690A7047000053EC192B00200021
+1FF448B004F580401030A4F499B200002DE9F0470446BC
+B00F4691461846AAF441F507281CBF3968FF2982463FD0
+00264D1C0428EDB208D10F2D38DBA5F12600092810D220
+3D0126EDB204F50D58AEB101A839468C2220F461F1681E
+019024AB4A4601A90DE0042168462AF413F539689DF800
+0051318842E7D218E024AB4A463946504690F49EF70500
+0CD05146404686F4FCF338B15146404686F4F7F3294602
+681269904747F2E271012008553CB0BDE8F08710B500F5
+804410342046A4F445F2B0F57A7F0CD22046DFF469F501
+2803D10521204606F04DFADFF8881D0020487010BD80F4
+0300000000000000794038B5044600F01EF8A4F428F2B0
+F57A7F17D204F50D55284686F4C2F72846AAF443F728B1
+2846AAF43FF70168896888474DF630010020085547F2E4
+71085100F005F831BD04F580401030704704F5EE400021
+00F8E11F4170704700002DE9FE4F2DED068B834686B0DF
+F80C0D02F0FAFE0BF5804042F6E062002110308AF410F2
+039000249FED618B9FED629B0C9841F290410858682101
+FB040505F1500A9AF800008DF8080002A85BF410F00028
+00F09B800D9A02EB841200200021C2E900018146039818
+B1DFF8540DDFF8541DCDE9040104AA2946DFF8A00C02F0
+0FFFB0EE40AAF0EE60AA53EC1A2BFFF70FFF05D05146DF
+F8840C03F01BF881460D9853EC1A2B00EB841800F03BFE
+08F1080625F409F7C6E9000105F130074A463869306229
+1D584600F084F8F0852A1D5146584600F0E4F8B0850246
+2946584600F036F9C6E9020101220023CDE90023386821
+F4A9F100F03BFA25F4E5F6DDE900232DF4C3F64FF0FF32
+00232DF47EF6C6E9040197ED050AB1EE400A00F024FA00
+F004FE21F448F1B061B86921F48CF100F0FCFD21F440F1
+F061DFEDF19403A0958000210A97ED070A2DF4BDF6DFED
+200A2DF473F60020B06286ED090A08F1380308F13A0251
+46584600F04BF89AF8040003280CBF0120002088F83B00
+641C50462AF46BF701F07BFB322CC8F83C00FFF452AF0E
+9804700C9800681FF4AAF000F018F825F494F6189AC2E9
+000106B0BDEC068BBDE8F78F0000004A78DEB141000000
+0080842E410000000038C9910000007C4253EC192B1EF4
+10B738B50846144681680025CA040AD50125490648BF05
+2508212DF492F300B90CB945F00205284632BD2DE9F041
+80460D4682B016461C46284661F47AF2074628788DF800
+00394668462AF4C2F3411C062F218035D8DFE807F00434
+0620242F310001202BE0032131705D30208008F50D50B1
+F444F640B39DF80010342905DB422903DA9DF900103B39
+01E06FF0070149B206F00EFFC0B10CE004213170C13008
+E05130C0B2801F0521092831700CD220882030208008E0
+062000E00720307003E040F2444100F054F9BDE8F38170
+B516460024307A80070D460BD5284658F4C6F530B12846
+2DF488F510B94FF4806400E00124B068410748BF44F020
+04000708D5284666F4ABF1002814BF44F4807444F00204
+307AC0061BD5284660F483F310B144F0400414E0284666
+F498F110B144F400740DE0284658F499F538B1307A8006
+54BF44F4006444F4805401E044F00404307A800608D528
+4660F464F3002814BF44F0800444F00804B068C10603D4
+800658BF44F01004204670BD00002DE9F8430E46174600
+F50D5082F44AF4012206F150018EF47DF200F0FDF84FF0
+9442DFF89C3D1FF487F0D6E906231EF40BF700F0F5F825
+F49FF504460D4606F150002DF41BF5814606F1500061F4
+B2F1062807F0020800F2B580DFE800F004B31504397704
+00380772D4780706D52046294600F0B5F800F0ADF877E0
+B8F1000F59D02046294644E038060ED520462946DFF84C
+2D44F694631FF4CCF7DFF8402DA2FB006744F6946360E0
+780665D4B8F1000F02D0204629462BE0B8063BD5204629
+46DFF8202D00F091F8DFF8182D72E038073DD4780709D5
+B9F1020F2046294658D000F07DF800F075F83FE0B80508
+D520462946DFF8F02C00F078F8DFF8E82C59E0B8F1000F
+0BD0B9F1020F2046294615D0DFF8D82C00F069F8DFF8D0
+2C4AE0F80508D520462946DFF8C42C00F05EF8DFF8BC2C
+3FE0F80748D520462946DFF8B42C00F053F8DFF8AC2C34
+E0380712D520462946DFF8A02CDFF8A03C1FF46AF7DFF8
+942CDFF8943CA2FB006702FB017703FB007723E0F80408
+D52046F19403309980002946DFF8802C00F033F8DFF878
+2C14E0380508D520462946DFF86C2C00F028F8DFF8642C
+09E0780512D520462946DFF8802C00F01DF8DFF8782CA2
+FB006702FB0177A41BBD4103E04FF4A16100F014F82046
+2946BDE8F483DFF8582CA2FB006701237047DFF84C2C01
+231FF425B7000000231FF421B700000FF20400F6F778BE
+70617463685F67756C705F6D6963726F5F6E61762E6370
+700000000010EE100A20F46CB70022DFF8103C1EF43DB5
+0000C127090008A589000000364000003B402DE9F84F2D
+ED028BADF6086D044604F580400D46103004F55746A3F4
+25F7783638B9306800F0CAF93068816C21F0200181640A
+A895ED0A2B95ED081B95ED060B87F466F104F52A4000F1
+A8094846DFF453F2014640F6A850684460221FF4F2F504
+F5D64000F128084846DFF459F1032834D104F558474837
+3846DFF441F268B300F0ACF90078042813D000F0A7F900
+7805280ED000F0A2F90078062809D000F09DF900780728
+04D000F098F90078082802D13846DFF428F2D5E90C0100
+F092F90CD205F130000090019505F1280305F1200205F1
+18013846DEF42EF10020059004F50D573846AFF4C1F105
+F5F87100918246D5E90A0120F499F60099009101EE100A
+D5E90801B0EE418A20F48FF60099009100EE900AD5E906
+01B0EE481AB0EE608AF0EE418A20F481F600EE100A0DF1
+140B009904F5584053465A46B0EE681AF0EE480AA830DE
+F415F200F047F9014604F5594009780830012903D12946
+D5F4BDF301E0D5F4AEF329462046D2F476F32268D2F8E0
+202946204690474DF6A20095ED0C8B005B1EF4EBF50246
+0B4651EC180B1EF44DF40FD30022DFF8303A1EF447F40D
+D24846E0F4B5F2042808DA4846DFF4B6F0022803D1A86C
+40F0030002E0A86C80088000A86400F004F94FF0000838
+B100F0FFF800F0F7F806A8B1F450F48046022100F0F7F8
+48B1022100F0F3F800F0EAF806A8B1F443F458FA80F8B8
+F1090F0BD33846AAF423F5A1F4EBF628B1384682F427F2
+A3F427F600E000208DF8080004F11000C9F4E1F32CF403
+F6ADF80A0004F110008FF497F004F52A408F308DED030A
+41788DF81010A96C21F44061A9640278002A1FBF41F480
+61A9644078002803D0022060F38B21A9642968DFF86079
+4DF804CD0DF540605DF804CBD0ED820A4DF804CD90ED81
+0A5DF804CB204602F036F84DF804CD0DF5406080ED810A
+48465DF804CBD7F4D9F6014640F6E8406844C0F4A7F3C0
+F41BF340F6E84087ED000A6844C0F418F340F6E84087ED
+010AF19403C09C80006844C2F41BF2FFF781FEDFF8F828
+DFF81C391EF4C1F320F4A1F5B860DFF412F140F6A85169
+44009104F5EE43B03302AA2946DFF473F32268D2F8D020
+29462046904700208DF80500DFF4FCF00DF105010091A3
+1D00222946FCF706FC9DF80500F0B17068026812682946
+90471AA84FF448611FF44DF410A828211FF449F400208D
+F8040010A8009001ABF9681AAA2046FFF788FB9DF80410
+10AA1AA8FCF74AF904F5EE401830DAF4E1F44DF6420101
+20085529462268D2F8D820204690479DED0A0B85ED060B
+29469DED0C0B85ED080B20469DED0E0B85ED0A0B2268D2
+F8E42090470DF6086D01F095B900000268011D2046D0F4
+B1B00000014606A80A68D2F88C2010470021384685F4EC
+B64046BEF48FB100000022DFF818381EF421B3000010A5
+89002DE9F845044604F52A402DED048B00F1890AADF582
+6D9AF8020000281FBF04F557467836706B00280D4600F0
+AE814FF4D67299A968465DF409F3022200215DF4EDF401
+22012100F0BCF90822032100F0B8F9A86CC0F3400100F0
+BCF9A86CC0F3800100F0B7F995F8480000F0010100F0B1
+F9A86CC0F3C00100F0ACF9A86CC0F3401100F0A7F9A86C
+C0F3001100F0A2F904F5EE4000F1C408012298F8100000
+F0010100F08EF99AF80000800705D53068806C0122C0F3
+801101E00122002100F080F9A86CC0F3C01100F084F9A8
+6CC0F3402100F07FF9A86CC0F3002100F07AF9D5E90C01
+1EF40CF481B20A2200F069F92968202200F065F905F5F8
+779FEDD28B386820F4E1F400F051F91EF4F9F300F051F9
+786820F4D8F400F048F91EF4F0F300F048F9B868DFF8B4
+7620F4CDF400F03DF91EF4E5F300F03DF995F84800C007
+25D5D5E906239FEDC29B00F02BF91EF4D7F300F039F9D5
+E9082300F023F91EF4CFF300F031F9A86CC0F3400078B1
+D5E90A011EF4C5F300F01DF997ED000ABDEEC00A10EE10
+1A102289B200F01AF9A86CC0F3001090B1D5E90E2300F0
+FBFA1EF4AFF300F007F9786820F48EF400F0FEF81EF4A6
+F381B2102200F003F9A86CC0F3C00090B1D5E9102300F0
+E4FA1EF498F300F0F0F8B86820F477F400F0E7F81EF48F
+F381B2102200F0ECF8D8F8000020F46BF400F0DBF81EF4
+83F300F0DBF8D8F8080020F461F400F0D1F81EF479F300
+F0D1F8D8F80C0020F457F40022DFF8943C1EF428F21EF4
+6CF300F0C4F8D8F8040020F44AF400F0BAF81EF462F300
+F0C4F8A86CC0F3401000283FD02A6804F5804101231031
+10A88AF4AFF010A90CA887F445F40CA909A895F4F5F20A
+9FF1940350A08000DFF84C0C97FBF0F80998C0EBC00008
+EB000409A8A4F47EF653EC102BDFF82C1CDFF82C0C00FB
+187800201EF4EDF100F083FA00F07DFA4FF47A7707FB08
+07DFF8140C874203D3DFF8280CC719641C1022A1B200F0
+80F82022394600F07CF8306850F8481FC1F3801100293F
+D09AF8001089073BD50079332803DB40F2F951FFF76BFC
+306890F84C1000F064F8306890F84D1000F05FF8002423
+E005EBC40000F14E070822397800F056F8797800F052F8
+B7F902001EF41AF300F042F81EF4EAF200F042F8B7F904
+001EF410F300F038F81EF4E0F200F038F8B97900F03BF8
+641CE4B2306890F84C008442D6DB68465DF4ADF1684660
+F462F0C408002506E0082168465DF413F32EA968546D1C
+ADB2A542F5D3706B03689B6A2EAAA1B298470DF5826DBD
+EC048BBDE8F1850000BC88890028A5890053EC1A2B51EC
+190B1EF464B153EC182B1EF460B101B2102268465DF403
+B20000082268465DF42AB30146202268465DF4F9B10000
+012268465DF420B32DE9F041ADF5F66D044656A9DFF878
+0D0FF2D00806F0D0FF054600261CE056A8382101FB0607
+04F58040396B01AA10308BF468F7D6F480F200F05EF839
+46FDF7CBFD00F01BF830B129F45EF706AB424615212DF4
+61F6761CAE42E0DB0DF5F66DBDE8F0818DEDB5A0F7C6B0
+3E0000000000005040000000000000604115202DF437B6
+000080B500210020D6F435F1016889688847006800281C
+BFBDE80240FFF7AFBF01BD00B5E5B001AA56A9DFF8D80C
+07F0B2FA9DF88C0188B1D6F43DF200F01BF856A9FDF788
+FDFFF7D8FF38B129F41BF706AB0FF20C0215212DF41DF6
+65B000BD00004F4E434849505F4E4D45415B305D5B2573
+0000004FF4A071009106AB01AA70472DE9F24F04462DED
+048B4DF2B070F2B0005900281CBF0068002892464FF000
+0800F03F8104F5804000F1100B0122594654A889F449F7
+DFF8482C002154A887F47DF49DF8D81181F0010101EA00
+090122594636A889F438F736A903A887F4C2F25846A3F4
+97F20025002780B103A894F44DF4054603A894F44BF453
+EC102B0020DFF854191EF486F000F018F9074604F50D56
+3046D9F466F006AA08A9A2F4F8F422A8A0F431F53046AA
+F468F122A9A1F4A3F33046AAF462F102A9A1F4CDF35846
+A3F468F2002805D03046AAF457F1A1F41FF300287AD002
+98B0F5616F76D20AA8D8F4F2F79DED220B8DED0A0B0CAE
+9DED240B8DED0C0BDDE908239DED260B86ED020B9FED80
+8B9DED280B86ED040B00F0D1F81EF485F13083DDE90623
+F19403E0A3800000F0CAF81EF47EF17083B58347F28850
+3762005930B3DFF44FF407469FED748B386820F453F2FF
+F7C3FE1EF46BF130859FED719BB86820F449F2FFF709F9
+1EF461F1B085786820F441F2FFF7B1FE1EF459F17085F8
+6820F439F2FFF7F9F81EF451F1F08501208DF884002CA8
+A4F4F2F50146584689F490F21DA92CA8A4F47CF618A958
+468CF488F0BAF1000F05D004F5D6400AA92030DAF481F0
+04F55740B0300AA94068DFF40CF42CA8B0F45BF70EE09D
+F8D80158B10AA8D8F478F7014604F55740B0308DF88480
+4068DFF4F9F32168D1F8A81020468847002854D0684600
+21002206C05846DFF4F1F320B15846DFF4F1F300040190
+B9F1000F42D003A894F479F300F0EFFB53EC182BDFF8AC
+0DDFF8AC1D1DF4B1F700F047F800F041F8009040B951EC
+180B0122DFF8943D1DF464F798BF6D1C002154A887F414
+F051EC100B0022DFF8803D1DF47BF734BF4FF480400020
+AA04019950EA924040F40040084301904DF2B070005904
+685846A3F48AF10146204624689DF8D831D4F8A0406A46
+A0474FF0010872B04046BDEC048BBDE8F28F000078DEB1
+4151EC180B1DF46CB741EC100B2DF4FAB00022DFF8C43D
+1EF435B0000000004F91809698000046C323002D310180
+841E0040420F00000029F90F2602000094357700E1F505
+0000594040C9910000C2631A0000000065CDCD41000000
+0000007040000000000000904000093D0000BCA06565CD
+CD41DCA54C40000079402DE9FA472DED068B0446AEB004
+F52A40ADF5805DA830D7F41FF2014640F6F8706844BFF4
+EDF6C0F40BF2B0EE408A16A829F478F440F658602F2308
+22DFF8201D684425F445F504F558454FF00008E035CDF8
+0880284650F4F3F538B100F070FBA2F42CF60146284650
+F4E0F5DFF8F41C3220486047F2E176305D50B100F060FB
+07F0EAF828B1DFF8DC1CC1F80480012000E000209FEDE1
+0ADFF8C81CB4EE408AF1EE10FA087040F170820DF58051
+2046D1F8D010D2F44EF340F6F8706844BEF40BF0014620
+4601F0A9FB0DF58050D0F8D070FEF703FADFF459F5A7EB
+0009DFF8880C814514D200F007FDC5F4C7F578B140F6F8
+706844C0F4A7F151EC100BDFF86C2CDFF86C3C1DF46DF6
+98BF012700D9002703A8DFF43EF50598002F12BF40F001
+0040084000059003A9059840F01800059006A8DFF438F5
+00F0E6FA2CF478F0034606A8009040F6F871DBB22A4669
+440DF56460DFF42EF5014604F5EE40E83007F098F9305D
+28B900F0EAFA07F074F8064600E0002604F5EE40E830F1
+940370A78000DFF426F501463EA8DAF452F00DF5636000
+25019054E0DDF8300E482101FB05074AF6902007F1280A
+005D18B19AF80400042844D0002207F1200168462CF43C
+F507F120004AF466F278B1002E37D19DF800008DF81800
+DFF8900B007828B100F0B1FA06A907F012F848B340F658
+60684400EBC800011D6A4606A859F455F640F658606844
+DAF8001040F8381016A807F120012AF41FF79AED000ADF
+ED820AB4EE600AF1EE10FA08F1010808DB9AF804000128
+18BF032802D10298401C02906D1C0198B0F908008542A5
+DB40F65860DFF8283B082241466844A0F496F10198B0F9
+08000B2801DB00F067FA002625E040F65860684400EBC6
+0504F51940291D0830DAF468F6C0B12979017000F10801
+08308A6842F002028A608A6842F004028A6042F008028A
+6042F010028A6042F040028A6042F080018160761C4645
+D7D30DF5805004F51941D0F8D000E8310DF58052C86104
+F58041D2F8D0200123103120A889F464F40CA894F407F1
+014620A886F48FF600F0EFF912A893F460F7014620A886
+F4B6F6B0EE409AF0EE609A0CA894F469F100F0F7F99FED
+DDAB80ED000B53EC182B51EC1A0B1DF49FF51FF47FF700
+F0B1F9886012A894F433F000F0E3F953EC192B80ED040B
+51EC1A0B1DF48DF51FF46DF700F09FF90AAB886104F580
+4108AA10310FA889F480F70DF58050D0F8D0001DF4F6F6
+DDE908231DF400F7002200231DF456F541EC180B23D253
+EC182BDFF8EC09DFF8EC191DF467F541EC180B1FF445F7
+09EE100A00F0C1F953EC182B1DF43FF503D200F0A6F980
+ED029A00F0B0F953EC182B1DF434F503D200F09BF980ED
+069ADFF8B009814511D300F0A7F900F05DF900F083F900
+F055F9886000F098F900F054F900F07AF900F04CF98861
+0DF580504EF66021D0F8D0009FEDAB8B884238BF9FEDAB
+8B002000909FEDAB9B87E00150C3470100A040DDF8300E
+0099482202FB010604F5194006F120010830DAF441F65F
+EA000970D0D6E9000109F118051FF4ECF6E860B0EE481A
+F0EE681A96ED020B2CF429F400F041F928610127D6E904
+0181F00041C5E9000106F1200029F4EFF1824604F50D50
+8CF4AAF07AB251468CF432F5C0B17AB206F1200106A82C
+F4CBF30DF580520146D2F8D02004F5CC40F83008F003F8
+51EC100B81F000411FF4B5F609EB8701C8627F1C032FD5
+DBD6E906011FF4ABF6A86096F82C00042809D1DFF8500D
+DFF880182861DFF84C0DA86001204870B06A1FF4E1F653
+EC192B1DF485F51DF4F7F56884706A1FF4D7F653ECF194
+0300AB8000192B1DF47BF5FFF73BFD288496F82C0089F8
+3C000020C9F804000098401C009001990098B1F9081088
+42FFF675AF00F00DFF1CBF0168002925D0617919BBB8F1
+000F11D100F0E0F8DFF43EF3D8B904F5194000210830DA
+F419F500F093F80020C8614DF2B0700059066800F0CDF8
+DAF47BF53268526F01463046904703E001F07DFA00F0D1
+F800F0E9F910B92046D2F4FDF000F0B1FA01460DF57D60
+05F0F0FA16A83CF4C9F306460DF57D603CF4C4F3864201
+D201F062FA00F094F804AA06A9A2F4C8F006468EF459F3
+78B300F0CCFD0DF580514FF47A72D1F8D010B1FBF2F108
+18B0F5617F08D800F07CF800219DED041B9DED060BA2F4
+3DF000F073F8A2F47DF0014600F0A2FE1CBF006800280D
+D042F21072914209DA03689DED041BD3F89C309DED060B
+00223146984700F05EF868B100F04DF8C4F451F440B10D
+F5805116AAD1F8D0102046D3F444F20CE0029800900DF5
+805140F65863D1F8D0106B444246204600F0E2FD2046D4
+F447F22EB00DF5805DBDEC068BBDE8F3878DEDB5A0F7C6
+B03E04F51941E831704741EC110B9FEDAE0B2CF44EB300
+00904000408F4080510100005C260548AFBC9AF2D77A3E
+95D626E80B2E113E000000000000E03F00A4D9FAB0EE40
+8AF0EE608A7047000004F5D6402830C0F445B1000051EC
+100B1FF49CB504F50D50D8F49EB304F50D50AEF4B4B004
+F51940E830704704F52A40A830DEF4EDB7000004F51940
+0830704704F51940E83080691FF4C8B504F51940E83080
+681FF4C2B504F5194001210830DAF42CB404F55740B030
+4068D8F46EB32DE9F84F2DED028B0446B8B08846914600
+F000F9014607A805F012FA07A83CF4EBF200260A2847F2
+E077B2EE0E8A80F2828007A911A82CF439F6DFF8DC5522
+E09DF81000022808BF0E220AD00020ADF8080002AA03A9
+00F048FA00B15646BDF80820694601A8D6F471F6014640
+463DF4B7F3694648462AF445F404A879F4F2F211A82CF4
+21F611A82CF420F6002840F0B28011A900F025FA00F0B8
+FC01466A4604A8A2F40DF311A901A82CF405F6002201A9
+03A82CF418F2684649F443F72978084210D068680B28D7
+D211A901A82CF4F3F5012201A906A82CF406F2024603A9
+05A859F439F30023002203A904F110008DF498F50E21AD
+F80A10017B890704D490ED130A00F04CF9B7D469464846
+3DF40DF50028B1D1385D761C002806F1010A8ED00DF10A
+0203A900F0DFF900B15646BDF80A2095E7B2464DF6A405
+01E00AF1010A3A98824556D2449800EBCA00011DF19403
+90AE800068463FF421F50E21ADF80A100146FFF733FFDA
+F407F48346694607A83DF4E2F40028E4D19BF83C000428
+E0D0449800EBCA0000F00BF9DAD400F048F81F28D6D269
+4648463DF4CAF40028D0D1694648462AF4B0F3761C385D
+06F1010B60B10DF10A0200F099F900B15E46285BB04228
+BFBDF80A200CD216E0ADF8080002AA00F08BF900B15E46
+285BB0420CD3BDF80820694601A8D6F4B2F5014640463D
+F4F8F2285B8642A3D338B03046BDEC028BBDE8F28F0000
+60B31E0028AF8900FA7E6ABC7493883F04F110008EF40A
+B104F52A40A830DDF4B9B700002DE9F24F2DED028BA8B0
+0446349F2A99009790469946FFF7DFFE4DF6A405834628
+5B834555D200F0B3F80146684629F4EBF5022114A828F4
+C7F701460AA850F411F10AAA69461EA83CF4B0F100F0A0
+F801460222684629F405F6042101F053F80246694614A8
+3CF4A1F1DFF88463B07898B94DF6D700005D88B914A83C
+F4A8F100281FBF04F5EE40E0304078002806D01EA83CF4
+9DF10D2801DB012000E00020B07000F06FF8C5F42FF138
+B9FDF75CFDDDF45AF741F28931884202D3B2EE048A01E0
+9FEDC88A4FF0000A01E00AF1010ACA4549D20E20ADF804
+0007EBCA00011D68463FF445F4014640463DF40BF40028
+ECD1B07840B1684649F418F620B107EBCA0000F037F8E1
+D4307830B1684649F405F610B170680B28D8D269464046
+2AF4DDF247F2E0700BF1010B005D18B968465EF4E0F610
+B10020ADF8040001AA00F0BFF808B10BF1010B285B5845
+0CD3BDF80420694602A8D6F4E5F401462A983DF42BF228
+5B8345B1D30DF1A00DBDEC028BBDE8F18F90ED000AB4EE
+480AF1EE10FA7047000004F5D6402830BFF4BBB6000004
+F11000BFF400B52DE9F0410446CAB00D4604F50D581646
+41462CA885F418F204F55841E03106A82CF464F48C4F0E
+E0D8F478F104A906F065FB10B178680B283BD303A879F4
+32F106A82CF461F406A82CF460F4002860D106A904A82C
+F450F40E20ADF8080006A900F05FF80022694601A82CF4
+5DF04046A2F47CF3014601AA03A8A2F441F103A8A2F478
+F328B103A92CA800F099FF0028D3D104A849F476F558B1
+4DF2B470397800590029C0D1D8F439F106F04FFB0028C3
+D147F2E070005D30B102AA01A900F034F8BDF8082010E0
+9DF80C00022808BFBDF8082009D00020ADF80A000DF10A
+0201A900F022F8BDF80A2001A96846D6F44DF401462846
+3DF493F101A930462AF421F22846D6F446F4002896D003
+A879F4C9F02CA8A3F448F34AB0BDE8F0810000F1940320
+B2800019A968462CF4E8B36946204600E00000F8B50F46
+044638788DF8000015464DF2B47000260059D8F4E9F069
+4606F0D6FAF8B12046D3F430F720B1288840F480602880
+012638465FF47FF4042809D13A4841680A2905D22A8842
+F400722A80491C41604DF6D900005D18B9288840F00100
+28803046F2BD00000BEF349377BDBB40FE7422410000F0
+3FF0B505464AF68F20DDB0405D002400280E4644D14DF2
+B4704059D8F4ABF00621DDF4D4F500283AD02148407805
+F5EE47E037002804BFB878002808D10621684628F42EF6
+694630464FF4A8F701243EA8A2F434F720A8A2F431F703
+46002000903EAA05F50D5102A885F4ACF002A8A3F4C7F2
+062120A8A3F459F0B0F423F040B106213EA8A3F452F0B0
+F41CF008B10120387020A8A3F4B4F23EA8A3F4B1F22046
+5DB0F0BD000034420000E03F39B70F00BC888900C0D401
+009B99999999992B4065B10F00FCA9F1D24D6250BFC127
+09002DE9F04F044604F52A40ADF5257DA830DEF426F78D
+F8060000262046D3F42CF38DF805000027B9468DF80490
+FFF7D6FD01469AA804F0E8FE04F52A408F30B846407800
+284DF6A40014BF05250825005B18280EDB04F55840E030
+3BF4B1F7212807DB04F52A408F304078002814BF08250C
+257CA8A2F4BAF65EA8A2F4B7F640A8A2F4B4F600F0AEF9
+02BF4DF63000005D002832D07CA800905EAB40AA04F50D
+511AA885F427F01AA8A3F442F200F086FBE8B100F09DF9
+B0F5E16F13D8B0F5167F15D902217CA8A2F4C9F7B0F415
+F08246022140A8A2F4C2F7B0F40EF050FA8AF0102804D2
+4DF63001012601F8049000F075F9407808B1782001E04F
+F4167002909AA919A82CF4B6F213E04FF0010A5BEA0A00
+01BF7F1C08F101089DF80000022808BF09F10109684678
+F480F719A82CF4AFF219A82CF4AEF2002843D1FFF7B4FE
+00F042F900F046F900F032F96846A2F4D5F14FF0000A00
+28D346D6D000F02EF902998842D3D2694604F50D5004F0
+96FF00284FF0010BCAD169467CA800F0E4FDB8B969465E
+A800F0DFFD90B900F016FB78B99DF800000628B9D06946
+40A800F0D3FD00281FBF04F5EE40E03040780028ADD04D
+F63001684601F804A078F436F7012683E0002EFCD104F5
+5841E03119A82CF450F224E019A904A82CF451F204A99A
+A83DF487F1C0B9FFF75EFE00F0ECF800F0F0F800F0DCF8
+6846A2F47FF148B16846A2F47BF120B100F0D8F8029988
+4200D37F1C684678F409F719A82CF438F219A82CF437F2
+08B9AF42D4D3A8453EBFAF4201208DF80400F19403B0B5
+800000F0D4F802BF4DF63000005D002841D07CA8A2F4FF
+F507465EA8A2F4FBF550FA87F740A8A2F4F6F557FA80F7
+072F02D3FFF784FBE0B9182F0BD200210FA828F4ABF404
+F558400FA9E03062F4F3F0002846D100F097FA58B10027
+27E0022F23D100F0A0F8807808B37F1CFFB2072FF5DB00
+F098F8407868B1D4F472F550B1FDF775FE38B17CA8A2F4
+C5F518B904F5EE41E0314870FDF702FF88F460F130BB5F
+EA090024D0012022E0062FDDD0394605A828F472F404F5
+584005A9E030DEF4B2F50028D1D100F06EF83946807800
+2814BF5EA87CA8A2F4A6F6AFF470F60028C3D04DF63001
+002008550126C1E700209DF8042040EA06011143C9B291
+B1C0B200281FBF04F5EE40E0304078002823D12046D2F4
+F4F6F8B99DF80410204600F092F919E0FDF7BBFED6F4C1
+F1A0B14AF68F209DF80610005D81F0010108409DF80510
+084208D0FDF7AAFE88F4C6F000F0010080F0010000E001
+2047F2E071085540A8A3F4CAF05EA8A3F4C7F07CA8A3F4
+C4F00DF5257DBDE8F08F014603AA6846A1F467B6000001
+22694604F50D5084F4DEB70022694603A82BF46FB50000
+04F50D50A2F48CB004F5EE40E030704704F5EE40E03040
+780028704704F58040103088F4D3B100002DE9F8430546
+4AF6A62005F52A47405BA8370B280E46384604DBDDF4BF
+F2022806DB03E0DDF4BAF2032801D1012400E0002447F2
+E1794DF6300819F80500002804BF18F80500002806D138
+46DDF48AF31F28A441E443E40F0C2E07D24DF6A400405B
+8642BF41FF43FF0F00E0012719F80500002804BF18F805
+00002809D005F50D50ADF431F308B1052E01D2380000D0
+012005F52A41774B11F88F2F5B781A433A40104306BF48
+7800282046BDE8F28395BFD633FAED6B3A2DE9F043ADF5
+3D7D04460F4690461E4624AA982101A83BF4E3F505A828
+F466F319A828F463F301A8DEF4C4F40297204604F5EE45
+FFF78AFDE0354DF6A4096878002802BF4DF63000005D00
+280BD1DFF8A807006887423EBFC49839F8041088423CBF
+0120287041462046FFF76DFF20B30096434605AA01A920
+46FFF75FFB01A8DEF49CF4404506D301A8DEF497F439F8
+0410884201DB012700E0002719A92046FFF7ECFC87F001
+0108420BD019AB05AA01A92046D1F458F604E005AA01A9
+2046FFF708FC2EB304F52A4750373A4605A90FA8DEF477
+F40FA83BF418F5002804BF287800284DF6D90601D1305D
+88B905A938464FF47FF400F013F81CBF0068002807D020
+7928B901A9204600F00FF80120305501A8F1940340B980
+0054F4DCF10DF53D7DBDE8F0834DF2B070005900287047
+0000F8B5064606F557450C4655F8B00F00281CBF006800
+283AD006F52A40A830DDF4CBF1070018BF012700F034F8
+0521DDF475F2384204D1052120463CF40BF603E0214630
+46D2F4CEF200F024F8012200218BF49EF510B920463CF4
+D8F50C48007840B900F017F805F045FF18B1042120463C
+F4F0F501220E2120463CF439F5286800680268126F2146
+BDE8F8401047F1BDBC8889006868D7F415B500002DE9F8
+43044604F580402DED068B00F11008C0B04046A1F42BF7
+47F2E47604F52A473159451AA8373846DDF477F10328AC
+BF47F2305041F28830A84202DB3059002877D14DF2B475
+47F2E3792859CDF473F50528B4BF0120002009F8040000
+F06FF838B13846DDF459F118B1002009F804005FE019F8
+040000285BD02859CDF45BF5411C2859C9B2CDF452F5D4
+F446F300284FD1684693F42DF00122414604A888F47AF3
+694604A885F4B0F5FFF710F90122414622A888F46FF342
+F6E062002122A804F5D64586F4A1F020359FEDC49B98B1
+4046A1F4CCF68146684693F480F000F032F80746FEF753
+FB1CF417F602464B46B9B22846D8F4EBF4684693F470F0
+00F022F8074600F0EFF8DFF828351CF4F3F61CF403F681
+46FEF73AFB1CF4FEF502464B46B9B22846D8F4F4F44046
+A1F49FF6305140B0BDEC068BBDE8F18300004DF6300000
+5D7047B0EE40AAF0EE60AA684693F443B0000008461146
+1A46FAF74FBA00002DE9F84304462DED028B04F55745BA
+B055F8AC0F00283DD000F0B8F8002839D022A8D7F407F4
+2A68014610461268926B904724AFB88B1CF4DFF50022DF
+F894341CF45EF48046386A89461CF4D5F5DFF88824DFF8
+88341CF453F442464B461CF421F541EC180B0122314604
+A888F4E2F204A9684685F46CF6684693F43BF051EC100B
+53EC182B1CF4C5F541EC180B9DF8E400002870D000F075
+F800231CF4F0F36AD8DFF83C341CF40FF465D2A868D7F4
+09F4DDF4E5F700F00106A868D7F402F4DDF4DEF7000900
+F00105B86B6FF00041884215D000F056F8DFF808341CF4
+F4F304D22268D26E35A92046904751EC180B00F0CEF804
+D22268126C30A92046904796B900F03FF8DFF8E0331CF4
+DDF30BD2216897ED043B896F97ED022B9DED241B9DED22
+0B2046884735BBB7F91A0018B31CF458F505460E4653EC
+182B0020DFF8AC131CF4DDF32A4633461CF4ABF40122DF
+F89C331CF494F341EC180B98BF9FED4E8B51EC180B1CF4
+11F52368B7F91810DB6F02B220469847F19403D0BC8000
+3AB0BDEC028BBDE8F183000051EC180B0022704704F580
+4610363046A1F4B4B52DE9F8432DED048BF0EE408A82B0
+8046B0EE608A0C46B0EE080A2BF469F308F5D6462836B0
+EE409A3046B0F429F20078012805D03046B0F423F20078
+072801D1002700E00127DFF81463706808B9002508E020
+1ADFF8081388428041C043C00F80F0010501208DF80400
+022201A968462BF462F208F50D59484680F475F1002269
+468BF4A9F730782843384370EE289A1DD1B5EE408AF1EE
+10FA18DDB4EE498AF1EE10FA13D508F52A4000F1A80528
+46DDF49AF03D280AD3484680F455F1B0EE680A07F099FB
+7460284607F0A9FB02B0B0EE690ABDEC048BBDE8F183DF
+F87C12087070470000000000408F4002460B4651EC1A0B
+1CF4C2B40022904B1CF418B30000000000D072400446B0
+EE409AF0EE609A704700F58040103003F025BD00002DE9
+F0412DED028B8E4EADF53E7D0446884630787178084300
+F0F58004F55845E035294614A828F475F098ED008B864B
+FFF74CFF1CF4ECF24DF2B47714D3834A834B1CF4C1F20F
+D998ED028B814B51EC180B4FF066321CF4DBF205D34FF0
+CC327D4B1CF4B1F234D83078B8B100F0FAF80421DCF4F7
+F788B100F0F4F8A1F410F280460421684628F44BF00146
+42460AA83BF438F20AA914A84FF4B4F1707800283DD000
+F0DFF80621DCF4DCF7002836D000F0D8F8A1F4F4F10746
+00F0CFF801463A4668463BF41EF2694614A84FF49AF125
+E0307888B100F0C5F80421DCF4C2F758B10421684628F4
+1BF001460AA84FF465F10AA914A82BF489F1707878B100
+F0B1F80621DCF4AEF748B100F0A7F8014668464FF453F1
+694614A82BF477F1294614A861F4D1F400286DD1307888
+B30421B4A827F4F5F7024614A9AAA83BF4E2F1AAA84FF4
+6FF158B9042196A827F4E8F702462946A0A83BF4D5F1A0
+A84FF462F1042182A827F4DCF7024614A98CA83BF4C9F1
+8CA84FF456F158B104216EA827F4CFF70246294678A83B
+F4BCF178A84FF449F1707888B3062164A827F4C1F70246
+14A95AA83BF4AEF15AA84FF43BF158B9062146A827F4B4
+F70246294650A83BF4A1F150A84FF42EF1062132A827F4
+A8F7024614A93CA83BF495F13CA84FF422F158B106211E
+A827F49BF70246294628A83BF488F128A84FF415F114A9
+28464FF407F100F033F80DF53E7DBDEC028BBDE8F08100
+00B888890000408F4000752241FCA9F1D24D62503F4012
+77410075524100A40F410000E03F00D0724030C99100E1
+9304009CCB9100008038409B999999F1940360C0800099
+59484066265FC0CC6C51C006210AA827F45EB73859D7F4
+D1B1000004F5EE40E830DCF415B7000008210170002141
+7081808170C180704738B500F02BF840B92846A1F4E7F3
+20B91D210FF25800F4F7F7FA00F019F8BDE83440A8F4BF
+B0000038B500F017F840B92846A1F4D3F320B927210FF2
+3000F4F7E3FA00F005F8BDE83440AFF407B20000206F2A
+78697800EB021070470446024800780D4670470000A2CB
+910070617463685F676C676E73732E6370700000000008
+2101700021417081708180C180704738B504460D466068
+B5F9061040186060B5F90810A0684018A060B5F9041020
+6840182060B5F90A10E0684018E060B5F90E1020694018
+20612868A061B5F90C10206A40182062B5F91410606A40
+186062B5F91610A06A4018A062298BE06A10FA81F0E062
+698B206B10FA81F02063606920B92868B5F90E10401A60
+6140F2DC512868884203D2302121481DF40DF2206960B1
+B5F90E1000EE101A00EE900AB8EEC00AF8EE600A80EE20
+0A01E0B7EE000AD5ED040A60EE200AB7EE001A31EE400A
+94ED071A40EE010AC4ED070A31BD00000F4991EC0C0B80
+EC0C0B7047D0E90E230B49C1E90023D0E91023C1E90223
+D0E91423C1E90423D0E91623C1E90623D0E91823C1E908
+23D0E91A23C1E90A237047D0BC890038B5044632200090
+04F5547504F519632022294620462CF407F632232022AA
+49284623F431F7204632BD000061F40EB370B5F2B00446
+0D465FA82BF4CBF3002641F290406821405901FB060000
+F150015FA82BF4CDF3761C322EF1D34DA82BF4B9F32146
+01A861F4D7F207E001A968465DF40AF669464DA82BF4BA
+F301A85DF401F60028F2D15FA929A8C5F4C3F529AA4DA9
+3BA8C4F4AEF63BA903A82BF476F30AE003A968462BF477
+F36946204661F4D9F203A82BF466F303A82BF461F30028
+EFD072B070BD00002DE9F84F0E462DED068B06F1500982
+B0804693464946FFF7A5FF050012D14946404661F4A3F2
+4946404661F4ABF2050004D136210FF20820F4F7B0F915
+B1284607F0E8F82C6804B10124D6E90E23D6F810A06649
+00201CF47DF0DBE9002341EC180BF768002000211CF41E
+F01ABF780800F001060026F80443BFB80900F0010080F0
+01070027E4B23CB3494605F11C0007F0D6F8E8B948462A
+F44CF700F0B4F81CF4D4F1CDE90001A8691CF4CFF153EC
+192B1CF499F2DDE900231CF41DF1CDE9000150461CF4C2
+F1DDE900231CF426F003D22946404600F0A7F83E4208BF
+9FED440B7DD0D5E9040153EC182BF19403F0C380001CF4
+BCF141EC190B286800283BD1484628F48EF0DBE9000153
+EC102B1CF46EF241EC190B484628F483F0B0EE40AAF0EE
+60AAB0EE490AF0EE690A2BF435F0064651EC180B53EC1A
+2B1CF458F241EC100B2BF42AF0301A1CF479F106460F46
+484628F466F051EC100B32463B461BF4FCF7C5E90201C5
+F800A04A4605F11C01684658F412F018E051EC190B0122
+1F4B1BF4ABF704D8D5E9022300201D4908E081F000411B
+F4A1F707D8D5E9022300201A491CF4ACF0C5E9020185ED
+048B2946404600F032F8B0EE408AF0EE608A48462AF4BB
+F600F023F8AAEB00001CF441F153EC192B1BF4C1F71CF4
+1BF1A861B0EE480AF0EE680A02B0BDEC068BBDE8F18F00
+000000F0BF000000000000000000001041000020411935
+8100000020C12868B0EE409AF0EE609A704780B5D1E902
+23D1E904011CF46BF041EC100B01BD00291CBF084606F0
+F1BF704780B5FFF795FE806902BD000070617463685F67
+6C70655F6164725F73746174652E6370700000000038B5
+044600F038F868B12078A1F4AEF50146684692F472F069
+46601C06F0F2FF012538B900E000251E210FF67830F4F7
+87F815B168467BF401F72078062819D8DFE800F0150415
+080C15150000F014F877300AE000F010F8403806E06078
+801F092804D200F008F82030C0B232BD00F003F832BD00
+2032BD601CA1F43BB1000000F1580107220A729FED670B
+00224A72028080ED020B4FF0FF32428080ED060B002202
+6180ED080B80ED0A0B80ED0C0B80ED0E0B80ED100B80ED
+120B80ED140B0A804FF0FF328A700022CA707047000038
+B50C462DED068B0546207828809FED5C9B607868809FED
+5C8B60681CF480F04FF0FF32DFF82C3A1BF4FEF6C5E902
+019FED7CABA0682861E0681CF467F000F0B1FB00F0ABFB
+C5E9060120691CF45EF053EC1A2B1BF4E8F600F0A0FBC5
+E9080160691CF45DF000224FF07B531BF4DCF6C5E90A01
+A0691CF449F000F093FB00F08DFBC5E90C01E0691CF440
+F000F08AFB00F084FBC5E90E01206A1CF437F000F081FB
+00F07BFBC5E91001606A1CF42EF000F078FBC5E91201A0
+6A1CF427F053EC1A2B1BF4B1F6C5E9140105F15800A178
+018094F82C108170E178C1702846BDEC068B32BD30B587
+B004460D461146684692F4E4F128691CF413F041EC100B
+B5F8581003A892F4DCF1024608236946204692F4ACF207
+B030BD38B5DFF83C59044607231022294623F4B5F40723
+1022294604F1700023F4AEF4DFF8200938B1DFF8200920
+B9D5210FF68C10F3F791FF2046F1940380C7800000F006
+F8204632BD000000000000000070B50446002504EB0516
+3046A7F42AF506F17000A7F426F56D1C072DF3DB70BD00
+0000000000003E112D4454FB210940F8B5054600242878
+0026062823D8DFE800F00422090E13181D00DFF8BC48DF
+F8BC0817E0DFF8B848DFF8B80812E0DFF8B848DFF8B808
+0DE0DFF8B448DFF8B40808E0DFF8B448DFF8B40803E0DF
+F8B048DFF8B0080668DCB10021684691F41EF76946681C
+E7F440F1074668467BF4B6F577B92846FFF794FE002100
+E0491CB14206DA30224A43135D8342F7D11019F2BD0020
+F2BDFEFFFFFFFFFF3F3DF0B583B00C4615461E46294601
+A891F4F7F6024621466846A7F4A2F401A87BF48FF56846
+FFF79EFF070019D097F92C00022803D1DFF80008007888
+B92146384606F06AFE60B139463046FFF7C3FE06F16000
+04704570684677F476F50120FEBD684677F471F50020FE
+BD00002DE9F043C7B004464E9E0D46904699462CA8FFF7
+81FE00F03BF8024629782CAB2046FFF7B7FF002770B340
+46A0F4B0F750B300234A4641460EA887F44BF40EA906A8
+84F4CDF706AA2CA903A8FFF7FEFE002203A90AA892F41D
+F7024606A9684692F4FAF0684691F431F7002332462CA9
+204600F011F8070006D0287804EB0010691C7030A7F414
+F4384647B0BDE8F083681CA0F47BB70000F8B52DED108B
+0C462DED020B98B094F86000012816460ED0DBB263B9DD
+E9180121F000410122DFF840371BF425F598BF002040F2
+C28104F108079FEDE2AB97ED040B2DF4DBF5B0EE40DAF0
+EE60DA97ED040B2DF4A9F5B0EE408AF0EE608A97ED0C0B
+2DF4CBF58DED100B97ED0C0B2DF49BF5B0EE40FAF0EE60
+FA97ED080B00F0EFF941EC190B00F0F5F900F0F3F90246
+0B4600F0B3F900F0C7F900F09DF900F0DDF900F0B5F900
+F0E5F9DFF8C026DFF8C0361BF421F500F0B7F953EC102B
+00F09DF9CDE90E0153EC1B2B00F0B1F9D7E90E231BF4E3
+F5CDE90C0106AA39460CA88DF416F39DED060B2DF488F5
+00F074F99DED060B2DF458F500F074F900F0AEF900F086
+F900F090F9D7E90023B0EE40EAF0EE60EA51EC1C0B1BF4
+78F641EC110BB0EE41CAF0EE61CA00F092F941EC100BB0
+EE4C1AF0EE6C1A2DF42EF5D7E90C0100F050F953EC1C2B
+1BF4A8F541EC1B0B00F04EF997ED00EB00F044F953EC1E
+2B51EC1E0B1BF4C8F400F052F900F086F900F014FB0246
+0B46204629461BF406F700F078F941EC1C0BB0EE4B0AF0
+EE6B0A2DF434F5B0EE409AF0EE609AB0EE4B0AF0EE6B0A
+2DF400F5B0EE40AAF0EE60AAF1940310CB800000F048F9
+CDE90A0100F03EF9CDE90801D7E90623DFF8AC05DFF8AC
+151BF466F5CDE90401DDE9042300F02AF9D7E90A231BF4
+5CF50446B8680D461BF401F6DFF88425DFF888351BF47F
+F400F003F941EC1C0BB0EE4C0AF0EE6C0A2DF4F7F400F0
+E3F800F0EDF8DDE9082300F0E3F851EC180B1BF469F4DD
+E9082341EC1E0B51EC1D0B1BF461F4DDE90A2341EC120B
+8DED002B00F007F900F019F922462B461BF425F5DDE90A
+2341EC110B9DED002B8DED001B8DED022B51EC1C0B1BF4
+45F404460D4600F0EDF800F0C5F841EC100B9DED022B9D
+ED001B12A882F49CF40146304682F4F2F4DDE9100197ED
+00EB53EC1E2B1BF42AF453EC192B1BF4F8F4DDE90E231B
+F422F481F0004141EC190B53EC1E2B51EC1F0B1BF418F4
+00F068FADDE90E231BF412F400F0CAF881F0004141EC1A
+0B314608A882F4B4F400F070F808AA014602A8A7F41BF3
+00F09FF804460D4653EC1B2B00F0A1F822462B461BF4C7
+F400F085F8014602AA68469EF474F0694606F118009EF4
+69F0314608A882F48FF400F04DF8014608AA02A8A7F4F8
+F253EC1B2B00F07CF804460D4600F07CF800F05AF800F0
+64F8014602AA6846A7F4D1F2694606F120009EF448F053
+EC1A2B51EC1D0B1BF4C2F353EC182B1BF408F681F00041
+41EC100B68469EF42DF0014606F128009EF432F0D7E912
+2300F04AF8D7E9102306F130041BF47AF4C4E9000197ED
+120B84ED020B0420207401201AB0BDEC108BF2BD000000
+0000000000F03F9DED040B0EA8A7F4A7B20000B0EE40BA
+F0EE60BA70470000B0EE40CAF0EE60CA70470000B0EE4C
+0AF0EE6C0A2DF4D6B3DB48DC491BF4C4B502460B462046
+29461BF4FEB402460B4651EC1A0B1BF4F8B441EC100B0A
+A89DF4DFB7000041EC100B2DF4EAB3DDE918011BF460B3
+53EC1C2B51EC190B1BF45AB353EC1C2B51EC1A0B1BF454
+B353EC1E2B51EC1B0B1BF44EB397ED000B53EC102B51EC
+100B1BF446B353EC182B1BF442B353EC192B1BF43EB304
+460D4653EC1E2B51EC1C0B1BF436B330B5A94883B00078
+0C4608B100203EBDF822182120461CF49BF40125E9B201
+A891F426F4024602216846A7F4D1F101A87BF4BEF26846
+FFF7CDFC20B1C1780078001900F8011C684677F4B6F26D
+1C192DE4DB01203EBD000070B504460D46A4B01646FFF7
+83FD0146287804EB0010AEF44BF338B30AA8FFF7BDFBFF
+F777FD024629780AAB2046FFF7F3FCD8B132460AA903A8
+FFF749FC002203A906A892F468F402463146684691F445
+F6684691F47CF451EC100BF19403A0CE80001BF420F42A
+F464F28D4988428041C00F24B070BDF8B52DED068BC4B0
+164604460D461B2100F012F9002800F0D6802A68926B29
+46684690472846A7F427F101466A4601A8A7F46AF16846
+7BF457F29DF80400022803D001A8FFF762FC070000F0B9
+80314605A884F4CFF405AA01A92046FFF798FF002840F0
+AD8001233246294626A88DF495F000233246294608A88D
+F48FF008A926A884F4BDF2B0EE408AF0EE608A26A902A8
+84F4AFF401A8FFF708FB3870032100F0CAF878700F2100
+F0C6F8786002A891F436F62AF408F4B860162100F0C0F8
+F860192100F0BCF83861112100F0B4F87861142100F0B4
+F8B861182100F0B0F8F8610D2100F0ACF8386209212846
+8CF4EBF7B0EE409AF0EE609A51EC190B6FF001024B4B1B
+F498F441EC100B2AF4DCF3B8620A2128468CF4D7F7B0EE
+40AAF0EE60AA53EC192B51EC180B1BF43BF200F08BF800
+223F4B1BF435F241EC100B2AF4C3F3786202A891F4E9F5
+B8700DF10501032087F82C009DF8040004EB0010A7F4B1
+F015202AF44AF750B30DF10500A0F417F404469DF80400
+08B9472517E0012808BF532513D0022808BF52250FD003
+2808BF51250BD0042808BF422507D0052808BF452503D0
+06280CBF4E25782527F431F000942B460FF2B00215212A
+F432F701A877F495F144B0BDEC068BF1BD0000FFFFDF3D
+29E10A005A580200581A0000A6CB91004C6A82004C7082
+00C8658200486A8200047282005473820000598200005F
+8200045F8200C4658200507082000072820020FE6D4100
+505B9366A8F6425B8DCBD7A71D13BFA71D133F803A0900
+FFFF3F3D0000E0412A68126D284610472A68926D284610
+4753EC1A2B1BF47CB270617463685F676C70655F616C6D
+6D67722E63707000000045706832416C6D2025632C2025
+640A0070B500F59854A83482B000212046A1F42FF10221
+2046A1F42BF100250FF2BC0600F07EF8032100F077F800
+F04DFB00F04FFB6D1C042DF3D30FF2A406002500F06FF8
+042100F068F800F03EFB00F040FB6D1C212DF3D3052120
+46A1F409F100250FF2A00600F05CF8052100F055F86946
+A6F4E0F700F02CFB6D1C0C2DF2D30FF29006002500F04C
+F8062100F045F800F01BFB00F01DFB6D1C082DF3D3F6F7
+10FAD0B1DFF8D84D606810B13F2100F040FD4FF44860F6
+F706FA60602820F6F702FAA0604FF4486160681CF4ECF1
+A06828211CF4E8F10020207073BD000001020307010203
+0405060708090A0B0C0D0E10131415161718191A1B1C1D
+1E202122232425000000F1940330D28000060A10111416
+171C1D20222301020304050607092046A1F4C5B00000A9
+5D684691F404B210B50B8848F29014A34202D100F014F8
+0CE048F29114A34202D100F0A1FE05E048F28F14A34203
+D100F074FF012010BDBDE81040D4F462B770B504460D46
+00260EE000F0DDFC50B100F0DAFC582101FB06510368CA
+6DD3F8883008319847761CE8888642EDDB70BD2DE9F04F
+884608F14805A3B00446288C092802DB6D2100F0C3FC08
+F108094FF0000AB9F81C00C0B2A6F46AF5064601AF11E0
+CCF4F7F060B100F0AEFCD0F800C0B9F81C30BBF80C20DC
+F884C0DBB26946E0470AF1010A288C824564DAA82000FB
+0A8000F1BC0100F59E7B0A68521E00924A680192002A8B
+687B60CB68BB600B69FB604B693B618B697B61CB69BB61
+0B6AFB614B6A3B628B6A7B62CB6ABB620B6BFB624B6B3B
+638B6B7B63CB6BBB630B6CFB634B6C3B648B6C7B64CB6C
+BB640B6DFB644B6D3B658B6D7B65CB6DBB650B6EFB654B
+6E3B668B6E7B66CB6EBB660B6FFB664B6F3B678B6F7B67
+C96FB96721A9DBF80000F867DBF804002190DBF8080048
+60206895D0CCF48DF00028A1D000F043FCD0F800C0BBF8
+0C20DCF83CC033466946E04795E798F80600C0071ED502
+A83DF492F2102208F114011CF40DF100F02BFC98B100F0
+28FCB8F806100906490E01F00101019102A90091314606
+68D9F80830D9F80420D6F838C0E04708F12806707DC007
+21D5707B8DF80D0070680190B0680290308AADF8100070
+8AADF8120030788DF80000B07B8DF80E00307B8DF80C00
+7088ADF8020000F0F6FB28B100F0F3FB69460268126C90
+47A879F0B1F0690190B0690090A8788DF80A0068798DF8
+0D0028798DF80C0028788DF80800E8788DF80B0068788D
+F8090000F0D5FB28B100F0D2FB69460268D26E9047287E
+E8B1B5F91A00ADF80000A88BADF80200A87F8DF80400E8
+7F8DF8050000F0BDFB68B100F0BAFB0746DDE900010A46
+014638463F68D9F80030D7F844C0E047A87D58B3F06903
+90B0690290A8788DF8120068798DF8150028798DF81400
+28788DF81000E8788DF8130068788DF8110000F094FB90
+B100F091FB0646D9F80000019002A883B00CC869460CC1
+0CC80CC130463668D6F84CC00EBCE04708F19006307A80
+B16846D4F4EBF430690290F0680190708900F070FB28B1
+00F06FFB69460268926D904708F17A07B87840B36846AE
+F43EF0B7F804A0388AADF80A00F889ADF80800B889ADF8
+06007889ADF804003889ADF80200F88800F04EFB80B100
+F04DFB8346694603A8F19403C0D58000D4F4ACF4DBF800
+C0D9F80030DCF848C0024651465846E04708F1750B9BF8
+030050B36846AEF408F0B7F800A0A86A0190686A009095
+F82C008DF808009BF802008DF80B009BF801008DF80A00
+9BF800008DF8090000F01EFB70B100F01BFB0546694603
+A8DEF4BEF7024628462D68D9F800302D6D5146A847B87C
+80B16846DEF4BFF77068029030680190B88A00F000FB28
+B100F0FFFA69460268526D904708F1B005287880B16846
+DEF4B0F7A868029068680190688800F0EBFA28B100F0EA
+FA69460268D26D9047307D80B16846DEF4A3F7F0690290
+B0690190F08A00F0D8FA28B100F0D7FA69460268126E90
+4723B0BDE8F08F2DE9F04F87B0CA8801EB420200231381
+01F10806CA885118C91D00F59850019100F1A8080DF108
+0907E0761C30783B281CBF01988642F8D1761C01988642
+7AD200273846A0F456F71CF4EEF0C4B23846A0F450F722
+46314622F487F6002804BFA05D3A2855D102A814211BF4
+57F7A1190020491C04E011F8012B00F80920401C0A783B
+2A18BF002A02D0C0B21428F2D339464046A0F444F6A6F4
+52F502A81CF4C3F00024451E21E0A0F14101062934D237
+385FFA80FA4FF0000B4AFA0BF0C0070ED50BEB8500411C
+C9B2684690F46CF739464046A0F424F600F032F800F034
+F80BF1010BBBF1040FE7DB6D1E6DB2002D13D4E4B214F8
+0900641CA0F130010A2938BF3038D5D3A0F161010629CC
+D25738CFE77F1CFFB2072F93DB0322314607A022F423F6
+002805D1F01C05F0E2FEDFF8481908607AE707B0BDE8F0
+8F574E3A006946A6F4BFB4000068467AF4CDB500002DE9
+F0430D46C1B00446A86881064CBFDFF818194FF0FF31A2
+688A4308401043A06004F59856E889A23618B1B0F5C87F
+B8BF308000F00CFA002800F06F817DF4ADF5DCF4C1F180
+6818B94FF4CF7100F003FA288A40B17DF4A1F5DCF4B5F1
+8168288A29F4FFF404E07DF498F5DCF4ACF18068708000
+F0ECF93188D1F4D9F400F0E7F97188D1F4DCF400F0E2F9
+0268217AD2F8942001F001019047207A00F0810081280C
+BF0126002600F0D2F93146D0F4B9F700F0CDF90268A168
+D2F8A020890801F00101904700F0C3F90268A168D2F8A4
+20490801F00101904700F0B9F90268A168D2F8B020490A
+01F00101904700F0AFF90268A168D2F8AC20C90801F001
+01904700F0A5F90268A168D2F8B820890A01F001019047
+00F09BF9A989CFF438F100F096F9A168CA09CB064CBF02
+230023CE034CBF10260026490302F001024CBF20210021
+1A43324311430268F1940350D98000D2F89020904700F0
+7DF90268A168D2F8BC20090A01F00101904700F073F9A1
+68DEF438F6A068800004D500F06BF90121D4F480F007A8
+26F4C7F220680FF62009CBF4A6F5DEF430F60646002000
+2159F821201043491C0729F9D3A16810EA010808BF4FF4
+9018002759F8270018EA000F51D004F598503946A830A0
+F403F501461BA89FF433F715E08DF8000001A87AF4DDF4
+9DF80000512801DB562807DB684656F470F518B1694607
+A827F423F61BA89FF422F71BA89FF421F760BB1BA89FF4
+1FF7C1B202A890F421F60246394601A8A6F4CCF3024631
+4668469FF4B5F401A876F4B8F402A87AF4B1F4684656F4
+4AF50028CED11BA89FF403F7C1B201A890F405F69FF4FF
+F69AF479F3C11D0E2934BF3B300020B8E77F1C072FA5D3
+002603A829F464F2324607A911A826F48FF211A91BA829
+F4B3F712E01BA901A829F4B4F73146684626F472F19DF8
+04009DF80010411A03A829F4D0F01BA829F4ADF71BA829
+F4ACF70028E7D0761C072ED7DB00F0C3F807A989F462F3
+00F0C4F8D1F4C4F300F0C0F8FBF74EF800F0BCF8D1F49E
+F3A06880010CD500F0AFF8D5F49BF4064600F0AAF846F0
+04010268D2F888209047A068400004D500F0A5F80121FA
+F730FCA068002804D500F09DF80121FAF72CFCA0680105
+04D5DBF4EDF141F288311AE0C10404D5DBF4E6F14FF47A
+6113E0810404D5DBF4DFF140F6B8310CE0410404D5DBF4
+D8F14FF4FA6105E0000405D5DBF4D1F14FF47A71DBF4E9
+F700F073F850B1A079297B00F0010001F00101884218BF
+4FF0010801D14FF0000800F063F848B1A079297B00F004
+0001F00401884218BF012700D1002700F055F850B1A079
+297B00F0020001F00201884218BF4FF0010901D14FF000
+0900F045F848B1A079297B00F0100001F01001884218BF
+012600D10026A889E08000F02FF828B100F02CF80268E1
+88526E9047B8F1000F03D000F029F8CDF413F41FB100F0
+24F8FBF7DEFBB9F1000F03D000F01DF8FBF7F5FB1EB100
+F018F8CDF42CF400F014F848B1DFF8FC542868012804DB
+00F00CF82968FEF7E1F841B0BDE8F0832068D5F4E7B300
+00ADF800002068CBF443B400000FF22C50F2F71EBD0268
+0A60406848607047000038B5846842F02005AC43114021
+4300F59852816022F8A23F049951800021BDE83440D5F4
+B7B00000F8B505462DED068B28680E46CBF41CF400287A
+D02868D5F4B5F3DBF491F7C00706F1440456D42868CBF4
+0EF4074606F12C00DEF4E9F4B0EE40AAF0EE60AA06F120
+00DEF4E1F4B0EEF19403E0DC8000409AF0EE609A06F114
+00DEF4D9F4B0EE408AF0EE608A06F10800DEF4D1F43968
+896FB0EE4A3AF0EE6A3AB0EE492AF0EE692AB0EE481AF0
+EE681A384688472868CBF4DEF3618901EE101ADFEDA00A
+B8EE411AE18861EE201A01EE101A218902EE101AB8EE42
+2AA18862EE200A9FED980AB8EE411A02EE101A016821EE
+001AB8EE422AD1F8801022EE000A88472868D5F455F3DB
+F431F7C00613D4B4F90200B0F5FA6F0EDA2868CBF4ABF3
+BDEC068B0368B4F90220B4F90010DB6F01B0BDE8F04018
+47BDEC068BF1BDF0B5ADF5037D04460D4602A8D2F444F4
+05F10806F06E00F44040B0F5804F03D04FF42371FFF746
+FF3068029008AFB088ADF80C0003A8F188418031898180
+7189C180B1890181F1894181318A8181718AC181716901
+6105F12000DEF44DF48DED080B05F12C00DEF447F487ED
+020B05F13800DEF441F487ED040B05F14400DEF43BF400
+F08BF97E9005F15000DEF434F487ED060B05F15C00DEF4
+2EF487ED080B05F16800DEF428F414A8002187ED0A0B01
+6096F86C0000F001003863F16E490801F0010140EA4100
+3863F16E890801F0010140EA81003863F16EC90801F001
+0140EA01103863F16E090901F0010140EA41103863F16E
+490901F0010140EA8110386305F17800DEF4F7F300F047
+F99F49086005F18400DEF4EFF300F03FF99C49086005F1
+9000DEF4E7F300F037F99949086095F89C003228A8BF32
+208DF85400002014E005EBC00202A99E3201EBC0014E31
+53784B70401C13780B70C0B2B2F902304B80B2F904308B
+8092798A719DF854108842B8BF3228E4DB0020ADF80400
+DAF4ECF701A900910DF10503012202A9F8F7F6FA9DF804
+0020B9DAF4DFF7F8F751FE48B32068164DCBF4C6F20028
+20680ED0CBF4C1F202A9D0F472F56868D8B1FFF774FEAB
+682A786968FDF7EBFD13E0CBF4BCF280B12068CBF4B8F2
+02A9026812689047686838B12068CBF4AFF2AA68297868
+68F8F72AF80DF5037DF0BD0000ECC991000000803A0000
+803B2DE9F843614D68680028894600F0B28009F1480631
+7AC90739D54FF448611BF4FDF2A86828211BF4F9F20020
+287009F10800A968FFF73CFEA86800F1080109F11000FF
+F735FE09F11800DEF44FF300F09FF8A968086109F12400
+DEF447F300F097F8A968486109F13000DEF43FF300F08F
+F8A968886109F13C00DEF437F3AF6800F086F8F8613068
+3862B088B88400276AE0702111FB0798696801EB801108
+F15800FFF705FE00F077F800F1080108F16000FFF7FDFD
+00F06FF800F1F1940370E08000100108F16800FFF7F5FD
+00F067F800F1180108F17000FFF7EDFD08F17800DEF407
+F300F061F820627F1C08F18400DEF4FFF200F059F86062
+FFB208F19000DEF4F7F200F051F8A06208F19C00DEF4F0
+F200F04AF8E06208F1A800DEF4E9F200F03DF800F13004
+00F035F8206008F1B4000188A1804188E1808188218181
+79A1722A786968C07901EB821181F83B0008F1BC00DEF4
+CDF295F80080686800EB881400F018F8E06308F1010028
+70707A8742BCBF287832288EDBBDE8F183C8888900F707
+FFFF40C9910044C9910048C99100ECC9910051EC100B1C
+F468B36868297800EB8110704700006868297800EB8114
+51EC100B1CF45AB300B583B0002001900090DAF4C7F66A
+4601A9F8F73FFDDAF4C1F6009A0199F8F73FFD07BD7061
+7463685F676C70655F6F6E636869705F7065785F646563
+6F6465722E637070000000000002000000000000001000
+00000001000040000000080000008000DFF8900C05F0EE
+B938B5044642F2E0710020085104F51C5500F008F900F0
+6AFB04F13000C2F46CF0002084F8340142F6394184ED42
+0A01200855E83504F530503C303CF483F704F530500021
+3830DFF445F42846E0F4B2F3DFF45EF460688AF419F128
+46E1F436F00021E1F437F004F51455B0359FED6A0B42F2
+D85185ED040B85ED060B85ED080B00200855DFF8084C20
+604FF4C87029F4B1F000EE100AB8EEC00A84ED010A04F1
+080002F0EFFB05F0B3F901462A6804F10800BDE8384005
+F065BC00002DE9F0472DED048B04468CB06068A5F415F5
+814604F59C7A5046BCF4C7F3B0EE409AF0EE609A5046BC
+F4E2F300F094FD41EC180B6846E0F4B5F704F5145757F8
+B40F88F47DF4E0F4B7F7050018BF01257868BDF469F380
+467868B9F401F7007809280CBF0126002648EA05003043
+80F001005DB17868B9F4F3F60078012818BF002048EA00
+00304380F001000299C0B2002812BF41F0010048084000
+02907868ACF486F400780299002814BF21F0020041F002
+0002907868ACF47AF400780299012814BF21F0040041F0
+0400029004F13000BCF46BF351EC100BDFF8CC2ADFF8CC
+3A1AF431F002988CBF20F0100040F0100002903868AAF4
+69F50028029814BF40F0400020F0400002905046C1F496
+F7DFED140AB4EE600A0298F1EE10FA54BF20F4007040F4
+0070029000F01DF8024600F076FAF0EE690A4B46694604
+A8E0F43FF77868BCF44AF5626804A905F0C2FB0CB0BDEC
+048BBDE8F087000000000000000000000000484204F130
+00BAF466B1F1940300E48000FEB50446FFF744FF6846E0
+F43FF742F6B04004F514560059B036810EC00E00F00100
+80F0010501F00101B06881F00107BDF4C2F20028029814
+BF40F0800020F0800002907068AAF409F50028029814BF
+40F0080020F008000290002F029814BF40F4804020F480
+400290002D029814BF40F4005020F400500290694604F5
+9C7007F05CFB2046D7F44DF630689FF4E4F110B1204600
+F0E8FCF7BD00002DE9F84F044604F51C502DED048B00F1
+E809DCB04846E0F469F2C4F46FF782464846E0F463F2E0
+F4F3F642F2D95700253855002814BF4FF005084FF00408
+04F530568436706870B96068BCF40BF3014652A826F43F
+F352A838F420F718B16068A5F4E6F370602046D8F4E6F0
+94F834010028DFEDE49A00F0B1816068BCF4F2F2014648
+A826F426F348A838F407F74045C0F0A48104F51450B430
+4068BCF414F5024604F1F00104F5F550C2F489F309A8E0
+F4BCF6395D0B98002912BF40F00100400840000B9042F2
+B4500059AAF478F400280B9814BF40F0020020F002000B
+900B9840F004000B903CA889F4D3F46068A5F49EF37168
+A0EB010B04F13000B9F4EBF500F079FE04F13000C1F491
+F6B0EE409AFFF723FF014616A8ACF4A1F604F50C5101F1
+E80842F210710391CDF808B042F2E0310246095D01913C
+AB09A9009100F068F95146404609F04EFE04F5305000F1
+380A4046C1F46BF6B4EE690AF1EE10FA40F11B814046E0
+F46AF600F0EEFB41EC190B4846E0F445F6E0F465F640B1
+51EC190BDFF8082CDFF8083C19F4D6F661D88DF81E5040
+46E0F458F628F4F4F0ADF820004846E0F4E7F58DF81D00
+4046E0F44CF6014614A85BF4A0F404F1F0010EA8ACF44D
+F64846E0F442F6E0F442F6483038F463F60428ACBF4FF0
+010BAB464046E0F43BF600F007FE4046BAF420F00C9040
+46E0F436F68DF81C004846E0F401F6BDF820100C9ACDF8
+00B049B20691B0EE481A9DF81D100591F0EE681A012104
+91B0EE490A14A90391F0EE690A0DF11E0102910EA90191
+94F834319DF81C10E0F44AF6002800F0BA804846E0F4DA
+F50121E0F4DBF54046B9F4EAF700F0E2F84046C1F4E5F5
+012084F8340184ED420A4046BCF48DF105464846E0F4ED
+F6014601232A460CA885F43BF50CA9684683F4BDF06946
+04F5947090F4EAF1385D68B14046E0F4DBF542F467F428
+F4A7F605464846E0F41BF12946DFF4D4F141460CA8BBF4
+4AF6014604F13000BBF493F64046E0F4C6F6DFEDB20A00
+F098FDACBF01250025385DB0B14046E0F4B0F528F44CF0
+0728B4BFF1940390E780000120002028430BD004F13000
+BCF44AF1DFEDA70A28F4BEF58DED000A00F07AF84046C1
+F48BF5DFEDA30A00F075FD2CD5002D04BF385D002827D1
+2046DBF49AF4052822DB04F130010CA8BBF40BF6DFF854
+1A009104F59C756946BCF467F30CA9284605F0F7FC0321
+5046DFF455F104F51450B4304068BCF431F3C4F421F028
+46DEF40AF1BCF440F103E002215046DFF443F104F13000
+BCF401F1306042F639410020085501252CE05046E0F4CD
+F401280FD06068BCF45CF101460CA826F490F10CA838F4
+71F507281BDB2046D7F4ECF417E0307A401C3072C0B205
+2811DB2046D7F4E2F435720CE004F13000BCF4DAF0B4EE
+690AF1EE10FA03D5CDED009A00F009F85CB02846BDEC04
+8BBDE8F28F00000000C843694604F13000BCF4FBB20000
+B0EE481AF0EE681AB0EE490A70470000014604F1F00080
+F4B7B50000F8B504462DED028B04F514568CB056F8B40F
+0D46AAF4BCF220B104F5F05038300AF0E0F97068ADF43D
+F40078022805D07068ADF437F40078032801D1012600E0
+0026D5E90C010022DFF8203919F45EF540F28A8004F530
+5717F88D0F00281EBFA86CC0F3001000280DD0D5E90E01
+00F04BFA08D87878401C7870C0B2042802DB0020387078
+7029462046D8F4B9F2A86CC00800F001008DF80400B0EE
+408AD5E91001F0EE608A1BF453F7039003AB01AA00F064
+F8D8F41AF304F13000BBF4AEF428F428F58DED020A3346
+02AA00F056F8D8F418F495ED060B8DED060B42F6B04095
+ED080B8DED040B005D40060BD42046DAF48CF2332806D3
+009604AB06AA2946204600F043F89DF80400A96C60F3C3
+01A96403981BF464F7CDE90A010020DFF85018CDE90801
+022208A90AA880F4D6F385ED100B04F530509DED060B85
+ED060B38309DED040B85ED080BE0F4DFF303280AD12046
+DAF45AF230B104F5E850E830BDF4A8F285ED0A0B0CB0BD
+EC028BF1BD0100A040000048430000C842B0EE480AF0EE
+680A29462046704700002DE9FE4F2DED088B0C468EB082
+4694ED0A2B94ED081B94ED060B08A882F444F1A06CC0F3
+001020B100F08AF938BF012600D300260AF5F05000F138
+084046E0F4A3F546EA000700F07BF934BF012100214046
+E0F49DF542F2B850002550F80A00B9F41AF342F68D4900
+78012808BF0125229880F00100054207EA050605D119F8
+0A0020B100F066F901D2012500E000252EB919F80A0028
+B100F05CF902D20126002705E04046E0F435F5384080F0
+01070AF59C70E0F470F500F06AF90022DFF8283719F46F
+F519F4F1940320EB8000F7F5834686F00100384360D140
+46E0F465F52168081AB0F5FA6F00D865B908A94046E0F4
+5DF501214046E0F45DF521684046E0F45DF552E04046E0
+F45BF521684046E0F455F519F80A0030B94046E0F457F5
+0BFB00F01F283DD300F023F9014602A8ACF4BBF3DDE902
+2305469FEDAC9B00F01CF9CDE90001D4E906239FEDAA8B
+00F0F2F800F0F4F8CDE90201DDE9042300F00CF9CDE900
+01D4E9082300F0E4F800F0E6F8CDE90401DDE9062300F0
+FEF8CDE90001D4E90A2300F0D6F800F0D8F8CDE9060129
+464046E0F40AF507E000214046E0F409F508A94046E0F4
+01F537B108A94046E0F410F500F0B8F8B1E000F0D5F807
+4600F0D6F839467FF4E9F5F0EE609AD4E90C01F2EE040A
+B0EE409AB0EE608A1BF4F3F500EE100AF0EE480A28F42B
+F3B1EE048AF0EE480A28F46BF3B0EE40BA5EB14046E0F4
+E3F40BFB00F0B0F5967F34BFB0EE48BAB2EE00BA42F2E0
+7757F80A003C2828BFB42851D3D4E90E0100F0A8F89FED
+72AB98BF9FED73AB002E46D100F093F8054600F094F8D4
+E910230646DFF8A005DFF8A01519F4D5F32A4641EC130B
+35461646B0EE438AF0EE638A00F08EF800F0E2FA324641
+EC120BB0EE483AF0EE683A2E46B0EE428AF0EE628A1546
+B0EE43AAF0EE63AA00F079F841EC110BB0EE4A3AF0EE6A
+3A2A463146B0EE482AF0EE682AB0EE490AF0EE690A4046
+E0F426F451EC100B1BF480F50BEE100A00F05EF853EC19
+2B19F47AF303D357F80A00012807D100F045F801464046
+E0F473F400F01BF84046E0F472F451EC100B00F02EF80D
+D200F031F8179990ED000B81ED000B00F02AF890ED020B
+189880ED000B0EB0BDEC088BBDE8F78F94ED0C0B4046E0
+F459B4000051EC180B19F464B3DDE9002319F432B4D4E9
+0E0121F00041DFF8A824DFF8A83419F43AB3D4E90C0100
+22DFF8A03419F433B300004046E0F4A5B300004046E0F4
+3BB4000051EC190B19F442B3DFF88024DFF8803419F4FC
+B21BEE100A1BF462B510EE100A1BF45EB53EB504460D46
+6846E0F448F242F6B040DFF85C140059084207D1029940
+0154BF41F4804021F4804001E000203EBD02906A460298
+40F402200290294604F59C70AEF482F13EBD0000010000
+8014AE1A400000808C5EF2EF3F00000000E7425B3F0000
+000000001040000000000000144028AF890020AF89002D
+E9F84F2DED068BADF5487D04469FEDE70A28F4B1F2B0EE
+408A04F59C70E0F4B3F3DFF8D853D5ED010A04F5145748
+EE000AB037C5ED010AB868ADF465F10078012840F0AD81
+2046F19403B0EE8000DAF412F00F28C0F0A7816068DFF8
+A893BBF41EF60146B6A85BF466F0012089F80000FA6A61
+6884A8C3F47AF1B6A95EA828F472F50026E3E05EA906A8
+28F472F54CA828F48DF506A85AF4FEF6002806D0606800
+23002206A989F42CF5002800F0CC8090F85410012940F0
+C78000F13008DFEDC00A98ED070A00F0BEF907DB606800
+2206A989F484F5B0F9F0001F28C0F2B48006A94CA828F4
+71F5D8F800001BF4ADF44FF09442C54B19F47EF21BF45E
+F409EE100A2046D9F4D9F6C4F415F2804600F096F9B9F4
+FEF000F08CF900F090F9B9F4A4F3014608A8ACF4B8F103
+4600200590CDF8008001200490B0EE480A002003900290
+0190F0EE680A4CAA84A90EA8B8F4D0F2B0EE490A28F412
+F2B0EE408A00F06EF9C1F482F128F40AF2F0EE408A00F0
+66F9BBF484F128F402F2B0EE409A00F05EF9BBF488F178
+EE280A30EE898A28F4F6F138EE008A95ED010A78EE000A
+C0EE208A01210EA881F464F6761C416800681BF403F409
+EE100A01210EA881F459F695ED010A804630EE080A2BF4
+9CF2FFF7DAFE02460B46D8E9000119F456F441EC100B28
+F4A6F151EC100B1BF4E6F300EE100AF0EE000A00F026F9
+25D518EE900A1BF423F402460B460020804919F47DF341
+EC1A0B28681BF418F400F006F9824628EE890A8B46FFF7
+AEFE52465B4619F4B4F21BF4C2F3286068681BF406F400
+F0F4F81BF4BAF368605EA828F488F45EA828F483F40028
+3FF416AF0020002E89F8000000F0A080684655F4A3F102
+4656208DF8040001A9786881F4E5F79DF80010386802AA
+84F45FF462486249CDE90401002204A902A880F456F028
+688DED020B1BF4D3F300F087F8DDE9022319F475F241EC
+180B95ED010A2BF425F2DFED420A00F0C1F86CD553EC18
+2B0020534919F492F141EC180B3868042184F450F451EC
+100B4E4A4F4B19F446F136D83968012210A885F41AF010
+A90CA882F4CCF304A8A2F4B3F302208DF81C008DED088B
+0C98ADF816000CA88FF470F728F4FEF20690386888F474
+F428B1022809D004D3032804D007E0022006E0032004E0
+042002E0012000E000208DF8140004A9386800F09EFA04
+A8ACF42FF220E095ED010A2BF4D2F17868B0EE409A7CF4
+43F788F44FF4044619EE100A1BF468F300F01CF8002229
+4B19F438F141EC110B3868B0EE480AF0EE680A04222146
+84F435F400202860684675F4CEF00DF5487DBDEC068BBD
+E8F18FCDCCCC3D4FF09442134B19F465B300000100C841
+FFDD3F40B7F3FDD4414C02410000164400007940008076
+40F1940340F280000000E03F349D52A246DF913F14B233
+E5F03AE13F00004940CD26C0B0FC19FF3F0800000820AF
+8900A0CB910078DEB1410000F03FFCA9F1D24D62503F00
+00F0BF01000040E17A843F80842E4153EC1A2B19F4E2B0
+B0EE408AF0EE608A704700002046D2F4D3B30000B4EE60
+0AF1EE10FA704700002DE9F0412DED048B0546D4B00E46
+17462969321D01A89EF499F09DF80400012818BF042875
+D006289FED3A8B76D105F50C6431462046A4F435F12046
+A4F43AF210B1284686F4FEF12046A4F47DF210B1284686
+F4F5F2002F5BD005F618173879002856D10AAA0BA92046
+A4F485F200284FD000F0DDF9009800F57A7000900A9819
+F40CF241EC100B0B9902A88FF43EF7386889F43BF7B06B
+B0EE409AF0EE609A89F434F751EC190B53EC102B19F404
+F2DDE9082319F448F153EC182B19F472F0CDE90C010CA9
+02A88FF44CF7002202A90EA890F4FBF10446009819F4DF
+F141EC110B3868B0EE418AF0EE618A19F4D6F141EC100B
+B0EE481AF0EE681A2246052118A881F453F70146331D04
+22284684F451F45CE1FCA9F1D24D62503F010018BF0328
+04D084210FF66C30F1F75FF90DF105009EF435F202469D
+F80410A86800239EF4ACF50028E4D006F1100108684A68
+0B691043CA6889681A437379C00FD20F012B03BF4B0B03
+F0010383F00103012301F04041491E80F0010082F00102
+89411040184010EAD17FC3D005F54A68404687F418F100
+2840F0F3807079012806BFB069040D0024F06819F478F1
+41EC100B214605A88FF442F300275CB30022311D684627
+F4D7F6286889F478F6694657F491F7F8B1286800230022
+694689F468F2040017D0207B800614D52868A4F414F419
+F454F141EC190B94ED060B05A902A88FF4D6F302A905A8
+8FF426F3012700F0F5F806D1B06B002805D019F43FF141
+EC190B00F0EBF800F0D28000F001F91FB9009800F57A70
+00904FF4FA60009927F411F70090DDE9082351EC180B18
+F4AAF7CDE90C010CA905A88FF42CF3404687F4E3F058B9
+05A88FF45BF3B0EE401AF0EE601A009900F0B4F887F4B4
+F17079012809D1404687F4A8F028B9009A05A900F0A7F8
+87F40BF12846A4F4C0F3B0EE408AF0EE608A36A881F457
+F6404687F494F0B0B14046A4F4B6F390B900F097F887F4
+8DF000F0A1F80746179819F4E7F000F0A5F800F09FF840
+4687F4A2F0052749E0404687F4A1F0002826D04046A4F4
+9EF310BB28469EF456F1F0B1012200F038F9294618A800
+F0A8F818A902A882F472F102AA00F06BF887F48DF000F0
+F19403D0F5800075F80746179819F4BBF000F079F800F0
+73F8404687F4B6F006271DE07079012820D128469EF430
+F1E0B9002205A90EA890F4ACF00446009819F4A2F041EC
+110B22460021B0EE490AF0EE690A18A881F41FF600F051
+F80427331D3A4636A9284684F41AF305A88FF457F22846
+9EF40CF14FF0000878B1B26B0123294618A884F4A5F518
+A902A890F4DBF102A905A88FF455F20DF1140842463146
+05F118009FF42DF705F11800A0F45BF010B1284686F40B
+F001A874F48EF654B0BDEC048BBDE8F0810000B0EE490A
+F0EE690A40467047B0EE480AF0EE680A414612A8704700
+0053EC192B0020002118F478B6002214A90EA890F44BB0
+0000014636A881F440B641EC110B3A4600219DED120B18
+A881F4BFB500006B4608AA311D284684F4BAB210B50446
+04F5FB60A2F41EF320B12046BDE8104086F4F6B010BD00
+00F8B50D462DED048B05F5156784B00446B0EE408AF0EE
+608A1646394681F48CF538469FF425F49FED549BB0B984
+ED069B51EC180B0022DFF89C3719F4D1F041EC100B2AF4
+E3F653EC102B0020DFF8841718F47CF641EC100B01E000
+F05DF8204682F42CF2F6B2002E52D020469FF400F40028
+4DD005F6D816304682F407F6002846D0D4E90601D6E900
+2318F4E9F7DFF84827DFF8483718F459F68DED029B8DED
+009B41EC180BE8686A4602A99DF4CCF2DDE9020153EC18
+2B18F448F6D6E9022318F416F741EC100B204681F461F6
+51EC180B21F0004141EC100B53EC102B0020DFF8FC1618
+F432F6DDE9002305460F46DFF8F006DFF8101718F4FAF6
+2A463B4618F424F6D6E9042318F4F2F6C4E9080104B0BD
+EC048BF1BDB0EE480AF0EE680A70470000B1F5806F0EDA
+90F9980C10F1010F06D16629ACBF01F5006101F5406102
+E080B201EB802188B2704710B5A2B004469FED090B6846
+8FF444F101469FED061B9FED050B04A881F406F5014620
+4685F428F122B010BD000000000000000070B59EB00D46
+044604F51166206881F4F9F338B1012D18BF052D03D170
+7808B1B07820B32946204687F422F1012D0CBF01210021
+204685F43BF04FF0FF3084F8980C012D18BF052D0BD068
+4681F498F4014604F5216081F435F56FF07F0084F8880A
+307818B10121204686F4ABF21EB070BD00002DE9F74F2D
+ED068BD8B083463AA881F47DF409A88FF4E8F006A88FF4
+F9F168468FF404F303A88FF447F458469DF494F70026C8
+B1012259461CA884F427F41CA93AA881F405F509A93AA8
+81F459F606A93AA881F4B9F669463AA881F4E5F603A9F1
+940360F980003AA881F43DF70126584683F48DF7824600
+209FEDB79A9FEDB78B0CAC0DF1700808EBC00181ED008B
+04EB8001401C0F2881ED009AF4DBDFEDB19AC4ED059A0B
+F17000A1F4C1F39FEDAEAA38B10BF17000A1F4B2F388ED
+0A0B84ED05AABAF1000F0BF50C690BF5FB670BF508655F
+D0C4ED019AC4ED0A9AC4ED099AC4ED0B9A36B9C4ED029A
+C4ED039AC4ED049A94E009A90BF11800A0F44CF040B109
+A90BF11800A0F454F088ED020B84ED01AA2846A4F4EFF1
+70B106A92846A3F474F100F08AFAC8E9120106A92846A3
+F4D0F100F07EFA60623846A2F4D0F370B169463846A2F4
+CFF300F077FAC8E9140169463846A2F4F3F300F06BFAA0
+624846A4F4D3F130B9C4ED029A2846A4F4BDF1C8B927E0
+03A94846A3F445F700F05DFAC8E9160103A94846A3F4A7
+F700F051FAE062E8E7002EC4ED029AE6D1C4ED039AC4ED
+049A9FE006A92846A3F4CAF000F044FAC8E9040106A928
+46A3F414F100F038FAA060C4ED039A3846A2F462F270B1
+69463846A2F465F200F02FFAC8E9060169463846A2F487
+F200F023FAE060C4ED049A4846A4F483F170B103A94846
+A3F49EF600F01AFAC8E9080103A94846A3F4E8F600F00E
+FA2061BAF1000F63D0CDED0C9AC4ED069AC4ED079A0BF1
+7000A1F420F300283AD00BF17000A1F404F300F0FCF9CD
+E91C01DDE91C23D8E904018DED0CAA18F40EF6C8E90C01
+94ED020AD8E90601DDE91C2330EE0A0A84ED060A18F400
+F6C8E90E0194ED030AD8E90801DDE91C2370EE0A9AC4ED
+079A18F4F2F594ED040A30EE0A0A84ED080A9FEDD70AC8
+E91001F4EE409AF1EE10FA1CDB3846A2F446F2C0B16946
+3846A2F47FF200F0B9F909EE900A94ED070AF4EE409AF1
+EE10FA09D569463846A2F436F200F0AEF9C8E90E01C4ED
+079AD8E90601D8E9042318F4C0F5C8E9180194ED020AD4
+ED030A30EE200A84ED0C0A3846A2F47BF270B169463846
+A2F47AF200F090F9C8E9180169463846A2F4B4F200F084
+F920630020B349D1ED009A0BEB8001D1F8082B00EE102A
+00F071F90BEBC0020FD008EBC00102F529621EE000BF00
+24F44900000000000000000000FA436F12833AD1F8301C
+00EE101A00F058F914D004EB8001D1ED000AB4EE600AF1
+EE10FA0BD508EBC00102F6B83292ED001B81ED001B04EB
+800181ED000ADBF8B41BC140C9070DD5BAF1000F0AD104
+EB800191ED000AB4EE490AF1EE10FA48BF81ED009A401C
+0F28B2DB9BF9600910F1010F7AD000277E1CC7F10B0035
+4607FB00FA0EE051EC110B53EC102B18F43FF508EBF194
+03F0FC8000C902C2E9000104EB890080ED009A6D1C062D
+5EDA9BF96009874218BF8542F6D0022F18BF022DF2D00A
+EBDA714910CA1BA918491EC9B254F8213000F0F7F8E6D0
+C0B2C0F10B034343874202DA8218521E05E003EBD37207
+EB6202521E121AD2B254F822C000EE90CAF4EE690AF1EE
+10FACDD0A84205DA03EBD3735B101B1AEB1807E0C5F10B
+036B4303EBD3735B105B1BC3185B1E5FFA83F954F82930
+30EE209A00F0C4F804D0B4EE409AF1EE10FAAEDA08EBC1
+01874291ED001B08EBC20191ED000BA2BF51EC100B81F0
+004141EC100B8FE73746062F85DB58469FF403F118F4B5
+F441EC190BD8E9020153EC192B18F4C5F4C8E9020153EC
+192BDDE91C0118F4BDF4CDE91C01D8E906239FED40AB51
+EC1A0B18F4FBF3C8E9060153EC192B51EC1A0B18F4F3F3
+41EC1A0BD8E90E0153EC1A2B18F4EBF3C8E90E01D8E90C
+2300F087F8C8E90C01D8E9102300F081F8C8E9100153EC
+1A2BD8E9140118F4D7F3C8E91401D8E9122300F073F8C8
+E91201D8E9162300F06DF8C8E9160100259DF97C014FFA
+85FB8345FFF7D5FC22D0024693459FED200B594603DA9F
+ED200B58461146C0F10B02424302EBD272C0EB620040FA
+81F0471E08EBC70053EC102B4168006818F4D2F241EC10
+0B54F8270001EE100A01E09FED151A6098594681F495F1
+6D1C062DCBDB58B0BDEC068BBDE8F78F000000006940FC
+A9F1D24D62503F80842E413A8C30E20BD7A33B984A0900
+0000000000002CC0000000000000F03F000000000000F0
+BF8E79353E0000000000EE103AB4EE690AF1EE10FA7047
+000051EC100B1AF474B451EC100B81F000417047000051
+EC190B18F45AB370617463685F676C70655F74696D656D
+67722E637070000038B504460A4820600D4605F1080104
+F10800ABF4C3F105F1200104F120008EF4B5F595F82C00
+84F82C00204632BD00BF44C9000090F8B0097047000080
+B524F4E7F101460020002918BF032903D0062918BF0B29
+00D1012002BD000019B102291BD00DD31CE0022804D004
+2805D0062813D015E09FED360B70479FED370B70470028
+18BF032802D0052803D008E09FED340B70479FED340B70
+479FED350B70479FED350B7047000010B50C4690F90110
+11B1012908D018E00078762815DB9A2813DA9FED2F0B10
+BD23F412F720B1032804D0042806D008E00CB106E02CB9
+9FED2A0B10BD9FED2A0B10BD9FED2B0B10BD90F9011011
+B1012908D00FE0007876280CDB9A280ADABBEE080A7047
+0078512804DB762802DABBEE040A7047BBEE0E0AF19403
+800081007047000090F90110012902D0022908D00AE000
+78762807DB9A2805DA9FED180B70479FED190B70479FED
+190B704700000000002025DFD741000000C41D43D74100
+000020EC4AD241000000A8DFFCD141000000F4CC87D141
+00000018C079D741FCA9F1D24D62703F000000000000F8
+3F7B14AE47E17A843FFCA9F1D24D62503F1CD8C6816D1C
+A8BF99968D69D99896BF000000000000000070B5A8B004
+460D46164627F44FF440BB214602A827F44CF409E00020
+864203D101A9284625F482F202A827F43DF402A827F438
+F4A8B902A9684627F43FF4684627F46AF004009DF80000
+8DF8040006D0684659F4C5F50028DFD0012CDDD10120DC
+E728B070BD000038B504460D4623F4C7F621462846BDE8
+38400122C0E7000038B504460D4623F4BBF621462846BD
+E838400022B4E70000C948FCF7C9BA00002DE9F0412DED
+048B9EB00446884616461F4604A854F422F10246414620
+4680F467F79FEDBE9A80B30020CDE9080006908DED059A
+06AB206808AA414683F4D8F4384688F4E1F7DDE9082351
+EC100B18F4B1F241EC180B0CA880F482F5DDE908230746
+A568AF48B04918F41AF100973346CDE90A012E6876690A
+AAB0EE480AF0EE680A04A92846B04728B904A874F4AEF0
+B0EE490A1DE0A068299B289A05A9039100210291019100
+910CA90668B66AB0479DED050AB5EE400AF1EE10FA04D5
+A0680268D2694146904704A874F48FF09DED050A1EB0BD
+EC048BBDE8F0812DE9F0410446E8B020689DF4DBF20028
+3ED0216801224AA883F46EF70025894E294620467FF474
+F407002ED03A68D2F88C20394602A8904702A924A89DF4
+B4F20EE04AA906A880F4B3F7024641463046FCF7E6FD68
+4678F457F024A89DF4AAF224A89DF4A9F280B924A89DF4
+A7F2C1B268468EF4A9F13B681B6B01460122384698475F
+EA0008DCD1E4E76D1C072DC7DB68B0BDE8F081000070B5
+82B00C4615461E467BF48DF6024600962B4621466548FC
+F7C0FA76BD0000F0B5A5B004460D4616461F4612A880F4
+DDF45D48049002A88FF42CF668468FF429F606A88FF426
+F6014602AB6A460CA87FF4F4F006A88FF40FF612AB3246
+29462046FFF7CDFFA0B139460CA87FF41EF12A9906A87F
+F44AF0A06804A9039106AB00210291019100910CAA0468
+A46A12A9A0479DED040A25B0F0BD000010B50446D4F8BC
+0208B196F41FF4012018E0000010B50446A06801688968
+8847D4F8BC0208B196F41BF4012084F8B30910BD000010
+B50446D4F8BC0208B196F413F4002084F8B109F1940310
+04810010BD0000F8B52DED028B0E46A0B0054630780024
+052850D10E2101A88EF416F10146701CE3F438F370B912
+2168468EF40DF16946701CE3F42FF3070018BF01276846
+77F4A3F700E0012701A877F49EF79FB3317828467FF4B7
+F370B303681B6B0122711C9847060027D03168C96B8847
+032822D12968012202A883F47FF63168C96A3046884733
+681B6A0546012202A930469847B0EE408AF0EE608A6808
+18F44FF100220B4B18F4A1F053EC182B23F0004317F489
+F798BF012420B02046BDEC028BF2BD0000B4C250C89100
+FCA9F1D24D62503F00005EC02DE9F24F0446C81D0E28BE
+B004D317210FF25C40F0F7D0F820687BF4A7F59DF4ADF1
+80469DF9F800C01D8DF812000C219DF8120011FB004000
+F5CA7694F85104002824D104F558794146484697F476F4
+78B14846A8F46CF405462168484697F477F435B94846A8
+F463F410B1204697F425F4B07A3268717A00281BBF707A
+012801200020424504D1002901D0002866D1A3E1C6F800
+8049B1D24B726853F82110A8EB02028A4258D300207072
+04F5856700253868CC49884205D0A8EB0000CB4A90424E
+D33960B07A0028E1D1C6F804804846A8F435F40028DAD0
+25B900F090F9002084F83C029DF81000002804BF9DF811
+000028CCD02068A8F426F40690002504A82F5C002F73D0
+394668468EF432F00146069803681B6B012298475FEA00
+0A63D0DAF80010C96B884701285DD14846A8F40EF40146
+504689F4FAF4002854D137725046DAF80010C96C884700
+281DBF01200021B172022039E00028A6D0307A3CE100F0
+4DF984F83C5201259DF8100004F22C4A80B1F8689DF810
+10C840C0070AD59DF8110020B10146504626F480F310B1
+9DF8100012E09DF81100002892D0F968C140C8078ED59D
+F8100028B10146504626F46DF3002885D09DF811000028
+FAD0032171723072C6F8048006E100F023F9707A20B1B1
+7A002918BF012801D06846E9E0347A6846EBE0684677F4
+62F66D1CEDB2022D83DB4846A8F4ABF3002800F0EB8048
+46A8F4A7F34FF496720421B0FBF2F026F4B4F50FF27021
+C0B200254056099004A8285C0790002800F0D080014605
+A88DF49EF72CA880F4F9F2069803681B6B012205A99847
+00275FEA000A3BD04846A8F47CF30146504689F468F498
+BB5046A3F4F2F401280ED1DAF80020926D042150469047
+10F1080F05D19DF9F820069805A996F465F24846A8F460
+F3DAF800305B6B01462CAA9FED550B50469847DAF80010
+C96B834650468847012818BF022806D1DAF8F19403A007
+81000010C96C5046884700B10127BBF1000F32D1206886
+F40CF2D9F40EF210F0480F77D112A8FBF70CFF05A89DF4
+43F0024612AB02214248FCF741F8002869D0484608F06A
+FA8246524612A90AA8FBF792FF00220AA90DA88EF4B1F7
+0246514668468EF48EF168468DF4C5F700232CAA12A933
+48FCF7A5F88346BBF1000F49D0314808902068A3F444F5
+82464846A8F40AF383464846A8F408F308A90391024600
+210291019100915B46DAF800C0DCF828C02CA95046E047
+09A8DDED080A90F9000000EE100AB8EEC00AB4EE600AF1
+EE10FA1FD50798307247B14846A8F4E1F20A2803D20021
+0120B17200E0032000F038F8707A20B1B17A002918BF01
+2803D005A877F47CF50DE0347A05A877F477F5204608E0
+05A877F472F56D1CEDB2022DFFF625AF00203FB0BDE8F0
+8F0000E0810A00FF2292FF40771B000000000000000000
+50C891000000B4C2012084F83C020DF111039DF9F81004
+AA204697F4EDB00000707241469DF81220204697F4E9B1
+000038B50C2312FB0305004C01E0FF2292FFC5F8E84113
+FB0103C3F83442BDE8384070B504460D4694F838041646
+28B9F822182104F2394018F4F9F6012084F83804281980
+F8386470BD70617463685F676C70655F676C6F66636E6F
+736E6D67722E6370700000050A0F2D00000070B52DED06
+8B06469AF4D8F0022804D130469AF4CFF0022802D01121
+00F0EAFB0122022100F0FCFC00F0F2FC00F0F7FCB0EE40
+9AF0EE609A00F0F0FCB0EE40AAF0EE60AA53EC182B51EC
+190B17F446F504460D460222022100F0E2FC51EC100B00
+F0D2FC02460B462046294617F480F70122DFF83C3C17F4
+F1F425D9022200F0CEFCB0EE408AF0EE608A0122022100
+F0C7FC51EC180B53EC102B17F4A9F621F00041DFF8102C
+DFF8143C17F4D7F40BD900F0B4FC00F00CF806D3022202
+2100F0AFFC00F005F801D2002000E0012045E251EC100B
+0022002317F4E4B438B5044604F10C05002028726872A8
+72204608F027F900202860686004F55560DFF8B81B0160
+00220021416004F69450002300252EC004F65850BDE834
+40382118F49AB52DE9F84F2DED0E8B0C46ECB0206BDFF8
+881B8842154600F0678105F110009AF43DF0A0B904F14C
+004EC84EC5606B19F4EFF6CDE90801103D00F072F900F0
+6EF900F066F900F076F900F06EF922E105F19800B7EE00
+0A90ED019AD0ED029AD0ED060A216BD4ED0EBA94ED0D8A
+D5ED26AA94ED0FCA94ED1ABA94ED1BAAC0EE20CAD0ED07
+0A006A80EE20DA401A00EE100AB8EE400AF19403300B81
+00DFED970A60EE20DA2BEE89EAB0EE4E0A08EE2A0A00F0
+2EF9CDE92C0128EE090A0BEEA90A00F026F9CDE92A012B
+EEAA0A9FED8C8B0CEE090A8DED288B8DED268B00F018F9
+CDE924010CEE29EA1EEE100A19F494F6CDE922016DEE8B
+BA2BEEAA0A8DED208B8DED1E8B00F004F9CDE91C012BEE
+890A00F0FEF8CDE91A012BEE2C0A00F0F8F8CDE918016D
+EE8AAA2AEE890A8DED168B00F0EEF8CDE914012AEEA90A
+00F0E8F8CDE912012AEE0D0A8DED108B00F0E0F8CDE90E
+0128AB0EA80C902AAA10A80B902CA912A80A90002614A8
+099016A8089018A807901AA806901CA805901EA8049020
+A8039022A8029024A8019026A800904AA87BF4A3F306F1
+010B012200F0B4F88146022200F0B0F88046032200F0AC
+F88246042200F0A8F8074604EB8600C06C19F42AF6CDE9
+0001286819F425F602460B46D9E9000117F4F5F3DDE900
+2317F4C3F4CDE90001686819F416F602460B46D8E90001
+17F4E6F3DDE9002317F4B4F48046A868894619F407F6DA
+E9002317F4D9F342464B4617F4A7F48046E868894619F4
+FAF5D7E9002317F4CCF342464B4617F49AF419F4A8F502
+A941F826005E46042EA8DB02A84EC84EC5022202214AA8
+08F03AF8103D05F1A40106A808F054F806A905F110007B
+F431F528A87BF482F205F110024AA97BF431F44AAB0122
+28A905F110007BF46EF404F1340106A808F03BF806A905
+F110007BF4E6F405F11000FFF722FE70B9606B19F4B6F5
+CDE9080100F03AF800F036F800F02EF800F03EF800F036
+F8206B05F19801086204F1400105F1A40008F03AF805F1
+9800216E8161616EC16104F1400005F1980108F034F86C
+B0BDEC0E8BBDE8F18F00006F12833A0000000000000000
+59464AA87FF4A8B710EE100A19F480B5CDE90401E06B19
+F47BB50000CDE90601A06B19F475B500000146842205F1
+100018F432B4CDE9020104AB02A8009006AA08A90AA87B
+F460B270B50C462DED068BD4E9060115461E4619F412F5
+08EE100AD4E9080119F40CF508EE900A7DB195ED020AD4
+ED150A30EE600A30EE088A95ED030AD4ED160A30EE600A
+70EE288A28EE080A08EEA80A06F11C0529F497F385ED00
+0A94ED1A9AD4ED1B9A39EE290A29F48DF3F0EE000A85ED
+010A60EE200AB6EE000A26F461F2D5ED000A00F083F84C
+BF012000206876687E58B3F0EE480AB0EE680A29F43DF3
+B5EE400AF1EE10FA44BFDFED5E0A30EE200A9FED5DAA20
+EE0A0A85ED020A29EEA80A20EE280A69EE080A00EE880A
+29F45AF3D5ED000A60EEA00A80EE200AF19403C00E8100
+60EE0A0A9FEDD80A26F4E6F102E0A8609FEDD60A85ED03
+0ABDEC068B70BD00002DE9F043154687B006466869DFF8
+44970C4619F4DBF441EC120B95ED021B95ED000B684606
+F638587FF4FAF606F5556605F13407316849450DD10020
+70600020B87069467068E862346040467EF484F207B0BD
+E8F0833978B9B195ED070ADFEDBC0A00F015F810DB0146
+40467DF450F400F00AF900EE100AD6ED010A30EE200A86
+ED010A30684845D9D03878D8E70000B4EE600AF1EE10FA
+7047000030B5044604F68C50CFB000210170007E002839
+D0204607F04BFFA8B31EA807F04FFF02A807F05CFF1D25
+2946204607F08BFF014602A807F0A3FF1EAA02A92046FF
+F76EFD6D1E6DB2002DEED522A899F4B5F500281EBF0E98
+DFF85C16884213D004F658552B461EAA02A92046FFF7FC
+FE009522AB1EAA02A9204600F01DF90E992A462046FFF7
+6EFF4FB030BDDB0FC940E12E65422DE9F0412DED088B04
+468AB094F8A40D00280D46B0EE409A164600F09480002E
+00F08E8000F0B0F900F096F809EE900A022200F0AAF900
+F08FF80AEE100AB1EE691AF0EE4A0AB0EE690A684607F0
+7CFF0322032100F07DF80646032200F078F80746012200
+F074F88046D6E9000119F4CDF301EE100AD7E90001B0EE
+418A19F4C5F300EE900AD8E9000100F0F7FA00F017FB06
+A807F058FF0246694603A807F05BFF01466A46204607F0
+5CFF0222022100F04FF80C3400F0E9FA08EE100A042202
+2100F046F800F0E1FA0AEE900A0422042100F03EF800F0
+D9FA08EE900A00F0C9FAB0EE40BA00F0C1FAF0EE000A6A
+EEA00A60EE890A60EE8A0A60EEA9AA68EE0B0A68EE80BA
+30EEEABAB0EE4A0A26F45FF10BEE80BA84ED00BAB0EE4A
+0A26F457F1B0EE40AA00F0A1FA48EE0AAA28EE808A00F0
+9FFA48EE00AAC4ED01AA02E0FE2100F00DF80AB0BDEC08
+8BBDE8F0810121284699F4DCB451EC100B19F456B30FF2
+4860EFF794BA2DE9F0438046CFB098F8A40D894618B140
+4607F033FF20B14046FFF761FC002042E01EA807F04EFE
+02A807F05BFE404607F02CFF471E00267CB22FE0214640
+4607F084FE014602A807F09CFE1EAA02A94046FFF767FC
+22A899F4B2F400281EBF0E98DFF85814884217D0382000
+FB0490A0F138052B46324602A94046FFF7F6FD009522AB
+324602A9404600F017F80E992A464046FFF768FE1EAE64
+1E012CCDDA4046FFF71DFCB8B24FB0BDE8F08300000000
+344300000000CECCCC3DF8B52DED068B9EB004460D4617
+461E4668468EF4ADF6002F30D09FEDF194035012810043
+2B286D00F02CFA9FED42AB00F092F800F0F6F9E86C00F0
+29FA00F08BF800F07DF818A87CF428F7024629460CA87D
+F445F6786819F412F341EC110B386800F009FA00F06BF8
+12A87CF416F702460CA906A87DF433F606A968467EF4C5
+F002E029467EF4C1F000F06FF800F067F8022100F06CF8
+53EC182B51EC100B17F496F119F4A4F204F6385400EE10
+0A29F444F12A9E286BD3493063B0EE408A012086F83400
+A06988421CD096ED070ADFEDCA0AFFF736FE15D5694620
+467DF443F251EC100B0022C94B17F483F00AD294ED000B
+86ED000B94ED020B86ED020BD4E9040109E09DED000B86
+ED000B9DED020B86ED020BDDE9040119F469F2706186ED
+048AE86DB0611EB0BDEC068BF1BD000000000000000000
+0000000000F0BF41EC100BB0EE492AF0EE692AB0EE481A
+F0EE681A7047000053EC1A2B17F466B0B0EE408AF0EE60
+8A0222704701220121304699F4CFB300002DE9F84F2DED
+0C8BB8B004464F9F894690469B461FB94FF4A671FFF7D7
+FE04F69455287C002820D0DFF864A2D14503D1684607F0
+41FD1CE1204607F009FEA8B9204607F00DFE461E00E076
+1E36B2002E0CD43146204607F063FD006B5045F4D04845
+F2D32046FFF725FB06E19FED8B2B686800F04BF900F019
+F9286800F04CF900F01CF901463A4616A87DF431F79FED
+831BA86800F034F900F010F901463A4610A87DF425F7DD
+E9160119F4E5F1099009ADDDE9180119F4DFF16860DDE9
+100119F4DAF1A860DDE9120119F4D5F1E8600122012138
+4699F461F3FFF773FE09EE100A02220121384699F458F3
+FFF76AFE09EE900AB1EE491AF0EE690AB0EE490A06A807
+F057FD4E9F0322032100F0CBF80646032200F0C6F80546
+012200F0C2F88246D6E9000119F4A7F101EE100AD5E900
+01B0EE418A19F49FF100EE900ADAE9000100F0D1F800F0
+F1F80DA807F032FD024606A9684607F035FD014606AA03
+A807F030FD0222022100F09DF800F0C4F808EE100A0422
+022100F095F800F0BCF80BEE900A0422042100F08DF800
+F0B4F808EE900A9BED000B9BED02AB53EC102B51EC100B
+16F486F705460E4653EC1A2B51EC1A0B16F47EF72A4633
+4617F44CF019F45AF100EE100A28F4FCF7F0EE40DA00F0
+82F8B0EE40AAB0EE6D0A25F42EF7F0EE40AA00F07CF8B0
+EE40BA00F078F8B0EE40CAB0EE6D0A25F420F7F0EE40CA
+00F06AF8B0EE40DA0522052100F04BF809A90291B0EE00
+0A03A9009101942BEE800A4168006820EE2D0A20EE290A
+20EE099A19F421F1F0EE490A48EEF19403E01581000C0A
+28EEAC0A40EE0D0A04F10C0728EE0A0A02EE100A30EE49
+0A68EEAA2AD7ED011A97ED001A02EE8B0A5B4642464946
+1CA807F0F9FC0146204600F0A3F838B0BDEC0C8BBDE8F1
+8FCDCCCC3D0000F03F8EEDB5A0FF2292FFF7C6B03E0000
+594000000000000000000121384699F468B241EC110BB0
+EE482AF0EE682A7047000041EC100BB0EE492AF0EE692A
+B0EE481AF0EE681A684699F4D5B20000B0EE490A25F4AE
+B6B0EE690A25F4AAB6B0EE481AB0EE608AF0EE418A19F4
+C0B04168006819F4BCB0B0EE418AF0EE618A19F4FEB0B0
+EE428AF0EE628A19F4F8B0B0EE418AF0EE618AB0EE429A
+F0EE629A19F4EEB000EE100AB0EE681AF0EE480A704700
+0070B500F694550C46287C002831D0012100F034F80646
+286819F4D8F000F02AF819F48CF02860032100F028F806
+46686819F4CCF000F01EF819F480F06860022100F01CF8
+0646A86819F4C0F000F012F819F474F0A860042100F010
+F80446E86819F4B4F0D4E9002316F458F719F466F0E860
+70BDD6E9002316F450B720467FF4A1B2000070B504460E
+4694F8A40DB8B1204607F05BFB04F11405002895F90100
+314606D000F014F800F00CF86878287070BD00F00DF800
+F005F8A878401CA87070BD000004F11501204607F06DBC
+0000702210FB0240183007F0A0BB70617463685F676C70
+655F6E6176737466696C7465722E637070000070B50446
+0D461646284604F65851382217F424F7296BD4F8900D32
+46BDE8704084F464B430B58BB004460D4668460FF25801
+282217F412F7284622F41DF330B1032812D0042809D005
+280ED00FE02878001990F8030E032809D106E029786846
+081810F8510C032801D1012000E000200BB030BD80B5A2
+F449F3042816BF03280120002002BD0000020202020203
+0303030303030303020202030303030303030303030303
+030303030303030300000010B5044604F5995049F4D2F4
+41F21C310020085510BD000040684968401A0128ACBF4F
+F0FF30C00F704700002DE9F04FADF2844D044689461546
+984600264FF00C0B6CA80BFB060007F0E2FB761C3C2EF7
+DB05A825F41CF4079840F04A0007904FF0000A4EA89CF4
+39F430A89CF436F403464EA800900022216808A87EF4B2
+F508A89CF4CDF7002708AEF9B230A89CF45DF5A9F427F5
+50B1F9B24EA89CF456F5A9F420F500F0010080F0010000
+E00120B8557F1C072FE8DB206885F445F1D8F447F110F0
+480018BF01208DF80C0049460AA826F447F0DDF8A89411
+E06CA90BFB0A119DF810200A70F194037019810048600F
+720AF101005FFA80FA02A872F411F50AA826F440F00AA8
+26F43FF0002847D1BAF13C0F44DA0AA904A826F42CF020
+689BF463F7014604AA02A89BF428F520680DF1090302AA
+04A98CF433F60028DCD020689BF460F79DF809209DF808
+1000239CF4BDF20028D0D0CDF8048000954B46206805AA
+04A9FEF7E6FB25F498F69DF808109DF80C20895D002711
+4308BF10F15A0F0AD1CDF800802B4620684A4602A9FEF7
+9BFC25F483F601270528A1DAACE7BAF1020F06DBDFF808
+350C2251466CA899F4A1F090342046FFF725FF002508E0
+6CA80BFB0501087A10B92046D3F4BDF16D1C5545F4DB00
+2508E06CA80BFB0501087A10B12046D3F4B0F16D1C5545
+F4DB30A89CF418F74EA89CF415F70DF2844DBDE8F08F00
+002DE9F84F2DED0E8BCAB00446ADF5805D20680D467AF4
+DAF29BF4E0F604F50451064610310020088104F5045010
+304660287D00F001072868B6F402F62868B8F41BF400F0
+4BFA4FF09442DFF8383416F409F741EC180B29462046D3
+F423F201202074287DC00627D42868B8F49FF7DFED0A0A
+00F01FFA00D40FB1012020742868B8F494F7DFED050A00
+F014FA08DB3FB900202074EEE100BF010048420100C843
+207C0028F6D051EC180BDFF8DC23DFF8DC3316F44DF4ED
+D92868B8F49DF700F00DFA41EC100B28F4DBF400F0FFF9
+00F0F7F941EC1D0B2868B8F48EF700F0FEF941EC100B28
+F4F6F400F0F0F900F0E8F941EC1C0B2868B8F4BFF300F0
+EFF941EC180B2868B8F4ACF325F426F4B0EE409A53EC18
+2B51EC180B16F45AF40746894619EE100A18F47EF63A46
+4B4616F422F541EC100B28F4D2F453EC102BD448D54916
+F446F441EC1B0B287D80074CBF9FEDD29B9FEDD39B0027
+FCA8482101FB0700DAF41CF67F1C2F2FF6DB2868B8F474
+F300F0B4F941EC180B2868B8F417F7002700F0ACF90022
+C84B16F406F441EC1A0B12D253EC1A2B00204FF0804116
+F418F441EC110BB0EE480AF0EE680A25F438F3B0EE408A
+F0EE608A0AA879F481F32868B6F440F501460AA87DF4F2
+F30AA968467CF43EF2694610A87DF4BAF42868B8F4E1F6
+81462868B6F481F22868B0EE40EAF0EE60EAB6F424F580
+46A6EB090000EE100AB8EE400ADFEDAA0A80EE200A00F0
+65F902460B46D8E9000116F4D9F353EC1E2B16F4A7F4CD
+E9160120687AF4CEF1014608AB06AA684682F4CAF59DED
+060B25F4E6F316F436F541EC100B25F464F68DED180B00
+97002321680022DEA87EF4C1F304F11802DEA9C0A89CF4
+01F3C0AADEA9A2A89CF4CAF2F19403001D8100DEA904F1
+18009CF47BF2A2A89CF46AF200B96082608A401E608200
+B2012808DA3C20608200960AAB696810AA2046FFF7C1FD
+A0680FF2342AD7F474F0804604F59851B0317CA825F451
+F604F1900912E05846DAF4BFF558B9594634A8DAF4C0F5
+FCA8482234A917FB0200D2F417F57F1C7CA825F449F67C
+A825F448F6002840F096807CA903A825F437F66AA87EF4
+C4F7002102910AAB69690090C90801F0010101913246A0
+6803A978F484F7C8B120689BF45CF5014603AA68469BF4
+21F320686AAB32466946FEF7B1FA38B903A94846D2F4D0
+F7684672F4E5F2C9E7684672F4E1F203A94846D2F4A3F7
+5FEA000B04D140F20F115046EEF753FC03A940467FF44B
+F158B103A940467AF40CF0816805914068049004A80290
+05A800E002900190B0EE495A6AA80090F0EE695A2168B0
+EE4B4AF0EE6B4AB0EE483AF0EE683AB0EE4A2AF0EE6A2A
+B0EE4C1AF0EE6C1AB0EE4D0AF0EE6D0A0AAB32465846D2
+F434F5594658A8DAF43CF59DED620AFEEE000A00F064F8
+16D4594646A8DAF431F59DED460BD2F4CDF700287FF462
+AF594622A8DAF426F59DF8B400012803D1206803A97EF4
+BCF203A94846D2F464F760E73FB217B90020608218E028
+68B8F4BFF504F5045010300025078104F5045010304660
+42F2101248206843FCA9125941188018D2F45CF46D1C2F
+2DF2DBA2A89CF4DCF4C0A89CF4D9F4DEA89CF4D6F44AB0
+0DF5805DBDEC0E8BBDE8F18F000078DEB141010000E08E
+79453EE6ABFF8564AF0A40000000000000594000000000
+0000244000007940A118810000007A44B4EE600AF1EE10
+FA7047000051EC100B53EC182B16F482B22868B0EE408A
+F0EE608AB8F46DB5000010EE100A18F4A0B47061746368
+5F676C70655F6E61766169642E63707000000010B50446
+24F42AF3DFF84C0D007818B1A06820F48050A060204610
+BD2DE9FE4F2DED108B0446ADF53A7D206F40689DF83013
+07903022CA9812FB010808F12C00049020A87EF4A6F6E1
+6E096A0090CA0902F00102029201F00101019104F10803
+D8F814200499204678F462F6002840F0DF8498A87AF406
+F176A87AF403F10020069005909FEDD59B206F41690029
+14BF012700270169002914BF01250025E16E0A7D002A16
+BF012A4FF001094FF000098068002814BF4FF0010A4FF0
+000A9DF85803B0EE49AAF0EE69AA04F5826670B191F820
+0080060AD5306807687F6A002304F1200220A9B84700F0
+BEFE92E0012A07D0F0687FF40AF000F0010080F0010B01
+E04FF0000BE06E07211830F194039020810024F472F600
+EA0B0B049904F5BC707EF4FBF7E8B1BAF1000F14BF76A9
+0021B9F1000F14BF98AA00223068019100230393029300
+9200F0EAFC049900F08FFE04F5BC7079F4A7F681680691
+406805902EE05BEA05004BEA070714BF05A90021002F14
+BF06AA0022BAF1000F14BF76AB0023B9F1000F14BF98AF
+00273068009703910292019300F0C2FCBBF1000F00F066
+FE0DD09DED050AB5EE400AF1EE10FA06DD0499DDED060A
+04F5BC7079F439F6E06E007D002818BF012826D126A87E
+F4A8F700F086FCCDE9000128A87EF4A1F700F07FFCCDE9
+02012AA87EF49AF700F078FCCDE9080108AB02AA694654
+A87AF47AF0014698AB012232A87AF4B0F2012201217EF4
+B0F590ED00AB206F016931B194F8742001EB8201059A41
+F8042C416931B194F8742001EB8201069A41F8042C8069
+48B194F87430882717FB0300842276A9883817F41FF203
+A852F41CF10246049970687EF461F750B1E06E016AC904
+0AD52368027D04991B6A2046984718B900F081FD0220D6
+E39DF80C10B06808AA81F4CBF3DFF8600DDFF8601DCDE9
+00010022694608A87CF4C0F7DDE92C239FED4ECB8DED08
+0B51EC1C0B16F40EF141EC1B0B98F82E0050B904990022
+204600F0D4FD51EC100B00F052FD41EC1B0B049858F483
+F4032830D100200090706884F4B0F4694685F4F9F038B3
+9DED000AB1EE400A00F038FDDFF8F42CDFF8F43C16F4E4
+F0CDE90801706879F4DDF685F4E9F3012812D1706879F4
+D6F681F430F360B1706879F4D0F681F468F3DDE9080153
+EC102B16F454F2CDE90801DDE9082351EC1C0B16F4C2F0
+41EC1C0B04993069002285F4F3F400F007FD41EC1D0B08
+F12C0024F49FF7012806DB98F82E0018B1B0EE49DAF0EE
+69DA00F092FB0746D4E90E0153EC182B16F473F153EC1C
+2B16F46FF153EC1B2B16F423F253EC1D2B16F467F1C7E9
+00019DF85803002849D0E06E90F82000012740062FD59D
+F80C0052F499F00546082D0DD1ED210FF62C40EEF7A1F9
+0BE000000000000000000000004A78DEB141002D18BF03
+2D05D004980078562803DB762801DA14270EE0062D08BF
+04270AD0022D08BF0A2706D0012D03D0512802DB562800
+DA02270499F068002286F460F30546CA989DF830130190
+3A460798009094F87430CB9879F447F5C5F8D8000521E0
+6E183024F4D0F4002800F0E8828DED109BB0EE498AE06E
+017D0129F0EE698A00F07AFC00F09E80006AC00540F19A
+8012A886F473F5029004F1080305A8019003A906A80090
+2046D8F8142078F494F4F1940320248100694612A886F4
+7CF520B1DDE900239DED008B1CE00EA912A886F47CF520
+B1DDE90E239DED0E8B12E00AA912A886F47CF520B1DDE9
+0A239DED0A8B08E00CA912A886F47CF548B1DDE90C239D
+ED0C8B0020002116F4C3F041EC1B0B9DF80C00022810D1
+049BDFF8FC2C93F900303B3B5BB202EBC30251EC1B0BD3
+6B926B15F4DCF741EC1B0B00F0D4FA02280BD000F0D0FA
+052807D000F0CCFA0C2803D000F0C8FA082804D153EC1B
+2BDFF8F40C16E0049824F4AEF6012817D1049858F445F3
+20B953EC1B2BDFF8D00C08E0049858F43CF3042809D053
+EC1B2BDFF8C00C4168006815F4AAF741EC1B0B08F12C00
+24F490F6012804DB98F82E0008B100F0E5FB10A912A886
+F425F528B1DDE9100100F0E6FB41EC1B0B049AD8F81410
+9DED100BB0EE481AF0EE681A204678F4A2F5206F94F874
+1000687EF4BEF30746D8F81C0016F4EDF0DFF8242CDFF8
+243C15F475F7D8E9002316F443F0C7E9000100F057FA07
+4651EC1B0BD7E9002316F438F0C7E900019FEDD1DB206F
+8768002F5DD0E06E007D03281AD100F062FA00F072FA00
+F064FA0546022200F06EFA072200F05EFA052200F028FA
+0746032200F064FA4168006881F00041C7E900013EE000
+281AD100F045FA00F055FA00F047FA0546022200F051FA
+052200F041FA072200F00BFA0546032200F047FA416800
+6881F00041C5E9000119E001281FD100F028FA05460122
+00F01AFA022200F028FA0546022200F013FA00F021FA05
+46032200F00DFA042200F01BFA80ED00DB082294F87410
+38467EF438F380ED00AB206FD0F80C90B9F1000F00F0A4
+81E06E007D012809D100F0E3F9044698ED020B53EC102B
+51EC100B91E1F0680023002208F12C0186F46AF10546E0
+6E006AC106B0EE49AAF0EE69AA00F022FB9FEDD5FB9FED
+D6CB9FEDD18B2FD59FEDD6BB000548BFF0EE68BA059818
+F4F4F053EC1B2B15F4AAF641EC1E0B1CD251EC1B0B53EC
+1E2B16F447F041EC120BB0EE42DAF0EE62DA53EC1B2B51
+EC1C0B15F483F741EC110BB0EE4D2AF0EE6D2A9FEDAF0B
+86F43DF475E0F0EE6DBA76E0010741BF9DED050ADFEDAB
+0AB4EE600AF1EE10FA2ED5F1EE040AB4EE600AF1EE10FA
+48BF9FEDA5AB61D4059818F4B5F041EC1E0B53EC1E2B51
+EC1C0B15F455F70022DFF8383A15F47EF602460B460020
+DFF8381A16F401F041EC100B53EC102B15F471F60022DF
+F8183A15F46CF641EC1A0B3CE000043AD5F7EE000A9DED
+050A24F4C7F58DED050A9FED8E0B27F4DDF60598B0EE40
+CAF0EE60CA18F47EF0F19403B027810053EC1F2B15F450
+F641EC100B27F4CEF60020DFF8D41953EC102B16F48FF0
+41EC110BB0EE41BAF0EE61BA0020DFF8B81953EC1C2B16
+F482F041EC100BB0EE4B1AF0EE6B1A24F458F5B0EE40BA
+F0EE60BA2668D8F814200499F66800232046B047B0EE40
+CA08F12C0057F46EF218B1B2EE040A3CEE00CA0026002D
+73D000F0FAF802280BD000F0F6F8052807D000F0F2F804
+2803D000F0EEF8082801D1012700E000279DED051ADFED
+611AB4EE611A9FED63DBF0EE6D0AF1EE10FAB0EE4D0AA8
+BFF0EE690A1ADADFED5A1AB4EE611AF1EE10FA13DB0598
+18F411F053EC1F2B15F4E3F541EC100B27F469F653EC10
+2B0020DFF8F81816F422F041EC100B95F85400032818BF
+00289FED4B9B11D19FED4B1B24F4F2F4E06E006A000517
+D5B0EE4D0AF0EE6D0A12E000BF000000000000F03F0228
+17D19FED431B24F4DEF4E06E006A000544BFB0EE480AF0
+EE680A2FB153EC102B00F05FFB41EC100B00F09BF815F4
+E9F6064600F090F8074698ED020B00F091F805462CEE0C
+0A8B4600F0E3F92A465B4615F463F605468B46304615F4
+FEF62A465B4615F45AF60022002315F456F6C7E90001E0
+6E006AC1061DD4010709D500F06AF8044651EC1A0BD4E9
+002315F445F61AE041050DD500F05EF8054600F05BF89F
+EDD71B90ED000B24F48DF485ED000B0CE000040AD500F0
+4EF8044651EC1B0BD4E9002315F457F5C4E9000100F0A9
+F900200DF53A7DBDEC108BBDE8FE8F0000000000000000
+01007041000000000088A34061732D3852C1D03F0100AA
+42010020429A9999999999B93F0000000000004E400000
+000000003E40349D52A246DF913F00000000000014C000
+0000000000344080ED00DB384694F874107EF451B10000
+05F1500021F4A2B494F8741007987EF44FB1000094F874
+1048467EF449B1000053EC102B51EC100B15F404B50498
+21F48DB40000012198A87EF44AB151EC100B81F0004170
+47000094F87410012238467EF426B103224168006881F0
+0041C5E9000194F8741038467EF41AB105460122012176
+A87EF42CB104F108030768BF6A04F1200220A938472DE9
+F04104462DED088B04F58267C2B0164638690D46012285
+F400F100F014F941EC180B30A87EF421F1002102910090
+0121019104F1080332462946204678F4E3F010B100F0A8
+FAE9E00590049004F5BC78294640467EF4C9F240B12946
+404679F48AF1816805914068049011E0386804A9039104
+F1080305A9029104F1200200210191009130A9D0F800C0
+DCF828C0E0479FEDF19403402B8100659B8DED069B1EA8
+7EF4EAF200F034FA7EF424F48046786879F47CF21EAA41
+46FCF7CEFE00211EA87EF43CF3DFF80404DFF804148DED
+060BCDE900010022694606A87CF411F38DED060BDDE906
+234FF09440DFF80C1615F45FF441EC1A0B8DED0E9B03A8
+51F436F40246786829467EF47BF200F099F820B900F0A4
+F89FED450B83E010A886F492F1029004F1080304A80190
+324605A8009003A9204678F4B4F08DED0C9B8DED0A9B8D
+ED089B8DED009B694610A886F494F110B1DDE9002316E0
+0CA910A886F496F110B1DDE90C230EE008A910A886F498
+F110B1DDE9082306E00AA910A886F49AF138B1DDE90A23
+0020002115F4E3F441EC1B0B00F0B9F90128284610D157
+F490F720B953EC1B2BDFF8680510E000F0B0F9042812D0
+53EC1B2BDFF8580507E024F4E3F2022809D153EC1B2BDF
+F84C054168006815F4EDF341EC1B0B0EA910A886F473F1
+28B1DDE90E0100F034F841EC1B0B00222946204600F0AB
+F8B0EE409AF0EE609A00F02BF853EC182B51EC1A0B15F4
+A1F400F01FF853EC192B15F453F541EC100B42B0BDEC08
+8BBDE8F0810000000000000000A0CB9100000000000000
+5940B0EE49BAF0EE69BA7047000010EE100A17F4D8B553
+EC1B2B15F47CB403A871F44DB300002DE9F8432DED028B
+89468AB000F068F890461E460446484641F4AEF7002504
+F5826760B10122494605A824F477F2F86886F418F205A9
+54F431F300B101252A46494601A824F46AF2F86886F40B
+F201A986F40AF278BBF868002201A985F46AF6054686F4
+0DF230B3284686F411F210B3D5F8D80098ED0C2B95ED08
+1B06AA08A900F05AF979F412F102A824F4BFF1049840F0
+02000490397D11B940F04000049002AB38689DED060B00
+9608AA07683F694946B84708B902200DE0324600F03CF9
+494604F17C0078F43FF7D4F88400401CC4F8840000200A
+B0BDEC028BBDE8F283B0EE408AF0EE608A7047000070B5
+04460D4616462DED068B00F0CCF89FED8C9BC0B900F0D3
+F8A8B900F0CCF890B92EB14FF46C710FF26010EDF73CFC
+00F0BEF800F0DAF817F43CF50022002315F4E0F341EC19
+0B284657F48DF69FEDCD8B60B100F0CEF800F0BCF841EC
+190BD24800F0B1F800F0BBF841EC190B28464FF41CF2A8
+B100F09FF8012811DB00F0B9F800F0A7F841EC190B00F0
+95F801280CBFCC48CC4800F097F800F0A1F841EC190B00
+F081F800282ED1284656F428F7002829D000F080F80128
+25DB00F09AF800F088F841EC1A0B00F076F802281BD100
+222946204600F0F19403D02E810091F800F087F817F4E9
+F402460B4651EC1A0B15F443F441EC190B4EB100F05CF8
+00F078F817F4DAF400F06EF841EC190B284621F435F201
+2812D100F06FF800F05DF841EC180BA848D0E9002300F0
+58F802460B4651EC180B15F420F441EC190B00F036F8B8
+B900F03FF818B100F03CF8032810D1284621F413F20228
+0BD100F02BF800F047F817F4A9F453EC192B15F44DF341
+EC190BB0EE490AF0EE690ABDEC068B70BDFCA9F1D24D62
+503F95D626E80B2E113E70617463685F676C70655F636F
+6D707574657A72682E637070000000D4F81404A5F45AB7
+3246294620464FE0284624F43DB10000284657F4D5B500
+00D0E9002351EC190B15F446B253EC102B51EC180B15F4
+40B202460B4651EC190B15F4C4B351EC100B17F418B429
+46204677F462B7F8B50C46154620462DED028B57F4B2F5
+06462778204624F411F1042E08BF02289FED098B0BD155
+B90FF2A81000EB8700A0F5A270006817F43FF441EC180B
+00F007F8BDEC028BF1BD0000000000000000B0EE480AF0
+EE680A704700002DE9F0412DED068B80460E46A2B01746
+304657F481F505463478304624F4E0F09FED4D8B9FED41
+9B9FED4DAB35B1032D31D0042D64D0052D45D06FE098B9
+D8F81814012204A881F479F004A968467EF403F468468B
+F494F540F2BD7188425DDB0FF2A81007E002280AD117B1
+0FF2D82001E00FF2182000EB840050F8040C49E0304621
+F44DF1012848D13146404677F4EBF6354A23E002280AD1
+17B10FF2283001E00FF2682000EB8400A0F5847030E030
+4621F435F1012830D13146404677F4D3F6294A0BE00128
+28DB3146404603D177F4CAF6254A02E077F4C6F6244A53
+681268FFF75BFE51EC1A0B15F417F353EC182B15F489F1
+53EC192B15F485F10BE002280BD157B10FF2FC2000EB84
+00A0F5A270006817F4A2F341EC180B22B0FFF769FFBDEC
+068BBDE8F08100BF0000004A78DEB141B09C0800B6F3FD
+D4414C124100001440000010400000F03F0000494078DE
+B141989C08000000000000000000000000000000F03FA8
+9C0800A09C0800209D0800002243E70000000000000000
+000000000000000000000000FAED77C09E5E89C052B88C
+C05E4BE8BEB7D120C0143F5EC02B876AC0ACAD9AC08D28
+B7C00000000000000000000000000000000074B575BF52
+49A5BF0AD763BF3411E6BF5249A5BF21B0B2BF1361A1C0
+1361A1C0A2B49FC089D2A0C0560EA3C094F6A6C0000000
+00083D1BC090A010415F079EC052B88CC0CA32D4BFAA60
+4CC0F46CD6BDF1940360328100000000004DF38E3DA69B
+44BE62A1563DA69BC43DA60A06BEE3A5BBBE21B0B2BE21
+B032BE00000000A69BC4BD00000000000000004DF30E3D
+0000000058CAB2BD000000000000000000000000000000
+000000000000000000FE437ABD645D1CBF7AC7A9BE0AD7
+E3BE00000000F5DB17BEFA7E0ABF62A1D63C4DF38E3DDC
+46FB3F000000006DC5963F00000000000000002041F13E
+000000003E79E03FC286A73F371A584000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000093
+3A713FA69B443E8A8EC43FE3A5EB3F0000000000000000
+93A9823F0000000021B0324058A8153F423E083F85EBD1
+3E000000000000000000000000AC1C9A3F000000000000
+0000000000000000000000000000000000000000000000
+00000042CFF63F00000000E10B233F0000000000000000
+B7D1A03E0000000010E9C73FE86A933FED0D4E40000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+00000024B90C3FC7297ABE8A8EC43FB37B0A4000000000
+000000007FD93D3F00000000764F2A40371A403F378901
+3FF46C563E000000000000000000000000D7A3A83F0000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+000000008A8E44BF8A8E44BF6C0949BF8A8E44BF6C0949
+BF371A40BF371A40BF569F3BBF569F3BBF000000000000
+000000000000000000008A8E44BF8A8E44BF7E8C81BF6C
+0949BF8A8E44BF371A40BF6C0949BF6C0949BF8A8E44BF
+6C0949BF6C0949BF8A8E44BF000000008A8E44BF371A40
+BFBF7D4DBF8A8E44BF8A8E44BF8A8E44BFF0EEC00AB2EE
+0E1AF4EE410AF1EE10FA09D5D0ED040A30EE800A80ED04
+0A80ED070A80ED0A0A704700F59C7005F0C6BD10B50446
+00202060A0619FED060B84ED020B84ED040B04F11C0020
+F4D3F5204610BD00BF000000000000000038B504460D46
+33F4D7F6002802BF94F9010095F90110884214BF012000
+2032BD0978027891428041C043C00F7047000009B93F21
+0FE0022908BF04210BD0032908BF102107D0042908BF01
+2103D005290CBF1F21FF2140780140481E8041C00F7047
+0A2200211CF43DB5000010B5044605F080FD1E23702208
+4904F118001CF47FF504F638508CF4EBF40020C4F8900D
+2046FDF73FFA204610BD00BF5D8E810080B5CCF493F508
+B1002002BDF19403F03581000021CCF461F70168896A88
+4741F690310858C00B00F0010002BD00002DE9F0410446
+82B0A06800280F4657D0F98810F1010F18BF002951D105
+290CBF0121002104F50450D030D6F423F1F888A06004F5
+C85555F8B80F0268F988526A9047F88804F5D85101F1F8
+08C0B928680268D26F0021904728680268926A00219047
+98F8000028B1A86810B30168C96E88471EE028680268D2
+6A0921904718E00A2801461DD128680268D26F90472868
+0268926A0A21904798F8000000281CBFA868002802D001
+68C96E8847012088F8010005222368D3F86C3100212046
+9847AAE0D4F804C0604550D00B2807D1C4F808C000231F
+FA8CF21FFA8CF14AE004F598566C3603284BD00CD30528
+00F08A8008D2BCF1010F18BFBCF1030F03D0BCF1050F2A
+D085E000208DF80000ADF802006A4628680368D3F88C30
+0DF1020198479DF8000020B99F210FF2E830ECF7B2FF21
+68D1F8041120468847A86810B10168496E884720F4BAF4
+344B0FF2E832042124F4BCF3002030835EE000203083A8
+6820B10268126F04F16C0190476068FA88002381B22046
+2468D4F83041A0474BE0BCF1040F45D1B0686862B08928
+84288FD0B1D8F808003168814215D3081AE96B4118E963
+05E01E4A5118E963298F491C2987E96B1B4A9142F5D264
+22296C5043801F4018286402E00020E863288704F5C850
+9030DDF4FEF1A86820B10168C96E8847A868C0B96068FA
+8881B220462468D4F830410023A04728680268D26A0F21
+904709E0BCF1040F03D12046D7F4E6F7ACE74FF0FF30A0
+60BDE8F38184F59100007CF3DB00840C242DE9F8430446
+88466068042818BF05283AD104F5985608F11005002786
+360FF2CC2906E04FF49E7100F018F9688845197F1CB8F8
+0E00874226D2288844F20401401A02D0401E11D0ECE701
+20307004F50450A97BD030F3F705FA30780028E5D104F5
+04501C30DCF493F7DFE72879012818BF00207070707800
+28D7D0E98800222046D7F4C5F2D1E7BDE8F1832DE9F04F
+044687B0606800288A4600F0DC8004F5D85604F5D8570A
+F108054FF0000B361D50374FF47A780FF2342904E0B884
+688845190BF1010BBAF80600834580F0C3802888401F0D
+D00A3866D047F6F271401A7BD0801E00F09580C01E04BF
+68683864E5E7E88920B94FF4B27100F0AFF806E0708004
+F50450E989D030F3F719F9A88908B10B2804DB4FF4B771
+00F09FF800E03080A888642804DA40F2771100F096F811
+E0414690FBF1F108FB110018B140F27D1100F08BF8A888
+B080E888F1940380398100F080287A7072687A30726068
+052818BF0428AED1684633F41DF5297A8DF80410697A8D
+F80510B188ADF80010F188ADF80210EA88718891429BD3
+717A00291FBFADF8008004F5CE510A68002A91D0014610
+461268D2F8942090478AE7A88800281CBF012802280DD1
+3880E88878802889B88041F6F830005D002802D0204605
+F003FD76E74FF4D77100F042F871E7A96804F5C850D030
+DCF443F0A98804F5C850D030DCF43FF020F44FF304F5CE
+51C96A26F422F620F448F304F5CE51896AC9B226F40EF6
+55E7A88800281CBF0128022804D04FF4E77100F01BF800
+E03884E88800281CBF0128022804D040F2D91100F00FF8
+00E07884288900281CBF012802283FF436AF4FF4F271BE
+E707B0BDE8F08F4846ECF705BE000070B504460D466068
+012801BFA06810F1010FE888B0F5004F1CD168880D2805
+F10C0617D3304615F40DF769880C39884210D2304615F4
+06F7FF280BD8304615F401F73146421C04F5D050BDE870
+40001D15F494B570BD000010B5044608460022C18800EB
+410108300A810FF2480105F0D7FE38B10022002108301C
+F498F404F5D051086010BD000070617463685F676C6D65
+5F706569665F696D706C5F6465632E637070000000004D
+696E694D652025730A00007265665F636C6B3A00000000
+00F5596001750260704700002DE9F44F2DED0E8B0F46AA
+B00446D7E904010122DD4B14F42DF404F1380B94BF0120
+0020BBF8181051FA80F0ABF818000A2100B223F462F3AB
+F818003968097AC9070BD50A2818DA389805F085FEF3EE
+040A90ED020A00F0C3F90ED5BBF918502046BEF443F6AB
+F818503898A0F47CF004F12C014860002047E101202070
+B4F9021019B138688068800502D50020607000E0481E60
+80F2EE0F9A3868007A800748BFDFEDCD9A0020ADF80800
+824681463898B6F473F7014603A823F4D3F60026B9EE00
+9ADFEDB28A9FEDB18A9FEDB0AA25E0B0EE4A0AB4F4EBF1
+F0EE40AAF0EE6A0AB0EE480A23F46BF3B0EE408AF0EE6A
+0AB0EE680A23F41DF3F0EE408A95ED130AB4EE409AF1EE
+10FA05D5B8F9F0000B28A8BFB0EE409A03A823F49FF603
+A823F49AF6002844D103A9684623F4A0F6389800230022
+694684F462F6054603A9684623F495F638980022694684
+F4C6F6002D8046E0D095ED130ADFED8E0A00F03FF9A8BF
+0AF1010AF4EE409AF1EE10FAC5D5B8F9F010761C2E29A4
+BF01208DF80900484623F4F6F2814608F1F000F6B2B0F9
+020014F420F57F4A804B14F4AAF316F48AF5012E00EE90
+0A92D1F19403103D8100B0EE60AAA5E79BED00CB5FFA8A
+F014F417F541EC1D0B51EC1C0B53EC1D2B14F477F39FED
+74AB3ABFB0EE4AEAF0EE6AEA9FED72EB53EC1E2B14F486
+F3CDE900019FED70BB51EC1B0B53EC1E2B14F406F553EC
+1D2B14F478F3DDE9002314F446F400226A4B14F454F341
+EC1C0B04D2B0EE4BCAF0EE6BCA06E00122654B14F424F3
+98BF9FED64CB8BED00CBDBE900234FF02040624914F458
+F353EC1A2B14F426F441EC100B23F4E2F4C5B225B13868
+042122F4DAF700B10325022E0ADBA9F10100192806D238
+EE680ADFED550A00F0B2F801D4B5420CD39FED530AB4EE
+409AF1EE10FA05D59DF8090010B901208DF80800386880
+68410604D49DF8081009B1C00505D538989FF45AF704F1
+2C0148604EF66020E0603868007A800712D441F28830E0
+6038688068810608D4000709D5D7E9040101223C4B14F4
+C7F202D840F6B830E06004F12C00456875B9A079002508
+B1401EA0719DF8080084F82C0028462AB0BDEC0E8BBDE8
+F28FD7E904010022304B14F4CEF208D238688068010604
+D580075CBF43F69820E060B968E068491B8842DBD2A079
+002530B900212046BCF4DCF104200125A071607870B9B8
+68A06204F1100079687BF4B8F297ED060B8BED020B97ED
+040B8BED040B0120607039462046BEF4BAF66080A080B8
+68A060BAE700000000E03F000000000100B041349D52A2
+46DF913F000000000000E03F000000606666EE3F000000
+000000F03F0000F03F0000384000000000000038409999
+C93F20C9293F0000204200003E4000009C4100000840B4
+EE600AF1EE10FA70470000E74823F45DB5000038B50446
+04F5F96304F1100204F11001B2F464F500252068982101
+FB050008B1B2F4FCF56D1C0D2DF5DB204632BD00002DE9
+FE4F2DED028BADF5B66D804689460024A4A800EB0410B4
+F496F3641C322CF7DB92A823F430F580A823F42DF542A8
+B4F4ACF004A8B4F4A9F0D8F84C00A9EB000040F2DC51DD
+F8C0458842A4AD08F5A06780F0D080DDF8E8A5322604F1
+110050F474F240B304F11101504653F4D8F1F8B104F111
+01684636F46AF400F0E8F8217C012918BF0021084212D0
+D4E9020181F00041C5E9000104F1110205F10901684650
+F435F204F1110180A823F4FAF410351834761ED1D180A8
+22F4EFF3C1B2062023F419F10390002580A822F4E6F3C1
+B2A24B1022A4A896F48AF50026AA4605E01834BBF1010B
+18D10AF1010A03995FFA8AFA8A454FDAA4A901EB0A1000
+F1090102A836F424F40146684636F420F400F09EF8DDF8
+C045F19403A04081004FF0320B02A904F111003BF4FBF2
+0028DBD03A689DF804304FF0180C1CFB032203F05AF941
+EC180B42A8B4F475F042A896F44EF5014601F05BF880ED
+008B04A8B4F46AF004A896F443F5014604A87CF4F1F594
+ED000B80ED000B51EC180B01F055FF34BF01204FF0FF30
+4519D4E9000114F462F134BF01204FF0FF308619A8E704
+A879F4F9F268B223F416F1062806D170B223F411F10628
+08BF012000D00020387404A879F432F298B104A879F42E
+F2014604A87CF4BEF5012241680068DFF8543E14F439F1
+94BF01200020397C0840387442A879F47AF287ED020B01
+E00020387440F2DC51DDF8BC0588421DD2C8F84C900024
+182000FB04F5DDF8C005291838682818B4F49CF24046B4
+F4AFF23E68A81953EC102B4168006814F4D7F2AA19641C
+C2E90001322CE4D30DF5B66DBDEC028BBDE8F78F000001
+4601AA4046B4F4A3B2000070B586B004460D46B6F450F1
+082104F5B0607BF48FF3DFF8BC0D05F061FB0822082104
+F1C80078F42FF429462046A8F449F6284604F21476B6F4
+06F430602846B4F452F2014604F5E3607BF403F12846B6
+F4FEF3284686ED070AB6F4FDF351EC100B04F5CF6616F4
+E7F230602846B3F44FF74169006981F0004116F4DDF270
+602846B6F40BF486ED020A2046B0F49CF0284604F29476
+B6F4D7F3B0602846B4F423F201466846A7F437F0014620
+46B6F4F9F39FED140B04F65830B6F4F7F304F60810DFF8
+141D016004F5E055012131604835002101716976DFF800
+0D4170017004F5C0507830B6F4E5F30FF224026F212046
+B6F48DF10020288006B070BD0000DDC50B000000000000
+00694050C99100496E69744B4600002DE9F34F81B041F6
+78502DED0E8B8CB0ADF5085D17469846684496F41BF40D
+F500500025D0F86C02ADF8385000F6C4200F9000268068
+B3F4DDF6F1EE04AA0078012810D10F988068A7F414F701
+260078022806D00F988068A7F40CF70078032801D18DF8
+38600F98006884F48FF5DFF8581C884245D0B868800440
+F115860F988068B6F475F5B6F475F507000AD000F093FE
+B6F44DF3C01B4EF660218842BF41FF0F00E000270DF500
+500122D0F86C02C8300D9001217CF487F4044600F05CFE
+024653681268D4E9000114F419F10122DFF8F83B14F402
+F00DF5005094BF01240024D0F86C02B6F461F30F28C0F0
+DC8554EA070040F0D88500F05EFEB6F43CF5002800F0D1
+850F98006884F43FF500EE100A9FEDDB9BB8EE400ADFED
+D80AB0EE498AF0EE698A80EE20AAB7EE00BA0EB1F0EE4B
+AAF194033044810000F040FE00F5D1600090404696F46C
+F3082840F06A8100F08FFE0428C0F2658100F08AFE0528
+0DF50050B8BFF0EE4BAAD0F86C0200F5CF6696ED010A20
+EE0A0A02F00CFA96ED000A41EC120B9FEDBF1B20EE0A0A
+00F0D0FD02F000FA00F0D6FD0DF5846096F4C6F3014600
+9A02A87AF4F9F60421CAA8B6F4E9F48CA8B3F432F602F0
+F7F907460D98022202217CF402F4022100F095FD00F036
+FE07460D98042204217CF4F7F3044696ED000A22F480F7
+02F0D4F9D4E9002313F4B6F7C7E9000100F020FE06460D
+98062206217CF4E2F3042101F055FF00F016FE06460D98
+082208217CF4D7F3012101F04AFF00F006FE9DED020B80
+ED000B022100F0FFFD9DED040B80ED000B032100F0F8FD
+9DED060B80ED000B042100F0F1FD064600F0B8FD03F092
+FC01F028FFC6E9000100F004FE0646CBE004214EA8B6F4
+88F4042110A8B6F484F400F0B3FD31B290ED00BB0DF500
+50D0F898027CF4A5F300F0A7FD002241680068DFF8343A
+13F45EF7C7E9000100F09DFD00F05AFD14F428F041EC18
+0B012100F0B7FD00F0DBFD012100F0BEFD0746012100F0
+B7FD044600F0D2FD00F0C3FDC7E90001022100F0A4FD07
+46042200F0C8FD022100F0A9FD0746022100F0A2FD0446
+042200F0BDFD00F0ADFDC7E90001032100F08EFD074606
+2200F0B2FD032100F093FD074600F08CFD0446062200F0
+A8FD00F098FDC7E90001042100F079FD0746082200F09D
+FD00F0D9FC042100F080FD0746042100F075FD04460822
+00F090FD00F080FDC7E9000110A94EA879F428F102F030
+FECAA94EA879F422F10DF50050B0EE40DAD0F89C02F0EE
+60DA31B27CF427F3024651EC1D0B5368126814F46CF041
+EC1D0B21F0004141EC1E0B51EC1B0B53EC1C2B13F4A8F7
+02F000FA02F02AFE0022DFF8183913F48DF60AD91AEE90
+0A16F4F2F053EC1D2B23F0004313F4A6F611D231464046
+78F4BBF40DF5005031B2D0F8980279F46AF00DF5005031
+B2D0F89C0279F463F0761E012EBFF631AF00F031FD14F4
+19F002460B4651EC180B14F4EBF041EC180B404696F4FC
+F1082840F03F8400F01FFD0428C0F23A84404696F4F1F1
+082803D040F2371102F0F3FA0DF5C65096F403F200F00D
+FD014604220DF5C65078F489F100F005FD064600F002FD
+014641F678503246684478F47DF1012639E000BF00007A
+440000000000000000012231460DF5C6507CF49AF200F0
+EEFC022200F031FC0746042200F0E9FC032200F02AFC07
+46062200F0E2FC042200F023FC0746082200F0DBFC3246
+F19403C047810000F016FC41F67850314668447CF47AF2
+00F084FC0246002053681268DFF8F41714F484F0C7E900
+01761C00F0BDFCB042C8DA41F20840684496F4AAF10DF5
+756096F4A6F140F658606844B3F483F410A896F49EF141
+F678536B440DF5C652012178F4C0F241F208400DF5C652
+10A9684478F4D2F10DF5005240F65860D2F89C2210A968
+4478F4ECF741F208400DF57561684478F4EDF5002800F0
+A48320A877F4D3F40DF55660B3F455F440F658626A440D
+F5756178F4D4F7DFF8581700988DED1E9BCDE912518DED
+1C9B8DED1A9B8DED189B8DED169B8DED149B032203217C
+F429F210900222009803217CF423F20546009801220321
+7CF41DF206460098032202217CF417F207460098022202
+217CF411F204460098012202217CF40BF2814600980322
+01217CF405F282460098022201217CF4FFF18346009801
+2201217CF4F9F112A90C91069514A90B91059616A90A91
+039718A9099153461AA908915A46109907911CA9049102
+941EA90091CDF80490014686A877F41BF5042204210DF5
+756078F4C7F00DF5756164A877F482F542A877F459F486
+AB012264A977F44CF642AA86A920A877F403F6032100F0
+F0FB00F0ECFB0646012100F0EAFB95ED002B90ED000B96
+ED001B06A879F49DF300F091FBB3F49BF6014606AA6846
+7AF4B6F2694600F07BFBB6F473F2032100F0D0FB00F0CC
+FB0646012100F0CAFB03F05CFA41EC190BD5E9000102F0
+AAF941EC120BD6E90001B0EE42BAF0EE62BA02F0A0F941
+EC110BD7E90001B0EE4B2AF0EE6B2A00F01AFB02F094F9
+00F020FB684679F463F3014600F04AFBB6F444F200F03E
+FBB6F444F200F028FB074600F02BFB044600F07AFB00F0
+F4FA0546D7E90023D4E9000113F4E3F500F00DFBD5E900
+2313F4DDF515F4EBF601F065FDF7EE000A22F469F400F0
+3BFBB6F425F20D98052205217CF430F1054600F00BFB00
+F04FFB15F4D5F601F04FFDF7EE000A22F453F400F025FB
+B6F413F200F047FB054600F0C1FA00F03CFB15F4C2F601
+F03CFD8DED000A0DF500506946D0F87002B6F403F200F0
+E7FA00F0C1FE01F02DFD00F007FBB6F4FDF100F0F7FAB3
+F455F3B0EE40BAF0EE60BA042100F03CFB53EC1B2B4168
+006813F48CF500F0D8FAB3F438F70D98072207217CF4E7
+F0054600F090FA00F006FB15F48CF601F006FD0DF50050
+0125D0F87002B6F4D7F1042100F01AFB00F05CFA00F0BA
+FABDF40EF000F078FA00F054FA15F474F601F0EEFC00F0
+B0FAB6F4C6F1012100F005FB064600F001FB96ED001BF1
+9403504B810090ED000B25F4D0F402F0DAF80022002313
+F45EF409D253EC192BDFF8940EDFF8941E13F443F541EC
+190B00F0CDFA00F047FA4168006800F065FA53EC182B13
+F4ADF615F443F601F0BDFC02F011F880F2F58000F08DFA
+064600F078FAB3F48CF5024653681268D6E9000113F4D7
+F521F0004102F0B5FB16D900F074FAB3F492F2064600F0
+63FAB3F48DF2024653691269D6E9040113F4C2F521F000
+410122DFF8E43313F4F1F340F2C98000F0B5FA0528C0F2
+C58040F6A8000DF575620DF5C651684478F49BF001460D
+F5C6530122FCA878F4B0F095F474F706460DE000F0DAF9
+00F054FA024653681268D7E9000113F495F5C7E9000176
+1E012EEFDA00F08CFA01B2BEA8B6F412F100F086FA01B2
+80A8B6F40CF100F080FA064652E0042142A8B6F404F101
+F015FE00F07AFA022100F083FA0746042200F075FA0321
+00F07CFA0746062200F06EFA042100F075FA0746082200
+F067FA31B200F0A2F9BEA87CF411F007460DF5566142A8
+78F4FBF50DF50050B0EE408AD0F89C02F0EE608A31B27C
+F400F000F0C2F913F448F5C7E9000131B280A87BF4F6F7
+074631B2BEA87BF4F1F7044600F076F9761E4168006881
+F0004101F0D5FED4E9000101F0CDFDC7E90001012EAADA
+BEA878F4A8F451EC100B21F00041DFF8E02CDFF8E03C13
+F454F398BF0025BEA878F4EFF4BEA878F496F451EC100B
+DFF8C82CDFF8C83C13F444F39CBF01208DF8390000F006
+FA002607460FE039B280A87BF4B5F7012241680068DFF8
+A43C21F0004113F452F338BF761C7F1E012FEDDAF6B204
+2E00DA0025012100F0DEF98346012100F0DAF9814600F0
+D6F9824600F0D3F90446032100F0D0F90646032100F0CC
+F90746DBE9000102460B46D9E9000113F447F3CDE90001
+D4E90023DAE9000113F43FF3DDE9002313F40DF4044689
+46D6E90023D7E9000113F433F322464B4613F401F415F4
+0FF501F089FB80EE0A0A01F041FD41EC180B0F988068A5
+F415F7007838B951EC180B0122DFF8FC3B13F4D8F20FD9
+0F988068A5F407F7007801280AD151EC180BDFF8B02EDF
+F8B03E13F4C8F201D8002555E0002D53D000F009F90646
+00F05EF903F00CF801F0A2FA00F0F6F8C6E9000103220D
+9803217BF427F700F0CBF802F0FDFF01F093FA00F0E7F8
+C6E9000105220D9805217BF418F7064600F0F3F802F0ED
+FF01F083FA00F0D7F8C6E9000107220D9807217BF408F7
+064600F0B1F802F0DDFF01F073FA00F0C7F8C6E9000100
+F0E7F8B3F4FDF300F053F9B5F4DBF700F0DFF8B3F4F194
+03E04E810049F100F0E7F8B3F439F50F9800689EF4EDF6
+00F043F9B5F4EDF70DF5005000F001F951EC100B0122DF
+F8EC3D13F464F233D800F0C9F800F0F1F853EC102BB0EE
+080A28EE000A16461F4601F0AFFC32463B4613F475F220
+D200F0A8F8B5F4D6F751EC190B15F46AF400EE100A00F0
+A6F8B5F4C4F700F0A8F800F0D0F800F066FD01F0A1FD01
+F0DCFE15F458F400EE100A00F094F8B5F4B6F701E000F0
+B7F89DF8380078B100F0F0F8062802DB9DF8390040B100
+F0ABF80DF500500021D0F87002B5F47CF70CB00DF5085D
+2846BDEC0E8BBDE8FE8F0000144028AF89000000C6429E
+CB9100FF2292FF0080484000002240000059400000F03F
+53EC192B4168006813F484B432463146FCA87BF46BB600
+0090ED000B87ED000B7047000090ED000B87ED000B3146
+0DF5C6507BF45BB6000006460222022120A87BF46CB604
+22042120A87BF467B60000B0EE41BAF0EE61BAB0EE42CA
+F0EE62CA7047000041EC100BB0EE4C2AF0EE6C2AB0EE4B
+1AF0EE6B1A70470000D6E9002313F4D0B2024651EC180B
+5368126870470D98012201217BF429B600000D98032203
+217BF423B600000322032120A87BF435B600000DF50050
+0121D0F87002704741EC100B0DF50050D0F87002704700
+000DF50050D0F87002B5F41AB10DF50050D0F86C027047
+00000DF50050D0F86C02B3F4FEB20DF500508DED000A69
+46D0F87002704707460DF5005031B2D0F898027BF4F4B5
+0DF500500021D0F87002B5F4F9B600000DF50050B0EE40
+8AD0F87002B5F498B441680068D5E9002313F472B20122
+012120A87BF4E9B500004EA87BF4D5B50000CAA87BF4D1
+B5000003218CA87BF4CCB590ED000B87ED000B10A87BF4
+C5B50000054602210DF556607BF4BEB5024653681268D4
+E9000113F479B10000404695F4D1B40000074602223146
+40467BF4A4B501460DF50050D0F86C02704790ED000B87
+ED000B42A87BF49FB500002DE9F0472DED0E8BADF5116D
+80460C4615469A4604A8B6F4EFF640F6C800684422F42A
+F40C2100910246012321464046B0F418F20DF5086022F4
+1EF402460C200090002321464046B0F40CF2069840F4C8
+70069008F52C6695F82410002914BF40F0040020F00400
+069004A9069840F09000069014BF40F0040020F0040006
+9007A8B6F4C3F601F04DFB044602F081FE02F082FE07A9
+DDF86C79039102940190009540F638003368726801F0A1
+F839466844B6F4B1F617B13846A7F42FF0DDF8689901F0
+39FC002808F6F8249FEDCB8B9FEDCCBAF6EE00CAF19403
+7052810000F092801CA8FEF76FFE04A907A8B6F491F601
+F01BFB02F04FFE00F0CFFB02F053FE07A9039102970190
+00953368726802F002F81CA90AA8B6F482F61CA8FEF753
+FE0120009040F6C8010023012269440AA8B1F48DF740F6
+C80169441CA8B1F4BFF5054601211CA8B1F4ECF5002D00
+F0A5FB6FD000F086FA51EC190B15F496F200EE100A60EE
+2C0A99ED1C0A22F412F089ED1C0A012301220DF5086140
+4600F0F5FC00285FD008F588500021D030A7F461F030B3
+01F0C4FA007810B32046B6F479F6F0EE409A2046B6F48A
+F6306BB0EE409AB6F497F601F04BFC00EE900AB0EE490A
+B2F45FF6B0EEC00ADFEDEA0A01F031FC06DBF0EE690A21
+F4DCF72046B6F485F6294608A8A5F4C1F72046B6F440F6
+00F042FA00F012FA002833D02046B6F449F6B0EE40BA2D
+E0009040F6C80140F638000123032269446844B1F453F6
+40F6C80169443846B1F44BF5050002D000F019FA9FE708
+A8B1F4D5F3014600F013FA002D00F08F812046B6F412F6
+00F014FA00F0E4F9002804D02046B6F41BF6B0EE40BAD5
+E02046B6F42BF600F0D1F9F0EE409A2046B6F44CF69FED
+C11BD9F88000B0EE40AA00F0FEF953EC182B13F41CF000
+F0FEF900F016FA074600F017FA00F003FA00F0FDF9B0EE
+409A00F00FFAC168806815F4EBF100F0F3F939EE000A25
+F48BF000F0D3F9044670689EF437F4064600F0EEF99FED
+AC5B00F0BEF900F0B4F902F003FD41EC140B00F068F9B0
+EE6A6A00F05EF9B0EE44BAF0EE64BAB0EE45AAF0EE65AA
+B0EE46CA00F04AF951EC180B15F4BCF103EE100A00F03A
+F9B0EE4C6AF0EE693AB0EE4B4AF0EE6B4A00F04EF9B0EE
+63BAF0EE46BA00F086F915F4EEF141EC120BD7E9040100
+F038F9B0EE6B6AF0EE4B3AB0EE42BAF0EE62BAB0EE63CA
+B0EE46DAF0EE66DAB0EE47EAF0EE67EA15F48CF101EE90
+0AF0EE6E7AB0EE4E7AF0EE6D6AB0EE4D6AB0EE4A5AF0EE
+6A5A00F024F9B0EE4B2AF0EE6B2AB0EE491A2346D9ED1D
+0A99ED1C0A08AA31465046B4F4ECF701215046B5F4D0F4
+01215046B5F4A4F44046B4F4CFF6DFED6B0A01F031FB15
+DB99ED200ADFED680A01F02AFB0ED5E86E15F49AF141EC
+100B4046B3F4EDF199ED200A20EE2C0A4046B5F49AF4B0
+E000BF000000000000E03FDB0F49402046B6F455F500F0
+FBF8B0EE40AA2046B6F476F59FED561BD5F88000F0EE40
+9A00F028F953EC182B12F446F700F028F900F040F98046
+00F041F900F02DF900F027F9B0EE409A00F039F9C16880
+6815F415F100F01DF939EE000A24F4B5F700F0F1940300
+568100FDF8074670689EF461F3044600F018F9B0EE6A6A
+9FED405BF0EE4A3A00F0CCF819EE900A15F442F141EC14
+0B00F0A8F8B0EE44AAF0EE64AAF0EE639A00F0D4F8B0EE
+46CAF0EE66CAB0EE47DAF0EE67DA51EC180B15F4E2F003
+EE100AF0EE6D7AB0EE4D7AF0EE6C6AB0EE4C6A00F068F8
+F0EE693AB0EE4A4AF0EE6A4A00F06EF800F09AF815F412
+F141EC120BD8E9040100F076F8B0EE42AAF0EE62AAB0EE
+63CA00F0A2F8F0EE46CA00F042F815F4B6F001EE900A00
+F034F8B0EE6C6A00F040F800F054F8B0EE4A2AF0EE6A2A
+B0EE491A3B46D5ED1D0A95ED1C0A2A4621465046B4F41C
+F701215046B5F400F401215046B5F4D4F30DF5116D2846
+BDEC0E8BBDE8F08700BFDB0F493F7E36EA460F62124800
+00000000004940000000000000F03FF0EE4E7AB0EE6D7A
+F0EE4D6A70470000B0EE66DAF0EE47DAB0EE67EA704700
+00B0EE4B5AF0EE6B5A70470000F0EE6D7AB0EE4D7AF0EE
+4C6A70470000E86EF0EE439AB0EE448AF0EE648A7047F0
+EE4C3AB0EE484AF0EE684AB0EE693A70470000F0EE4D7A
+B0EE6C7AF0EE4C6AB0EE6B6AB0EE4A5AF0EE6A5AF0EE4B
+3A70470000F0EE40AA2046B6F47FB40000F0EE40BA2046
+B6F47DB40000B0EE63BAB0EE45AAF0EE65AAF0EE46BAB0
+EE66CAF0EE47CAB0EE67DA70470000B0EE66CAB0EE47DA
+F0EE67DA70470000B0EE45BAF0EE65BA70470000294648
+46B1F454B2B0EE409A2046B6F46BB40000B0EE40CA2046
+B6F453B40000B0EE41DAF0EE61DA15F446B041EC100BB0
+EE4D1AF0EE6D1A21F43CB500EE100A21F4D4B541680068
+14F4EEB7002001900090F0EE4C7AB0EE6B7AF0EE4B6A70
+47B0EE408AF0EE608A2046B6F43FB400002DE9F8432DED
+068BADF5A66D05460F4614461E461EA895F469F105F1C8
+0801220121FFF776FC814603220321FFF771FC00F0FEFF
+12F4B0F614F4BEF708EE100A2846B2F411F7314678F4A0
+F700F0BCF896ED1C0A21F492F538EE000A24F452F600F0
+E2FF02460B4651EC190B13F40CF014F4A2F7002F00EE10
+0A9FED4F9A9FED508B4FD001F06AF980F28280314612A8
+A5F402F500F0A2F8012200F09BF805F5D16700F0A7F800
+F09FF869460CA8BCF467F201463A4606A879F484F4F0EE
+490A96ED1C0A21F4FCF421F458F500F0ACFF41EC1A0B00
+F094F89DED080B2846ACF48BF300F07BF8032200F074F8
+00F082F800F07AF8694618A8BCF442F201460CA8BBF456
+F33A460CA9684679F45BF4694606A803F0AFFF00F073F8
+9DED060B2846ACF46AF3002C33D000F058F8F194039059
+8100072200F051F81EAC80ED008B2846B2F4E9F3F06E00
+F064FF14F480F753EC182B12F4DCF614F432F709EE900A
+96ED200A21F40EF5F0EE490A21F4ACF400200190012000
+9000F05AFF00F050FF19EE900A14F464F741EC100B0023
+002201F088F9ACF434F30DF5A66DBDEC068BBDE8F18311
+2D4454FB21194001000040E17A843F010000E051B89E3F
+000008400000484200001E40000000000000F03FB0EE40
+9AF0EE609A7047000001211EA87BF442B1082201211EA8
+77F411B000000246002312A9684678F460B580ED008B28
+46B2F435B60000002001900023012000900022B0EE4A1A
+F0EE6A1A1EA970472DE9F047EAB004460E46904660A81F
+F471F060A831F452F4814660A93AA821F4A7F7002504F6
+C42718E014A901A821F493F738680023002201A982F455
+F701F0E5FB08D114A821F47DF714A821F478F70028EAD0
+6D1C3AA821F498F73AA821F497F788B93AA9684621F488
+F79DF800008DF8040001AA314602A81FF4DFF002A914A8
+21F463F7E0E7B868B5F4B1F1BAF4B1F306462046B4F48B
+F7824604F590501830B9F4E9F40196EDB200955346B868
+4246494603F07CFF6AB0BDE8F08700002DE9F0478246AD
+F6C84D40F608400D466844B4F4E3F301462A465046A7F4
+EEF20646DFF8040D35F4D9F2A868000504D50AF58850D0
+30BBF4DDF10AF6F820BBF4DDF15046BBF410F20AF6B427
+0AF5F4683869B4F4B7F70146404650F433F23869B4F4B0
+F70AF5FD690146484650F42AF25046B2F48DF501465046
+BBF401F231465046BBF401F236B9A868400A00F0010150
+46ABF4D9F6A868C00800F001015046A8F4D8F52A460021
+5046A8F47DF608B1014628E0002432A8302101FB040082
+F499F1641C3C2CF6DB0AF503600290CDF80490CDF80080
+3C232A4632A95046ABF405F18AF86807C2B232A95046A7
+F480F25046A8F403F45046BAF43AF3DFF82C1C884204D3
+09215046A7F48CF04EE040F60841694402A8B4F4CFF303
+4632A80090324629465046AAF4F1F55046D9F4FAF242F2
+11718842DFF8F85B34D3387898B9B86904F047F8BAF4F5
+F268B99AF96807012809DB5046B4F4CFF6DFEDBF0A00F0
+93FF48BF012600D400265046B2F424F207465046B2F40C
+F504461EB15046B4F4B7F601E0DFF8D40D0AF5D1610191
+3B460AF1C8010091224601462846FBF764FB2846FBF74D
+F9284603F0EEFD0DF6C84DBDE8F087010000C047013940
+0000E03F2DE9F8432DED028BADF5C46D80460C4615461F
+4602A8BBF45BF102A820F402F5049840F0F19403205D81
+0005000026049017B140F04000049002A905A8BBF45BF1
+00F0C1FD02F0F5F802F0F7F8014605A800900B233A4600
+F01CFB0DF5BF60BBF450F1E0A8B6F48FF29FED8E2B9FED
+8D1B9FED8C0BDAA878F4ACF10146E0A8BBF44EF101F004
+FB002790ED000B8DEDE60BD8F8C40A9DF49FF7CDF8A805
+C8A821F43CF650A800EB07191021484614F43DF64846B2
+F492F47F1C1E2FF2DB3DA821F42CF6D8F8C40A83F4D8F1
+0246214605A8BBF433F105A917A821F4FBF550AF15E0A0
+6C14F468F50022DFF8F03D12F439F341EC100B87ED000B
+00F0E1F869463DA821F419F6103717A821F4DFF517A821
+F4DAF528BB00F0D3F8D8F8C40A0022694682F413F68146
+00F0CAF8D8F8C40A00230022694682F49BF504464846BB
+F40FF10028E0D000F0BBF86A4607F1090101A84EF427F3
+002DC3D1E06C14F42CF5C7E73DA820F4E4F4C5B2294604
+2908F6F8282FDBDFF8683D102250A894F482F60C212846
+21F402F245B2E80714D46D1E6DB211E050A800EB061000
+F10901684634F420F501463DA851F484F218B16946C8A8
+21F4C1F5761CAE42EBDBC8A905A854F470F00146E0AB0D
+F5BF62404603F027FF06464046B6F4ABF000F055FADFF8
+105E03DC40F2FB3100F060F84046B6F48DF000F049FA03
+DC4FF47F7100F056F84046B6F437F100F03FFA03DC40F2
+FD3100F04CF84046B6F429F100F04BF803D340F2FE3100
+F042F84046B6F4C3F000F02BFA03DC40F2FF3100F038F8
+4046B6F4D5F0002241680068002312F44BF203D34FF480
+6100F02AF84046B6F4C7F00022C1688068002312F43DF2
+03D340F2014100F01CF84046B6F4B9F000224169006900
+2312F42FF203D340F2024100F00EF80DF5C46D3046BDEC
+028BBDE8F28300000000484300000000000000002846EA
+F77DBB000051EC100B0022002312F412B217A9684621F4
+0CB52DE9F84F2DED048BADF6E83D80461E460DF5E66094
+F4BEF5D8F8780600EE100A002700F0CDF948BF01270822
+08210DF5E66076F43DF508F588509FEDDD0B0021D030A6
+F471F104464046BBF44DF505464046BBF44BF582464046
+B4F42DF783464046BAF445F1DDF8301C0E9108F1C80900
+210D910C910B940A919FEDCF1BDDF8281C09919FEDCC0B
+002108910795019008F5D160DDF8241C05910090CDF818
+A0CDF810B003974B46DDF8201C02914246314610A8BBF4
+1CF508F580540346A83408F5EA6208F5E761204604F0CD
+F9DDF82C7C4046BAF40CF1012640F6B931884200D207B1
+0026D8F8AC0A00EE100AF6EE000AB4EEF19403B0608100
+600AF7EE008AF1EE10FAB0EE688A04D520EE008A68EE00
+8A27E0F0EE000A00F079FD22D4F0EE088AB4EE680AF1EE
+10FA04D5F0EE048A9FEDD58A16E0F1EE000A00F068FD48
+BFB7EE088A0ED4F1EE040AB4EE600AB1EE008AF1EE10FA
+46BFF0EE488AB0EE008AF2EE008A002F29D10122012100
+F037F90746012100F075F900F057F900F05BF9C7E90001
+0322032100F029F90746022100F067F900F049F900F04D
+F9C7E900010522052100F01BF90746062100F059F900F0
+3BF900F03FF9C7E900010722072100F00DF90746B7EE00
+0A21F42EF1B0EE409ADFEDDE9AB0EE690A21F426F1D8F8
+AC0A00EE900AB0EE081A69EE200A80EE010A40EE280A10
+EE900A14F47CF3C7E90001022200F0FFF80746042100F0
+29F900F005F900F00FF9C7E900010422042100F0DDF807
+46052100F01BF900F0F7F800F001F9C7E90001062200F0
+D4F80746082100F00EF900F0EAF800F0F4F8C7E9000108
+2200F0FFF800F0DBF8D8F8AC0A00EE900A20EE200A00F0
+35FBC7E90001072200F0F0F800F0CCF8F6EE000A20EE20
+0A20EE080A00F026FBC7E90001CEB1012200F0B8F80646
+032100F0E2F800F026FC00F0A6F8C6E90001052200F09B
+F80646072100F0D5F800F019FC00F099F8C6E900010DF5
+E661484676F4EAF50422042100F0B7F890ED000B24F468
+F19FED9C1B21F406F000F0E8FA51EC180BDFF8342ADFF8
+343A12F494F01CD8012200F0A0F8064600F065F824F44D
+F121F491F0D6E9002301F019F841EC180B00F095F853EC
+182B4168006812F49FF003D200F08CF880ED008B082207
+2100F083F806460722082100F07EF8022200F056F800F0
+78F806460122022100F074F8062200F04CF8052100F06E
+F806460522062100F069F86F2100F041F84846B3F4EAF7
+4046D8F493F742F2117188420ED34046B4F47AF300F04A
+FC08F5D16400EE100A22464946DFF81005FAF758FE0DF6
+E83DBDEC048BBDE8F18F00000000000059400000000000
+000000B5EE400AF1EE10FA70470000B0EE480AF0EE680A
+704700000DF5E6607AF494B406210DF5E6607AF48FB400
+00D7E9002312F454B090ED000B86ED000B704700000221
+0DF5E6607AF47FB400000746B0EE690A21F407B0000005
+46D8F8AC0A14F467B20000054618EE900A14F461B20000
+02460B46D5E9000112F430B0012148467AF462B4032203
+2148467AF45DB4000008210DF5E6607AF457B400002046
+BBF48FB3000010B500F5B0642146DFF84004FBF758F920
+46BDE8104094F4A5B400009A99993FF19403406481002D
+E9F04104460D460422042104F1C8007AF438F4FFF7F0F9
+00F05CF8DFED2C0A00F0B0FB4CBF002601262046BBF41C
+F3304305D1D4F8CC0AA4F4E2F3007878B1D4F8CC0AB1F4
+34F60078022806D1D4F8CC0AA5F46DF60078012801D001
+2700E0002704F6F820B5F403F600B9002700202870D4F8
+CC0AA4F4C3F3007802280CBF012000202870287830B9D4
+F8CC0AB4F4CDF4B5F485F200E001202870287858B9D4F8
+CC0AB4F4C2F4BBF438F380462046B9F4DCF6804500D201
+262E703846BDE8F08100009A99993E112D4454FB21F93F
+DB0F494000EE100A24F426B02DE9F84F2DED068BADF51E
+7D8046894692469B4660A8B1F4EFF522A8B1F4ECF5D8F8
+780620F0004000EE100AF1EE040A00F03AFB08F52C6722
+D578689DF4B8F3DFF8DC1D884208D200F0A4F9007878B1
+00F0A0F9007801280AD000F09BF9007870B978689DF4A4
+F3DFF8B81D884207D3F868A5F4EFF50078072818BF0124
+00D10024F868A5F4E6F500250078022805D0F868A5F4DF
+F50078032800D1012505EA04008DF8140000F075F90078
+461E06A8B641B4F491F408989DF8141040F00D00F60F08
+90002914BF40F0100020F010000890002E089814BF40F4
+006020F40060089059469BF80800000708984CBF40F480
+4020F48040089000244046A8F482F070B14046B4F428F4
+3040284208D0504620F400F620B9089820F01800012408
+9000F0A2FE05464046B1F456F5064606A909A8FBF799FC
+00F033F9834601F067FC01F068FC02460395029609A801
+905B4603200090FFF78AFE08F5B06116A8B4F451F4B198
+AE9B049022AA002003900290019060A9AF98009009A8B4
+F457F499F91000DDF8CCB2002818BF022803D1B2980E90
+CDF834B048463D68BBF455F20646012111A820F492F401
+9086F0010101200090029128462D68D5F808C04B4609AA
+16A9E047C8B1022813D199F9100018B9514608F5F46004
+E0022805D1514608F5FD6038F4E1F706E040F22C5100F0
+0EFB01E0012801D10120A0E0002C72D099F9100000280C
+BFB2EE048AB3EE048AF7EE000A9BED000A20F4F7F5F0EE
+408A00F0B4F99FEDD29B53EC192B11F487F641EC100B23
+F405F700F0A3FDFFF744FE53EC192B11F47BF641EC100B
+23F4F9F60020DFF8D41B00F09AF800F082F80020DFF8C8
+1B53EC1A2B12F4B3F041EC100BB0EE481AF0EE681A20F4
+89F599F9100000F069F810BB9DF81400F8B19BED000AF3
+EE0E0A00F009FA18D500F06AF802460B460020DFF8881B
+11F4D3F741EC120B9FEDB11B9FEDF19403D0678100B30B
+82F4D7F300F08DFAFFF7D5FD20F4A9F500F045F800F05B
+F8044600F058F8D0E9002351EC180B11F42EF6C4E90001
+99F91000002818BF022814D178680022514682F42DF19B
+ED000ABDEEC00A10EE101A20F8F01FB29991ED000ABDEE
+C00A10EE101A4180012160A87AF44BF28146012122A87A
+F446F200F024F811F48EF7B09AC2E9000100200DF51E7D
+BDEC068BBDE8F28F50C99100C027090028AF8900B0EE40
+8AF0EE608A7047000041EC110BB0EE418AF0EE618A7047
+000010EE100A14F40CB0024653681268D9E900017047AF
+9801217AF416B253EC102B12F41EB04046B5F4C9B30000
+8DED140B4046BBF4D5B000002DE9F84F2DED088B8CB080
+468A46144602A8B5F49FF008F6C4260025B068A5F445F4
+AB46007801280CBF01270027B068A5F43CF408F5F46900
+7802280AD0B068A5F434F40078032804D048461FF488F7
+0A2801DA4FF0010BBFB94046B4F4C2F0972805D2207A00
+0702D4BBF1000F0CD030689DF4C9F1054601F0FCFA0246
+F0682B4602A9B5F49AF0054621464046A7F4E5F69FEDA0
+AB18B100F0B8F8002856D1002D54D09DED069B01F0E4FA
+024651EC190B5369126911F4F7F600F0A9FCFFF775FF05
+22052108F1C8007AF499F105469DED080A20F422F5D5E9
+0023B0EE40BA0020DFF8A41911F455F505468B461BEE10
+0A13F479F72A465B4611F41DF600F075F853EC102B51EC
+180B11F48DF70122DFF8983911F4FEF419D99DED088A3F
+B9F3EE0E0AB0EE480A20F49AF4B0EE408A00F066F800F0
+5EF880ED00AB00F051F841EC100B20F4EEF4FFF730FF1D
+E0207A000732D548461FF403F770B348461FF4FFF60428
+29DA00F04BF800F043F880ED00ABF06AB5F4A6F220F4D4
+F4F06AFFF715FFB5F49BF2FEF7EFFF01F073FA84460020
+01900090DCE9042351EC190B11F483F641EC100B01230B
+22B0EE481AF0EE681A51464046ABF4EFF20CB0BDEC088B
+BDE8F18F349D52A246DF913F0000000000003940FF2292
+FF0000000000000000074618EE100A13F4FFB6000041EC
+100B23F456B50522012150467AF401B100000822012150
+4675F4CFB700004046B4F48FB70000F0B5BFB004464498
+A0B98868800405D52046B9F4D7F31FF499F658B904F6AC
+25286AB1F4F9F20078092803D02046B4F4B5F108B90020
+55E0286813F4CBF641EC100B3AF47BF200F05FF800EE10
+0A20F4C7F406460DA8BBF47FF110A8B1F422F302466969
+2CA8BBF421F004F5FD6110A81EF412F02046B1F411F38D
+ED080B2046BAF488F706900DA9F19403606B81000AA8BB
+F46FF12046B1F4B0F50746A8699DF4ACF0002105910491
+02460AA90391009706A902919FED580B08A9019110AB2C
+A91AA8B1F402F42046B9F487F3B0EB460F08D29DED260A
+F1EE040A00F00AF848BF012002D4286AB4F4FEF63FB0F0
+BDDFED4B0AB4EE600AF1EE10FA7047000065CDCD41E133
+0D00000000000000F03F51EC100B13F41AB6F8B505462D
+ED068B05F6AC2082B090ED000ADFED350AFFF7E1FF0C46
+17461E465DDA006AB1F470F20078042857D105F5885039
+46D030A5F4BFF300F075F801224FF07A5311F4D4F303D9
+40F2C25100F077F82846B5F462F2B0EE408A05F5EE60BB
+F4E0F0F0EE480AB1F4E0F1B0EE40AA08220121204675F4
+05F70422012120467AF42CF00022DFF8D436C0E90023B0
+6801279FED160AC00544BF9FED150A0027FFF700FEDFF8
+C026DFF8E03611F4E0F300F042F841EC100B20F4A2F300
+200190009000F023F800F0EFFA01F0E2F841EC100B3B46
+0C2200F01FF8ABF4CBF102B0BDEC068BF1BD0000010080
+3FCDCC9041666634428244E74A1857C63F306D81000000
+000000409F400100A040B0EE401AF0EE601A70470000B0
+EE481AF0EE681A2146284670470000B0EE409AF0EE609A
+51EC190B7047000053EC192B11F4E2B50FF20400E9F7B8
+BC70617463685F676C70655F6E6176676E73736B662E63
+7070000000002DE9F24F2DED108BADF6582D804691469A
+46B0EE40FAF0EE60FA00F093FA0CA881F4E0F04046B5F4
+1BF20346DDF8982A0CA94046B0F4B0F2002800F068820D
+F5B46093F4DFF606A8B4F4AEF0089840F2011108430890
+01260DF59560B1F4B4F1ECA8B1F4B1F1AEA8B1F4AEF170
+A8B1F4ABF100F0E1FA04464046B1F495F1054606A909A8
+FBF7D8F8FFF772FD01F0A6F8FEF726FE01F0AAF8024603
+94029509A801903B460320009000F058FAAEA964A8B4F4
+90F0002004900390029001900DF5B46370A80090ECAA0D
+F595615CA8B4F495F008F6BC270CA87C68BAF49DF60546
+012118A820F4DAF001900096204685F0010102910CAB24
+68D4F808C05CAA64A9E04718B140F2F951FFF768FF00F0
+64FA032290ED000B8DED000B00F045FA052290ED000B8D
+ED020B00F03EFA04AB90ED000B8DED040B02AA69463AA8
+75F4F4F10346012208F5D16118A875F429F400F043FA04
+46012118A893F4C6F6032200F01FFA0446022118A893F4
+BEF6052200F017FA0446032118A893F4B6F6012190ED00
+0B84ED000B0DF5956079F4FDF604460121ECA879F4F8F6
+024600F047FADDF8C02A9FEDF19403F06E8100D09BC2E9
+00010DF5B4614046AEF41AF4B0EE40BAF0EE60BA9DED0E
+0B20F46CF2DDF8C40A022800F0D7F99FEDD3AB08BF9FED
+D3DB09D0012807BFB0EE4ADAF0EE6ADAB0EE49DAF0EE69
+DA08F590501830B1F4E4F3DDF8C00A4168006853EC102B
+11F40CF441EC100BDDF8C00A80ED000B51EC100B002200
+2311F45AF205D2DDF8981ADFF8E00320F459F500F0B1FF
+007801280CBF0125002500F0AAFF0078022804D000F0A5
+FF0078032801D1B34601E04FF0000B002D53EC1B2B18D0
+51EC1C0B11F424F3FFF77CFD00F0ACF900F08AF9B0EE40
+EAF0EE60EAB0EE4D0AF0EE6D0A23F4C8F200F098F9C9E9
+00010FE051EC1D0B11F439F253EC1C2B11F407F3FFF75F
+FD00F08FF900F06DF989ED000B00F073FF007805280CBF
+0124002400F01EFFB0EE40DAF0EE60DA53EC1B2B51EC1C
+0B11F4ECF241EC1B0B00F048F99FEDCACBB0EE40EAF0EE
+60EA53EC1D2B51EC1C0B11F40AF253EC1E2B11F450F441
+EC110B9FEDC10B20F428F1FFF74CFE9FED740B20F468F1
+8AED000B00F038F953EC182B00F00AF90EBF9FEDBA0BB0
+EE490AF0EE690A00F03DF941EC180BDDF8C80A50B1DDF8
+C00A90ED000B20F47CF153EC102B51EC180BA3E051EC1F
+0B0022DFF81C3E11F4B6F10FD3BBF1000F00F0BD8000F0
+C5FEDDF8C02A5368126851EC100B11F4A7F180F0B18000
+F003FF007818B100F003FF007870B900F0E9F851EC180B
+FFF7DBFB41EC110B9FED5C0B20F4D5F000F0BBF874E084
+F001010D4204D0D9E9000100F00EF96ED9BBF1000F06D0
+00F0CAF8DFF8AC3D11F458F164D9002D3CD000F0DBFE00
+7801282DD14046B9F4B3F050B14046B3F47BF451EC100B
+00F0F1F802D88AED00CB66E0387808B99FED839B00F075
+FEFFF785FB00F0A9F800F097F853EC182B51EC1C0B11F4
+6FF153EC1A2B11F4B5F341EC110B00F08FF820F4D3F000
+F073F82CE000F0A8FE0078042804D100F089F8DFF8303D
+3FE0254205D08AED00AB00F080F86E4B37E0BBF1000F25
+D000F093FE0078012816D100F088F89AED001B00F05AF8
+0CBF9FED620B9FED150B20F463F08AED000BDAE90001D9
+E9002311F417F131D22BE000F077FE0078042804D100F0
+58F84FF080430EE000F06DFE0078022821D10020DFF8C4
+1CDFF8B43CCAE900010122D9E9000111F4D6F014D80EE0
+000000000000F03F00204D494C4BCAE900010122D9E900
+0111F4C6F001D8002602E00020C9E9000030460DF6582D
+BDEC108BBDE8F28F000000000000000010400000000000
+0022408AED000BD9E90023F194038072810051EC100B70
+47000090F8540001287047B0EE418AF0EE618A70470000
+B0EE40AAF0EE60AA70470000B0EE490AF0EE690A704700
+00D9E9000101227047B0EE4B0AF0EE6B0A23F44EB1B0EE
+40CAF0EE60CA7047000041EC100B20F45CB0DDF8981AB8
+680023002281F43DB3000090ED000B84ED000B01210DF5
+B46079F4E3B4000051EC100B11F4A8B053EC102B51EC1E
+0B11F4ECB2DDF8C00A4168006853EC102B11F4E4B20122
+01210DF5B46079F4CAB40122DFF8A83B11F44FB00000E0
+930400E19304000000F03F00003E4000002240349D52A2
+50C991000000000000000040000000000000F83F000000
+000000E03F0000144046DF913F53681268D4E9000111F4
+F4B14046B1F49FB100002DE9FE4F2DED108B82B0ADF590
+5D8046002500260DF580513020D1F84812704341180DF5
+D962801880F4E2F5761C3C2EF0DB002600F028FD01FB06
+0008B180F4B1F5761C3C2EF5DB0DF5805640F27C60D6F8
+4862684420F415F340F23460684420F410F3FFA8FF30F1
+3020F40BF3FFA8FF30A93020F406F3FFA8FF30613020F4
+01F3FFA8FF30193020F4FCF2DFF8A41DCDE90C519FED76
+CB8DED0ECB8DED0ACB11A8BAF4FFF41BA8B0F4A2F608F6
+BC27024679680DF59960BAF49EF31BA8B0F497F68DF820
+50ADF81A508DF81950ADF81E508DF81D50F4A8B0F456F6
+B6A8B0F453F68DF81C500DF5D96A00F033FD9FEDD1AA00
+780328A946DFEDCFAA9FEDCEBA9FEDCD9ADFEDCC9A04D0
+00F023FD0078022802D101208DF81C00002400F01EFDAB
+460078052808BF012400F017FD007818B100F00FFD0078
+08B94FF0010BFFF701FB20B924B94046BAF462F500B101
+208DF81800B0EE4CFA9DF818005BEA0000F0EE6CFA3ED0
+0DF580509FEDB4DBD0F84C021FF491F1002831D0414684
+A8B0F423F60DF5805172A8D1F84C1252F43EF54046B4F4
+45F60446FFF7CAF9834600F0FEFC00F0FFFC00F00DFD03
+46059401200490039502950195CDF800B000F086FCB0F4
+02F034A876F4E1F000F079FC00F0CFFC00F0C7FC00F099
+FCFFF7AFFEFFF7B1FA00283FD00DF58050D0F850021FF4
+53F1002837D0414684A8B0F4E5F50DF5805172A8D1F850
+1252F400F5FFF7F4FE02904046B0F4A8F50446FFF789F9
+834600F0BDFC00F0BEFC00F0CCFC0194CDF800B0034602
+9991ED001B00F047FCB0F411F234A876F4A2F008F59050
+1830BAF4EDF400F08DFC00F085FC00F057FCB0EE40FAF0
+EE60FA0024DFEDCBDA25E000BF000000000000000000F0
+F8FBF13038F45BF09DF8F19403107681001A009AED0A0A
+401C8DF81A003BEE00BA9DED0A0BB6A803F00FFC00F075
+FCFFF72BFE05D19AED0A0A79EE809A09F101090AF1300A
+641C00F0CDFB80F2C7809AF9100040B102280DD040F22D
+71FFF764FB9AF9100030B90DF580504FF0010BD0F84C02
+04E00DF58050AB46D0F850020AF12C014FF491F61BEA00
+0FD9D09AED0A0AF3EE010AFFF796FAD2DB9DF82000401C
+8DF820000AF12C01FFA8FF30F13020F4BDF100F031FCFF
+F7E7FD0BD19DF81F00401C8DF81F000AF12C01FFA8FF30
+193020F4ACF10AF12C0110A833F4FDF083469DF8180002
+90B0EE4C1A0AA80090F0EE6C1A03950195FFF7CBFD00F0
+BEFB00F0C1FB59464046FFF721FB00283FF47AAF9DF81B
+009AED0A0A401C8DF81B007AEE80AA9DED0A0BF4A803F0
+8EFBB4EE6DAAF1EE10FA1FDB00F083FB00F0F6FBFFF7BB
+F800F077FB00F0F7FB8346B8689CF4BDF216A903910246
+09A90291059514A901910495CDF800B09FEDCD0B3FAB00
+F057FB00F03DFBB8689DED27AA00F0CDFBFFF782FD0DD1
+00F037FB613020F44EF19DF819009AED0A0A401C39EE00
+9A8DF81900DDE90A010022DFF8183A10F438F60ED29DF8
+1E00401C8DF81E0040E700BF0000C64200000000000000
+00000000409DF81D00401C8DF81D0031E79DF81B000028
+0FBF9FEDB08A00EE100AB8EE400A8AEE808A9DF81A0000
+280FBFDFEDAA8A00EE100AB8EE400ACBEE008A9DF81900
+00280FBF9FEDA49A00EE100AB8EE400A89EE009A5FFA89
+F9B9F1000F0FBFDFED9E9A00EE109AB8EE400AC9EE809A
+00F0FFFA00F072FBFFF737F800F0F3FA00F073FB00F081
+FB00F027FB00F0C9FA27981090FFA9FF31613100F0EDFA
+00F05DFBFFF722F800F0DEFA00F05EFB00F06CFB00F012
+FB00F0B4FAFFA9FF319DED27EA193100F0D8FA00F048FB
+FFF70DF800F0C9FA00F049FB00F057FB00F0FDFA00F09F
+FA9DED27DA4046B4F478F48246FEF7FDFF044600F031FB
+FFF7E8FC00F034FB00F03EFB0121FFAACDF814A0049103
+95029501950346FF320094B0EE4A0AF0EE6A0A19324146
+64A8AFF42CF69DF81800002861D19FED690AB4EE40DAF1
+EE10FA0AD564A875F4AAF6FFF762F90EEE900A04E000BF
+01002041DFED5FEAB6A803F0A1FAFFF7B3FCF4A803F09C
+FA9DF81C000590B0EE40BA9DF81D000490F0EE60BA9DF8
+1E000390CDF804909DF81F0002909DF81900009051EC1A
+0B12F457F704EE100AF0EE6E4AB0EE44AAF0EE64AA51EC
+1B0B12F44BF703EE900A9DF820309DF81A209DF81B109D
+ED101AF0EE6A4AB0EEF19403A07981004A4AB0EE4D3AF0
+EE4E2AB0EE692AF0EE491AF0EE680AB0EE480A2DA803F0
+62FA0146404600F09CFB9FED399A0DF5D96A002417E01A
+A832F47FF70146B0EE4F0AF0EE6F0A4046AEF4A5F140B1
+00F01EFA00F002FAA93020F419F030365D460AF1300A64
+1C00F0EEF980F2C7809AF9100058B1022800F0AF8040F2
+9171FFF784F99AF91000002840F0A68000F089FA5FEA00
+0940F0A38000F0E5F94FF4B5F40028DDD0B9F1000F05F1
+010B0AF12C01C1D040F2346068441FF4E9F7B4EE6D9AF1
+EE10FA30DB40F23461694400F0ECF900F05CFAFEF721FF
+089000F0DDF900F05CFA8146B8689CF422F10246002005
+900490CDF8009016A803909FED010B0AE000BF00000000
+00409F4000000000010000400000C64208A802903FAB14
+A8019000F0AFF900F095F90AF12C0119A832F404F78146
+01200390B0EE4C1A9DF818000290F0EE6C1A38780190B0
+EE418A0AA80090F0EE618A19EE100A12F4D8F600F0C2F9
+49464046FFF722F900283ED000F08EF9DDE90C01DDE90E
+2310F482F41FD2387802281CD09DF81800C8B9DDE90E01
+DDE90C2310F4DBF641EC100B22F4E9F422F411F59FEDA6
+1B1FF4AFF3D6E90223FFF7D7FB41EC100B86ED020B8AED
+020B40F27C600AF12C0168441FF460F730365D469DED27
+9A43E74FF000095CE70DF580500AF12C01D0F84C0257E7
+40F234600AF12C01684437F496F531E79DF81C00002836
+D00DF5805649A8D6F848621FF430F740F27C61694400F0
+46F90DF5D96A0025002415E00AF12C013FA830F44FF660
+B100F02CF99AF9100030366D1C022804D10AF12C0149A8
+1FF421F70AF1300A641C00F0F8F8E6DBFFA9FF3149AAA9
+312DA8B9F416F2FFA8FF302DA9A9304EF4F8F10DF58050
+40F27C61D0F84C0269444EF4EFF10DF58050FFA9FF31D0
+F85002A9314EF4E6F100F0EEF8301A6DB290FBF1F08542
+03D040F2E471FFF76EF89DF81C00002800F0BA80786BD7
+F4BAF4FEF7A4F980F0B3803869A2F4EBF70078002803D1
+3869B8F431F3002840F0A7800DF5805151A8D1F84C1252
+F487F10DF580513FA8D1F8501252F480F1786BB4F4EBF1
+FEF79FFF3FAF51AE00EE100A3A463146404603F00EF951
+A968461CF45AF700F026F99DED390A9FED849AB4EE490A
+B7EE008AF1EE10FAF1EE048AA8BFF0EE489A08DA00F0C2
+F84EBFF0EE689AF1EE080A70EEC09A3FA968461CF43BF7
+00F007F99DED390AB4EE490AF1EE10FAB6EE00AAA8BFF0
+EE488A08DA00F0A7F84EBFF0EE088A38EEC00A60EE0A8A
+4FF00008DFF89864F19403307D81001EE09AF910000228
+18D10AF12C013FA881F418F290B100F05DF84FF42DF368
+B1F7EE000A28EE890A1FF4E4F2FEF796FDDAE9022310F4
+78F3CAE9020107F101084FFA88F7AF4228DA00F04CF817
+FB010A0AF12C001FF454F202280CBFB0EE4A9AB0EE489A
+9AF910000028CAD10AF12C0151A881F4E7F10028C3D00A
+F12C01304681F4E0F10028BCD000F0C2F80028B8D0F7EE
+000A29EE890AC6E702B00DF5905D2846BDEC108BBDE8FE
+8F0000000000000088C34098F96807E4B2844270470000
+2DA91BA8B0F4F0B1FFA8FF300AF12C01704700000DF580
+500AF12C01D0F85002704700000DF580503021D0F84802
+70470DF599612DA8B0F4B9B200005146304680F4B4B009
+9011A916A8BAF403B00000FFA9FF31F1313FA81CF492B6
+08F590501830BAF49FB00000B0EE480AF0EE680A72AA84
+A934A87047F7EE000AB4EE600AF1EE10FA704700000746
+1AEE100A12F415B5000041EC100BB0EE481AF0EE681A0C
+AB0EAA7047000041EC100BB0EE481AF0EE681A1FF446B2
+16A90391059509A90291049514A90191024600949FEDC3
+0B3FAB0DF599612DA8B0F468B200002440000010400000
+F83F0100A040000008403869A4F445B100003869B0F401
+B1000053EC102B51EC1D0B10F4AEB2B0EE408AF0EE608A
+34A875F4B1B3000000236A4641462DA8AFF4BAB7B86800
+2300220AF12C0180F41FB5000007464046B0F422B1B0EE
+408AF0EE608A4046B0F4C7B300000DF580500AF12C01D0
+F84C024FF42CB201462EA8A3F4D2B10446B8689BF4B6B6
+2DE9F0430C4604F12C018FB020788E78637C15460328A3
+BF6278032A012200225BB1277C00EE107A00EE903AB8EE
+400AF8EE600A80EE200A01E09FED8E0AD4ED090A4B78F5
+EE400AF1EE10FAC6BF94ED0A1AC1EE200ADFED870A5BB1
+097801EE101A01EE903AB8EE411AF8EE611A81EE211A01
+E09FED7F1A002A1DBFD4ED011A94ED022A71EEC21ADFED
+7A1A02EE100A6178F8EE423A02EE101AA17800291DBF02
+EE901AF8EE622AC3EEA22ADFED712AB8EE422AA17C33EE
+C22A59B1227C03EE102A04EE101AB8EE433AB8EE444A83
+EE043A01E09FED673A28B1207C00F05AF8C4EE233A01E0
+DFED633A00270FF28C18E946382202FB0781684611F4DB
+F299ED014A9DED005ADFED5B4A04EE245A304600F040F8
+D9ED024A207800F039F8D9ED034A207C00F034F8D9ED04
+4A607C00F02FF8D9ED054A04EE245A99ED064A04EE005A
+99ED074A04EE205A99ED084A04EE015A99ED094A04EE21
+5A99ED0A4A04EEF19403C0808100025A99ED0B4A04EE22
+5A99ED0C4A04EE235A99ED0D4A05EB87007F1C04EE035A
+032F80ED005AB4DB0FB0BDE8F083000004EE245A04EE10
+0AB8EE444A704700003EB504466A46FFF72BFF334DDDED
+000A95F9010095F900106B46421E93ED010AF4EE400AF1
+EE10FAA1BF93ED021AF4EE410AF1EE10FA491E0DDAD3ED
+020A491CF4EE400AF1EE10FA05DB9DED000AFEF739FD48
+BF421C29706A70002095F901101FF4B4F06870002095F9
+00101FF4AEF028700A2095F901101FF46EF068700A2095
+F900101FF468F0287094F8BC2A95F90110022A02D10129
+0CDB07E0012A03D1032903DA012804E0032901DB022004
+E0032801DB012000E0002084F8BC0A37BD0000F03F0000
+2E4050C991000000000000409F40000000009ECB910010
+AE6D40C19FB53F6CD3933FE68E993FFE86BD3FA5019DBE
+9F30D0BE13E0003EB9F354BE53F1503E4E359F3FE6CE79
+3E6E2188BEFBE418BE3B2D72C02A0CA2BF839F42BF9E75
+98BFED27A4BF0AEF983E0CCA953E09298CBDD241393ECB
+503BBE21292ABFE3AFA5BE7A806C3E8475823E60BFA2C0
+30D8BDBFA316D1BFE4484EBFBD5083BF88C0583EAB5713
+BF17CF16BE9622503E5486CDBDE6459ABF03A9DCBE8041
+143EB74F2E3E2DE9F84F2DED068BADF6184D8046DDF858
+5CA868400800F001008A4614461F46009008F5C079DDF8
+643CDDF8602C9DF85C1CB0EE408AB0EE419AF0EE619A48
+46DBF466F50DF51A60B3F4D6F79FEDCA0AB4EE408AF1EE
+10FA4CBF0126002621466846A3F409F00346B0EE491AF0
+EE691AB0EE480A5246414636A8D5F4C7F000F077FA10A8
+AEF434F404A8B3F43FF6287AC00706984EBF40F0010040
+0840000690DFEDB68A287A400706984CBF40F0800020F0
+80000690002E069814BF40F0100020F0100006906CA8B3
+F464F30146D8F8C0014FF47A732246B3F432F4C0B10698
+40F00400069003203874012087F824009DED700B87ED00
+0BB0EE680ADDED720A1EF4CEF710EE100A12F48EF2C7E9
+020108F1C006B068CBF445F001903B4600200090726831
+680BA8B3F45CF704A907A8B3F4F6F50390CDF808A00194
+009773683268B0EE490AF0EE690A76A95AA8B3F4EDF500
+F00DFA00F00FFA07A81BF47CF636A81EF41DF2297A0024
+C9074CBF08210721884206DB07AB36AA76A94046D5F411
+F2044607A94046D5F4DEF236A976A8AEF41CF583460121
+76A8AEF449F500F041FCBBF1000F08EE100A41D0594610
+A8AEF436F400F0DCF906989DED2A0A40F480700690DFED
+DE0A20EE200AF1940350848100BDEEC09A04A908A8B3F4
+A4F503908DED029A10A8019000972B9812F41FF241EC10
+0B7368326876A948A8B3F499F5002100910023032236A9
+AEF4E4F536A976A8AEF4DEF40700069820F48070069009
+D0394610A876F4C8F7F86E2B90386E2890786E29907CB1
+07A94046D5F487F200F099F900F09BF9012176A8AEF4F3
+F400F0EBFB08EE100A10A8B9F49EF4002800F0648101A8
+B8F472F5297A039849074EBF40F0010040084000039001
+A9039840F40020039008A8B8F471F500902B9812F4CDF1
+41EC100B0C23524610A948A8B8F46BF501469FEDA40B0D
+F51A6336AA0BA8B5F4F8F200285AD04846DBF4CFF40028
+55D04DF804CD0DF500605DF804CB90ED6B0B1EF449F74D
+F804CD0DF50060B0EE409AF0EE609A5DF804CB90ED690B
+1EF43BF753EC192B51EC100B10F43FF012F44DF100F02B
+F9B4EE490A40F6A810F1EE10FA68444CBF01270027D0E9
+0A23416A006A10F42BF012F439F100F017F9B4EE490AF1
+EE10FA4CBF012000204DF804CD0DF54061DFED7E0A91ED
+000A5DF804CBB4EE600AF1EE10FAACBF01210021384380
+F00100084304BF4846DBF479F430689BF46CF300240746
+A24606E032A5C24A00004842BAF1060F08D0B0687EF4E0
+F25146D0F42FF440B100240DE0B0687EF4D7F20621D0F4
+26F404460AF101005FFA80FABAF1070FE5DB287A8007B6
+EE009A04D4DFF83806874200D24CB19FED5E0AB4EE408A
+F1EE10FA08BF9DED2C8A10D09DF81800B0EE490AC007DF
+ED580A48BFB6EE040AB4EE608AF1EE10FA48BF28EE008A
+4846DBF42AF4002823D04846DBF42BF4014610A876F4AB
+F0B0EE40AAF0EE60AA4846DBF422F400F092F80ED2B4EE
+688AF1EE10FA09D59DF85C0C0328484602D1DBF417F401
+E0DBF40AF44846DBF405F400285FD04846DBF408F400F0
+78F848464CD2DBF40AF420B94846DBF408F4002850D148
+46DBF401F4D8B951EC1A0B12F48CF000EE100A20EE098A
+00F06CF88DED2C0AF0EE480A9DED2E0A1EF402F68DED2E
+0AF0EE480A9DED2F0A1EF4FAF58DED2F0A4846DBF4E5F3
+88B14846DBF4E3F3B0EE408AF0EE608A4846DBF4CCF301
+46B0EE480AF0EE680A10A8AEF4CEF24846DBF4CBF3D0B9
+4846DBF4BDF3014610A876F43DF000F097FA2C900FE0DB
+F4C7F351EC100B53EC1A2B0FF449F63CBF4846DBF4C1F3
+00F027F88DED2C0A0DF51A6210A9404600F031F80DF618
+4DBDEC068BBDE8F18F0000000000000000F0BF01008040
+00007A4400007A4500803B4553EC102B51EC1A0B0FF422
+B609EE100AF19403E0878100B1EE000A1EF4FCB5F0EE48
+0A9DED2C0A1EF498B576A8D4F475B10000012000900023
+012236A95AA8AEF4EAB42DE9F8432DED108BA4B0804600
+20039004900C4615460CA8A2F46AF504F16006DFEDCC9A
+F06805909FEDCBBB4046AFF445F79FEDCBAA90ED00CB40
+46B1F45AF5B0EE409A2046B9F4E1F20028B0EE698ADFED
+C48A08F1C00700F03381306912F41FF041EC1B0B706912
+F41AF041EC1A0B95ED0ADBDFF8081453EC1D2B00200FF4
+8FF500F09B8051EC1D0B11F4C1F708EE100AD5E90C0111
+F4BBF700EE100A38EE008AB4EE698AF1EE10FA40F18780
+01214046B2F4EDF2D5E9020111F4A9F709EE100AD5E900
+0111F4A3F700EE100A20EE000A09EE090A21F441F6DFED
+ED0AB4EE600AF1EE10FA8DED030A36DB95ED001B95ED02
+0B21F4FAF500F0D0F90490D5E9020111F485F700EE100A
+1EF463F5D5E90001F0EE408A11F47BF700EE100A1EF459
+F5B0EE409A9DED030A1EF453F51EF451F5D5E90A01B0EE
+40CA11F469F700EE100AD5E90C0160EE288A11F461F700
+EE100A40EE098AC8EE8C8AD5E9080195ED06CB11F455F7
+00EE100A21F4F7F551EC1B0B0022BF4B0FF44DF5B0EE40
+9A1DD2B868CAF44BF5814619EE100A11F488F700F068F9
+41EC110BB0EE41DAF0EE61DA51EC1C0B00F05EF941EC10
+0B0021B0EE4D1AF0EE6D1A484694F456F1B06811F46FF7
+D7E904230FF4CBF621F00041AA4AAA4B0FF4FBF49CBFF8
+68B2F457F0214606A8A2F485F4814651EC1A0B11F410F7
+0AEE100AD5E9080111F40AF704EE900AD5E90601F0EE64
+AA11F402F704EE100AF0EE6A4AD6ED083A96ED033A9DED
+042A9DED031AF0EE682AF0EE481AF0EE4A0ACDED000A8D
+ED011AF0EE61AAB0EE42DAF0EE62DAB0EE43EAF0EE63EA
+B0EE44FAF0EE64FA51EC1B0B11F4DAF600EE100A002300
+22F0EE6F4AB0EE4F4AF0EE6E3AB0EE4E3AF0EE6D2AB0EE
+4D2AF0EE6A1A9DED011ADDED000A494612A8B5F4D0F506
+A80190CDED069A03A8009005AB04AA0CA907A8B5F4FEF5
+38689BF409F10146002002900190009007ABF86812AAB5
+F47DF7B06811F4ECF6C7E9040104F1180108F1DC004DF4
+8EF2F06A78662046B9F495F140B151EC1B0B0022654B0F
+F492F438BF012000D30020387696ED000AB5EE400AF1EE
+10FA08BF9FED5E0A87ED1A0AB0EE680A21F422F5F0EE40
+8AB0EE480A21F41CF53868B0EE408A9BF4C9F004460020
+01900090DFED577A9FED567AF0EE686A9DED046A96ED08
+3A05989FED4E5B0AE000BF0000C84300000040A6545841
+32A5C24AF19403708B810000247449F0EE493AF0EE438A
+F0EE63AAB0EE459AF0EE659AB0EE46DAF0EE66DAB0EE47
+EAF0EE67EA11F488F641EC120BF0EE6E7AB0EE4E7AF0EE
+6D6AB0EE4D6AB0EE495AF0EE695AF0EE6A3AB0EE4C4AF0
+EE6C4AB0EE683ADFED351AB0EE481AF0EE4A0ACDED020A
+F0EE41DAB0EE61DAB0EE429AF0EE629AB0EE43CAB0EE44
+8AF0EE648AF0EE63CAB0EE45AAF0EE65AAB0EE46EAF0EE
+66EAB0EE47FAF0EE67FA51EC1B0B11F402F600EE100AF0
+EE6F7AB0EE4F7AF0EE6E6AB0EE4E6AB0EE4A5AF0EE6A5A
+F0EE6C3AB0EE484AF0EE684AB0EE4C3AB0EE492AF0EE69
+2AF0EE4D1AB0EE6D1A2B46DDED020A0CAA21464046B1F4
+5CF424B0BDEC108BBDE8F18300004FF094420B4B0FF439
+B60000915F010000004940FB7E6ABC7493883F00007940
+0000C642000000000000000018B7D1380000000078DEB1
+4151EC100B11F4B6B5012180F83A107047B83070470021
+8160416001607047000070B504462DED068B74F49AF4B0
+EE40AAF0EE60AA204691F447F79FED1C8BB0EE489AF0EE
+689A0546012616E031B2204677F4D4F753EC1A2B416800
+680FF432F541EC100B53EC102B0FF4A2F353EC192B0FF4
+70F441EC190B761C204691F424F7B042E3DA022D0ADB68
+1E0FF403F502460B4651EC190B0FF4D5F541EC180BB0EE
+480AF0EE680ABDEC068B70BD000000000000000070B504
+460D46681E164604283CBF701E042804D325210FF21000
+E7F793FC04F180000580468070BD70617463685F676C70
+655F6D61747269782E63707000000030B50C468BB00546
+206811F481F5CDE90801606811F47CF5CDE90601606811
+F477F5CDE90401A06811F472F5CDE9020104AB02A80090
+06AA08A9284673F464F20BB030BD10B51CC91CC00C3810
+BD0000D0ED010A90ED020A90ED001A60EEA00A41EE400A
+80EE200AB1EE400A81ED000A90ED010A80EE200A81ED01
+0A90ED000A80EE200AB1EE400A81ED020A0120704780B5
+00F0E9F81E280CBF0120002002BD10B5044604F1100073
+F4E0F104F1980000F034F904F1A40000F030F9204610BD
+10B5044687F4A0F09FED152B9FED141B9FED130B04F118
+0075F428F10F48206304F1340000F01AF904F1400000F0
+16F90020E06520666066A066E06604F13400FFF70EFF04
+F14000FFF70AFF0020A06560652065E064204610BD00BF
+FF2292FF000000000000000038B504460D4600F09BF885
+4203D3C9210848E7F7E3FB94F9140045FA80F01E21B0FB
+F1F11E2202FB1100702101FB0040183032BD00B1810070
+B50446F19403008F81000E4676F499F206F1180104F118
+00B8F481F0306B206306F1340104F13400FFF75FFF06F1
+400104F14000FFF759FF04F14C054C3628463146102210
+F47BF33069286170696861B069A861F069E861306A2862
+204670BD000080ED000AC0ED010A80ED021A7047000010
+B5044600F002F8204610BDF8B504460D46AC4216461C4F
+03D16E213846E7F78BFBB44203D16F213846E7F785FB95
+ED000AD6ED000A96ED011A20EE200AD5ED010A00EE810A
+84ED000A95ED000AD6ED010A96ED021A20EE200AD5ED01
+0A00EE810A84ED010A95ED010AD6ED010A96ED021A20EE
+200AD5ED020A00EE810A84ED020A2046F2BD00BFDC6D80
+0080B500F005F8401E8041C00F02BD0000807D70472DE9
+F0412DED068B0D460C9F0D9E044611469846B0EE408AF0
+EE608AB0EE419AF0EE619AB0EE42AAA2F464F1414604F1
+1800AFF45DF02563394604F1340002F025F8314604F140
+0002F020F884ED17AA84ED189AC4ED199A84ED1A8AC4ED
+1B8A00210E9804EB810250F82130D364491C0429F7DBBD
+EC068B2046BDE8F08100000878401C40B21E2808BF0020
+0870704700210170416001727047000000F5E050703000
+22C0E90222026042607047000010B50446FFF7FEFD2046
+10BD002918BFD1F4CEB1704700002DE9F0478846914604
+461AF4F5F704F5985721F4F7F289374FF0000A41F68A15
+41F6891609E01AF80800C02803D103203055002028530A
+F1010ACA453FD2305D0028F0D0022803D011D303282BD0
+F2E71AF80800C02802D101203055EBE7295B4A1CB1F5C0
+6F2A53E5D2C855E3E71AF80800C42807D12A5B39462046
+00F022F800203055D6E7C0280AD1295B0846421CB1F5C0
+6F3CBFC021C1552A530220DCE7C12804D0ECE71AF80800
+C12802D100202853F3E7C028BED000202853CDE7BDE8F0
+8700002DE9F04104460D0082B0164640F2036008D18642
+01D2002E34D02368F43300229B6B2DE0082E0AD3F10701
+D486420BD323682988F43300229B6BC9B220E02368F433
+00229B6B1AE02768D7F8F4706B4629462046B84730B923
+682988F0330022DB6BC9B20CE02368D3F8F030B61E00F0
+C7F8984738B92368D3F82C310022002120469847B9E028
+88032804D1EA88511E8941C90F00E00021032804BFEA88
+0A2A09D101220020114350EA010704BF6068002808D1A1
+E00022032804BFE8880B28F0D10120EFE7A0680028F3D0
+04F5D850FA30BDF80010017129880180468048F2831128
+88884203D129462046D9F4B4F041F6B818334658F80400
+D0F8F194039092810000C0DCF894C02A462146E0470028
+73D129880A46A2F50140FF2812D858F8040006686A8836
+6C931F9BB2AA1DB047288848F28E1188425FD129462046
+D9F48CF05AE00FF2C8502FB1032931D0DA21E7F7DFF92D
+E061680A291FD1032A0CD0062A2DD048F202039A4213D1
+00F04FF85B6E29462046984742E004BFE988042906D122
+68D2F8002100212046904710E0F12100E0F921E7F7BCF9
+2EE0032A08D0062A0DD0092A12D0102A17D0172A1CD023
+E02368D3F80C3100F025F898471CE000F025F81B692946
+2046984715E000F01EF89B692946204698470EE000F017
+F85B6A29462046984707E000F00CF8D9F482F000F008F8
+FAF7B4FB2046D1F483F1BDE8F381000032462946204670
+47236803F58073324670470000F8B504462DED048BA068
+0D46016B01B10D466668F6B10168096A8847A068016809
+69B0EE408AF0EE608A8847B0EE409AF0EE609A51EC180B
+0FF480F187B251EC190B0FF47BF182B230463668F6693B
+462946B047A0680563BDEC048BF1BD000030B5044641F6
+5C4087B0005DF2F7DAFC072104A810F4D8F0002041F650
+3104AA04EB4003CB181D885DB11B8C0BB9012306E0012B
+08BF022302D0022B01D103238354401C0328EBDB04F5CE
+50006890B109190A88012A0CBF00220122CB8F03938B8F
+02938B6B01934B6B009304680B6BA46B04A9A04707B030
+BD00002DE9FE4F044604F598552DED068B6C3504F5C857
+82B08A46B837C5F804A07868DDF850B0B0EE408AF0EE60
+8A38B1CDF800B006680A9B9DF82420B66AB04738680268
+926F514690470A980668D0F80480BBF1000F09D117E053
+EC182B002095490FF48AF041EC180BC84651EC180B0022
+914B0EF46FF708F10109EDD90FF406F18619864238BFC8
+46C5F800A0AE60A5F80C8038690FF28039016889698847
+28616068012812D0052809D004280ED0032816D1BBF100
+0F19D140F2951112E0B86820B10268D2F8B02000219047
+2868A86001220020A88100212046D2F451F1A3E040F2DD
+114846E7F799F89DE01FFA88F1701A398C10FA81F0796A
+401A0FF4E6F0002200230EF426F741EC190BB0EE49AAF0
+EE69AAE9D2786C40420FF4CDF0674A674B0EF457F753EC
+192B0EF453F7002200230EF40FF741EC190B0DD2614A62
+4B0EF42CF708D2AE680FF4A0F08019B0421CD2A989491C
+18E0002200230EF41EF715D26FF40012594B0EF4F4F60F
+D853EC192B002056490EF42DF7AE680FF486F0301A03D2
+A98911B1491EA981A8603D8F002D49D051EC1A0B4FF000
+52F19403209681004D4B0EF4FDF63FD204F5E0500022C0
+F800A051EC1A0B494B0FF458F10FF452F046193E8780B2
+FD6B0FF482F00022434B0EF402F702460B4651EC1A0B0F
+F486F00FF456F04519FD6353EC1A2BD7F840803B490020
+0EF4F0F600223A4B0EF4BEF70FF446F000EB080337483B
+64854204D3701C388735484019F86338680568FA6B398F
+2D6DA84701E00020388704F5C8500021D030D6F480F1A0
+6804282DD100200190606801280BD138680268D26E01A9
+904728B94FF4F5714846E6F7E1FF0CE02046D2F45BF0A0
+682568D5F8305182B2606881B200232046A847CDF800B0
+204624680A9B9DF82420D4F84441B0EE480AF0EE680A51
+46A04709E06068052818BF042804D040F2FD114846E6F7
+B9FF02B0BDEC068BBDE8F78F0000F0C10000F04195D626
+E80B2E113E0000E0FFFFFFEF41FFFFEFC10000F0BFC729
+2C424206C24100005940000018C000840C24007CF3DB10
+B5C824F9F7B8DFFAF712D820B90120E6F740DF641EF5D1
+10BD000070B5044604F5C85656F8BC0F10B10168496B88
+47A06804F5C855D035C8B1B062012141F28230005BB084
+2846D6F4FEF001206073A06803280BD1FFF7D3FFA06882
+B2606881B220462468D4F830410023A0472846BDE87040
+D6F40EB180B541F6BC11085810B10168C96D8847BDE804
+4040F23A210CE0000080B541F6BC11085810B10168096E
+8847BDE8044040F246210FF27C00E6F73EBF7047000070
+B5888800248C80921E1C8004E011F8016BAD191D80641C
+1D889442F7DB85420CBF0120002070BDF8B504460D4600
+20A880164606EBD6704010B6EB400005D040F269210FF2
+2C00E6F716FF2F460020002104E017F8012B801880B249
+1CB142F8DBA88020462168D1F8FC1088473880F1BD0000
+70617463685F676C6D655F706569665F696D706C2E6370
+700000000016F4CFB500F50850DC30704710B500F69450
+00210022002300241EC010BD000091ED000B80ED000B91
+ED020B80ED020B91ED040B80ED040B7047000010B500F1
+580100220A709FED210B01224A7000228A608A700122CA
+7000220A7101224A7100228A710122CA71002200EBC203
+03F67804521C84ED000B03F6181403F6B81384ED000B14
+2A83ED000BEEDB00F50462002393625362D36213631372
+D360136100F65820DFF88033536100239361D36181ED04
+0B136213709370D370DFF86C231370037103604371C371
+10BD00000000000000002DE9F0410E462DED048BB0EE40
+8AF0EE608AB0EE420AF0EE620A0F2E84B005461746B0EE
+F19403B0998100419AF0EE619AB0EE432AF0EE632A9846
+2EDBB5F499F71398119C0290019443460F980090B0EE49
+1AF0EE691AB0EE480AF0EE680A3A4631462846B5F4BDF6
+1298039002944346109801903A460E980090B0EE490AF0
+EE690A31462846B5F4E8F604B02846BDEC048BBDE8F041
+B6F46AB004B0BDEC048BBDE8F08100002DE9F84F2DED02
+8B5FEA010A8046B0EE408AF0EE608A914614D00C9800EE
+100A00EE90AAB8EE400AF8EE600A80EE200ADFED9E0AB4
+EE600AF1EE10FA54BF0026012621E001260125DFF86CB2
+9BF8000008F6420788B900F01BF907D936B9BAF10C0F0A
+DA4046B5F427F530B12D2000F015F900D90DB12D207870
+08F15A042079012818BF002008E0DFED890AB4EE600AF1
+EE10FAD7D40025D6E7BAF1000F4FD09BF800105A2904DB
+2178002918BF002846D100F0EDF807D936B9BAF10C0F23
+DA4046B5F4F9F4F8B100F0CEF800F0E6F807D935B9BAF1
+080F0EDA4046B5F4ECF450B100F0C1F838705A21787840
+1C787040B21DF49BF317E07878401E7870002140B21DF4
+CDF30FE000F0A6F800F0B4F87870002251EC180B684B0E
+F46BF404D200F09AF800F0A8F878705A219BF80000401C
+8BF80000C0B21DF48CF38BF8000097F901001F28A8BF03
+260ADA97F900001F28A8BF022604DABAF1000F14BF0126
+26784046B1F4E8F1B5F4AAF407462078072808F6580555
+D8DFE800F0040D182631313B4E00F080F818BB5FFA89F0
+28B9012F33D03AE05FFA89F008B107203FE0012F2BD000
+F070F898B92FE0012F04D1052020700298686004E000F0
+65F828B306202070002025E0012F17D000F05CF808B106
+2024E0032E267029D01AE000F053F818B1062020700020
+0AE0012F1FD00CE0012F07D100F047F820B90520207002
+98686014E000F03FF888B9032E26700ED1029828600BE0
+5FFA89F040B90020207005E040F239110FF29C00E6F722
+FD0299B0EE480AF0EE680A4046B6F4B4F12078012804D1
+98F85E0A08B102202070BDEC028BBDE8F18F3878401E38
+70002140B21DF41DB300003878401C38705A2140B21DF4
+DBB20000387000217878401E787040B21DF40CB34046B6
+F4DBB2000051EC180B00220A4B0EF488B33870002251EC
+180B074B0EF481B300000100403F0100003FE0930400A1
+CB910000001440000024400000344070617463685F676C
+70655F636F6E746578745F6D67722E6370700000704700
+002DE9F0412DED028B04460D46ADF59A6D90461F462846
+1CF47BF50D2804DB3B210FF2D460E6F7B2FC002084F8F1
+9403409D81004C0028461CF46EF504283CDB00269FED4B
+8A68461DF45CF6014614A86022F0EE482AB0EE482ADFED
+DA1A9FEDD91ADFEDD80A9FEDD70A02FB0600B9F4EBF276
+1C0C2EE6DB14A801902046B7F4D5F0294602A850F401F1
+02460097434601A92046B7F4F6F1019814A9401A602190
+FBF1F3DBB2022B07DB2A4614A9204600F060F8012084F8
+4C0094F84C000DF59A6DBDEC028BBDE8F081000070B51C
+4698B01346DFF8B865266068461D4612B99FEDB80A41E0
+012A08BF91ED000A3CD0002204E051F8226040F8086B52
+1C9A42F8D3DFF8C83508222946684690F4AEF605EBD570
+4008B5EB4002694610D16A4602EBC002083A01EBC00092
+ED000AD0ED000A30EE200AF6EE000A20EE200A08E0681E
+00EBD070C003000C51F8300000EE100A684600EBC50008
+389DED001AD0ED000A70EEC10AC4ED000A18B070BD0000
+0000C843F8B52DED0A8B0646B2B00D4610461F461CF4C8
+F4044600200EE001A9AA6C41F8202001EB8001EA6C41F8
+302F401C2A6D0A636A6D0A666035B842EEDBDFF8DC0400
+906B463A4601A900F010F900F09AFAC6E90401009810F4
+E9F4C6E90C016B463A460DA900F002F900F08CFAC6E906
+01009810F4DBF4C6E90E013046B4F480F3B0EE408A9FED
+730AB4EE408AF1EE10FA0FD596ED0C1B9FED700B1DF40B
+F286ED0C0B9FED6D0B96ED0E1B1DF403F286ED0E0B6B46
+3A4625A900F0D8F886ED0A0A64B20098B064052C0CDB6B
+463A4619A900F0CCF800F056FAC6E90801009810F4A5F4
+04E00020C6E90800DFF83414C6E910013B460DAA01A930
+4600F0B9F89FED580AB4EE408AF1EE10FA54DB96ED0C0B
+1DF42AF2B0EE409AF0EE609A96ED060B1DF422F2B0EE40
+AAF0EE60AA96ED0E0B1DF41AF2B0EE40BAF0EE60BA96ED
+040B1DF412F2B0EE40CAF0EE60CAB0EE480A1DF406F21D
+F404F2F0EE408A53EC192B51EC1A0B0EF438F204460D46
+53EC1B2B51EC1C0B0EF430F222462B460EF4FEF204460D
+4618EE900A10F450F402460B46204629460EF46AF410F4
+00F400EE100A20F4A2F2DFED2F0A60EE200A96ED150A1D
+F478F101E09FED2C0A86ED150AD6E910010022D64B0EF4
+EBF107D23A46B0EE480A19A93046B7F4E1F302E0D148B2
+65F0659FEDD10B96ED0C1B1DF463F186ED0C0B9FEDCD0B
+96ED0E1B1DF45BF186ED0E0B9FEDC90B96ED101B1DF453
+F186ED100B9FEDC70AD6ED120A1DF443F186ED120A9FED
+CF8AD6ED150AB0EE480A1DF439F186ED150AB0EE480AD6
+ED170A1DF431F186ED170A32B0BDEC0A8BF1BD0000F194
+03D0A08100000000009B99193E333333333333C33F9A99
+193EE12E654200003443304673E62DE9F94F81B088462D
+ED0E8BA8B09246DFEDB48A9FEDB3CADFEDB2CA9FEDB1DA
+DFEDB0DA002400259FEDA69B9FEDA7AB0DF170091CE008
+EB8500D0ED000A0AEB850090ED000A20F4E1F100F063F9
+00F053F910F46BF349F8250010F4AFF300F04FF951EC10
+0B10F461F349F825006D1C9DF8E0008542DED304AD0026
+9FED99EA00279FED94BB28E05F4513D009EB87009FED92
+1A90ED000ADFED920A20EE010AADF440F7DFED8E0A20EE
+200A1DF4F2F03EEE00EA0BF1010B9DF8E0008345E3D3B5
+EE40EAF1EE10FA04DD85ED00EA6F600835761C9FED83EA
+7F1C9DF8E000874260D20AEB870090ED000A1DF401F108
+EB8700B0EE408A90ED000A1DF4F9F038EE000A20F4B9F1
+08EB8700002CD0ED000AC0EE800A0AEB870070EEA88AD0
+ED000A59F8270080EE800A30EE0CCA03D10DEE900A0124
+33E010F441F353EC1B2B0EF413F110F4F3F200EE900AB0
+EE608A1DEE900A10F433F353EC1B2B0EF405F110F4E5F2
+00EE100AF0EE480AADF4DBF600F0D1F800F0C1F810F4D9
+F208EE100AF0EE480AB0EE6C0A1DF455F0F0EE40CAF0EE
+480AB0EE4D0A1DF407F0B0EE40DA4FF0000B89E7F0EE68
+0AB0EE4C0A20F42EF100F0B0F800F0A0F810F4B8F210F4
+FEF2CDE900018DED029B022202A9684674F473F7B0EE40
+BAF0EE60BAB0EE4D0A1DF459F030EE2C8A51EC1B0B10F4
+9FF237990865B6B231460329F6EE008A40DB3A4B082204
+A890F440F404ADF007686808EB8000D0ED000A68680AEB
+800090ED000A04D520F4F3F010EE100A19E020F4EEF0E8
+6808EB8000B0EE40BAD0ED000AE8680AEB800090ED000A
+20F4E0F0F0EE400AB0EE4B0AADF466F600EE68BA1BEE10
+0A10F4ACF200F048F810F460F210F4A6F200F046F851EC
+100B10F458F23799086528EE280A379880ED150A1DF403
+F0DFED170AB4EE600AF1EE10FA02D537981549416528B0
+BDEC0E8BBDE8F78F0000C842000039400000B4428DEDB5
+A0F7C6B03EBD378635000000000080764000C2631ADCA5
+4C40349D52A246DF913F35FA8E3CE12E654200000000ED
+110D0001000034E05070380000344353EC1A2B0EF434B0
+CDE902018DED009B0222694602A874F4D3B6000010EE10
+0A10F450B270617463685F676C70655F6465616C732E63
+7070000000002DE9F84F2DED108BADF59A6D82469946AF
+F4DCF149465046AFF4B8F0494650460AF58075AEF4B2F7
+686AB0EE40AAA0F4F5F3007890B94846B0F4EEF2F19403
+60A4810051EC100B0122DFF808390DF4B5F707D8DFEDD0
+0AB0EE4A0A1CF40EF7B0EE40AA95ED009B9FEDC78B8DED
+048B09F5D866A86810F40BF2CDE9020100F0C7FC007801
+2807D100F0BEFC007818B9F07A80F0010400E00024686A
+B0F454F5B5F40EF04FF0000818B1686AB5F406F7804600
+F0B1FC9FEDA3FBB1F473F20027B0EE4FEAF0EE6FEA38B9
+00F0A5FCB7F437F33168884200D37CB100F09DFCB7F475
+F631688142F0EE68EA06D3686AADF4F1F50078052808BF
+012700F089FC0078072808BFF0EE68EAF17B5046AEF42E
+F728B1DFF84408DFF84418CDE90401307BA8B100F071FC
+007888B900F071FC0078022804D000F06CFC0078032807
+D153EC192B51EC1F0B0DF479F741EC190B00F05BFC40F2
+E93B007801280FD1306858450CD300F047FCB0EE491AF0
+EE691A02D29FED760B13E09FED770B15E000F044FC0078
+022817D13068584514D300F032FCB0EE491AF0EE691A04
+D29FED700B1CF475F603E09FED6F0B1CF4B6F6B0EE409A
+F0EE609A19E000F02FFCB1F4F3F1A0B9686AADF487F500
+7805280ED100F020FC0078012809D1DFED650AB0EE4A0A
+1CF493F6F0EE68EAB0EE40AA9FED61BB00F0FBFB00F0E5
+FB99F8E80600F0DBFB18B300F00AFCB1F4CEF101281DDB
+707C00281CBFB07C002817D01AEE100A10F438F1D6E906
+230DF40AF700F0CAFB00F0C2FB96ED080B1CF4CAF653EC
+102B51EC1C0B0DF4CEF741EC1C0B8DED008BB0EE48DA00
+F0DAFBF0EE68DA007801281ED109F1C000B0F4DDF151EC
+100BDFF8F426DFF8F4360DF4C7F69FED40DB38BFF0EE6B
+DA13D3707C88B153EC1E2B51EC1F0B0DF4D5F69FED3BDB
+41EC1E0B06E000F0B4FB0078022808BF9FED2DDB00F0B5
+FBB1F479F1012808DB707C00281FBFB07C0028F0EE6BDA
+8DED00FBB07A08B19FED30DB00F06AFBB0EE4C0AF0EE6C
+0A1CF41CF600F068FB00F070FB53EC102BDFF87806DFF8
+78160DF4A2F641EC1F0B00F064FBB07A00F04BFBDFED0E
+AA00284FD04846AFF4DCF5B4EE6A0AF1EE10FA05DA4846
+AFF4D4F500F0FEFA38DB53EC1C2B00F057FB41EC1F0BB0
+EE4CDAF0EE6CDA36E00150C347000000000000D03F0000
+00000000144000000000000014C0000000000000244000
+000000000024C0C2B8B23D000000000000E03F00000000
+000008400000000000000040000000000000F03F000000
+0000002540920A863E53EC1D2B0020DFF8CC150DF449F6
+41EC1D0B00F033FBB1F4F7F001280BDB707C00281CBFB0
+7C002805D053EC1F2B00F009FB41EC1F0B00F0F19403F0
+A7810019FB007878B900F019FB0078022804D000F014FB
+0078032805D1707B18B1B0EE4CDAF0EE6CDA012100F012
+FB032180ED00CB00F00DFB022180ED00FB00F008FB8346
+53EC1E2B51EC1C0B0DF40DF6CBE90001B8F1000F18BF8D
+ED00DB00F0F7FA80469DED001BB0EE4D0AF0EE6D0A1CF4
+69F588ED000B6FB1022100F0E9FA074600F0E5FA416800
+68D7E900230DF4BEF6C7E9000100F0D6FAB1F49AF00028
+48D0052100F0D5FA416800680FF4BFF700EE100A1FF461
+F69FED891BB0EE41DAF0EE61DA00F0B3FA0022DFF8EC34
+0DF4CCF541EC100B00F07EFA1CF4EEF400F074FA00F0B5
+FA416800680FF4A0F700EE100A1FF442F6B0EE40EA51EC
+1D0B0FF496F700EE100A1FF434F62EEE000A00F08EFA00
+F06CFA00F058FA022100F099FA0546022100F095FA00F0
+55FA00F025FA85ED000B052100F08CFA0546B0EE4A0A1C
+F457F500F073FAC5E9000100F053FAB0EE409AF0EE609A
+9DED040B1CF44DF551EC100B53EC192B0DF47FF541EC19
+0BB07AE0B14846AFF4C0F4B4EE6A0AF1EE10FA05DA4846
+AFF4BCF400F0E2F902DBB2EE040A01E09FEDD40A00F048
+FA53EC192B0DF462F541EC190B9FEDD08B062100F04FFA
+054651EC190B0022DFF8FC330DF49DF7C5E90001062100
+F042FADDE90423054600F01BFA00F009FAB0EE40AAF0EE
+60AA062100F034FA074653EC1C2B51EC1A0B0DF439F541
+EC110B97ED000B1CF4A1F485ED000B072100F022FA0546
+00F001FAC5E90001082100F01AFA092180ED009B00F015
+FA00F09FF900F0E9F9C5E900010A2100F00CFA00F096F9
+53EC102B00F0E4F9C5E900010B2100F001FA00F08BF900
+F0D5F9C5E9000164B1092100F0F7F90546092100F0F3F9
+9FEDCD1B00F083F985ED000B707A00285ED1012100F0E7
+F90546012100F0E3F99FEDC71B00F073F985ED000B00F0
+DAF900F0D7F99FEDC21B00F069F985ED000B022100F0D0
+F90546012100F0CCF9082100F01BF900F0C7F9BB4A4168
+0068BA4B0DF4B1F427D2082100F0BDF9B64AB64B03E011
+2D4454FB21F93FC0E90023062100F0B1F90546082100F0
+ADF9002241680068AE4B0DF4FDF6C5E90001072100F0A2
+F90546082100F09EF9D0E9002300F078F9C5E900010521
+00F095F900F091F9032100F0E2F800F08EF90022C0E900
+22012100F088F90546012100F084F900F014F985ED000B
+00F07DF900F07AF900F00CF985ED000B022100F075F905
+46022100F071F900F001F985ED000B052100F06AF90546
+052100F066F900F0F6F885ED000B062100F0F1940380AB
+81005FF90546062100F05BF900F0EBF885ED000B082100
+F054F90546082100F050F900F0E0F885ED000B092100F0
+49F90546092100F045F900F0D5F885ED000B0B2100F03E
+F905460B2100F03AF900F0CAF885ED000B06A88FF4BBF7
+0822082171F445F7012200F0B4F80546012100F028F902
+2200F095F800F021F9032200F072F8032106A876F45EF0
+0546022100F018F9042200F067F8042106A876F453F005
+46052100F00DF9052200F082F80546062100F006F90622
+00F06BF80546082100F0FFF8072200F05CF80546092100
+F0F8F8082200F04DF805460B2100F0F1F8022200F040F8
+00F074F80546032100F0E8F8012200F055F80546022200
+F069F8082200F03EF805460A2100F0DAF8072200F02FF8
+05460822072106A876F413F0062200F046F80546072100
+F0CAF8052200F02FF80446062200F03FF86F2190ED000B
+84ED000B06A8AFF41FF30DF59A6DBDEC108BBDE8F18F00
+000000C8430000000000407F4090ED000B85ED000B7047
+000090ED000B85ED000B082106A875F4E2B790ED000B85
+ED000B072106A875F4DAB790ED000B85ED000B062106A8
+75F4D2B790ED000B85ED000B022106A875F4CAB790ED00
+0B85ED000B052106A875F4C2B7DFED1A0AB4EE600AF1EE
+10FA70470000012106A875F4B6B705469DED020B1CF443
+B300009FED121B90ED000B1CF4E2B20000F83F9A999999
+9999C93FEE7C3F355EBAD13FD1DCFFFFFFFFDF3F000059
+4000000000000010407B14AE47E17A843F7B14AE47E17A
+843F000008400100FA4311EA2D819997713DB0EE40DAF0
+EE60DA70470000B0EE4D1AF0EE6D1A70470000B0EE40CA
+F0EE60CA7047000041EC100B1CF402B3B0EE490AF0EE69
+0A1CF4FCB253EC102B51EC180B0DF42EB351EC1B0B0DF4
+2AB353EC192B51EC1B0B0DF424B351EC190B002200230D
+F4DEB210EE100A0FF444B5686A9FF40BB70000686AA1F4
+9FB10000686AB0F419B0000005460421504675F447B700
+0010B52DED028B0446B0EE408AF0EE608AADF4AEF12046
+8FF487F604EBC000083880ED008BBDEC028B10BD000080
+B5FDF727FFBDE801401FF471B3000001704270837080ED
+010AC0ED020A80ED031A00F12C02009901740199417402
+998174C0ED051A80ED062AC0ED072A80ED083AC0ED093A
+80ED0A4A039911700499517005999170C2ED014A70472D
+E9F14F2DED048BB8B0B0EE408A8A469146684633F418F3
+694612A81CF46CF50FF2781B0CE0B8F90010814205DA00
+F0B1F86946484634F4DDF312A81CF458F5F1940310AF81
+0012A81CF453F5002840F0888000F0A2F83C98D0F8C000
+002269467DF489F500F1F008B8F902000DF401F43F4A3F
+4B0DF48BF20FF46BF400EE900AB0EE480AADF461F010EE
+100A20F000400FF4A7F4384A384B0DF439F241EC190B07
+D83648374953EC192B0DF4FAF341EC190B53EC192B3348
+34490DF468F2334A344B0DF436F30DF4A8F3074602A859
+4610220EF44AF31E2097FBF0F4002C01D4042C04D31821
+0FF2C800E5F774FB02A850F8246000EB84004068801B0D
+F4B9F30022244B0DF48DF4CDE900011E2000FB14700DF4
+AEF3DDE900230DF438F204460D4630460DF4A5F322462B
+460DF401F30DF473F3B8F90010814205DA00F02DF86946
+504634F459F32D2F04DA07EBD77040100F306AE74B2FB4
+BFC7F14B00002064E738B0BDEC048BBDE8F18F0000349D
+52A246DF913F122D4454FB21F93F112D4454FB21094000
+C2631ADCA54C409A9999999999B9BF00003E4012A96846
+1CF4B4B4000000002D0000003C00000041000000706174
+63685F676C70655F6E61767574696C2E637070000010B5
+0446FDF7A2FE204610BD25643A256409416464696E6720
+7472616E73706F727420666F6F7465722E20436865636B
+73756D3D307825782C206C656E3A20257A75202D3E2025
+7A750A00002C253032580000002C253033580000002C25
+3034580000002C25303558000000676C70655F6E617673
+7466696C7465722E6800006666863F7593883F0E2D0A42
+0000000000010000020000030000040001000001010001
+0200010300010400020000020100020200020300020401
+0000010001010002010003010004010100010101010102
+0101030101040102000102010102020102030102040200
+0002000102000202000302000402010002010102010202
+0103020104030000030001030002030003030004030100
+0301010301020301030301040303000303010303020303
+0303030404010004010104010204010304010404020004
+0201040202040203040204040300040301040302040303
+04030400000AD7A33BEC51383D05000000000010410000
+00400000000000000000000070410000A0410000004200
+0020420AD7233C0AD7233D010000000100000000009041
+01000000000070410000904100000000000000000000E4
+410000C4410000A041010203040000A041000088410000
+8041010203040000F0410000C8410000A0410203050A00
+00F0410000C8410000A0410203050A0608060001080000
+FCFEFF00010200F6ACB28100B0B38100F19403A0B28100
+B4B48100B8B58100BCB6810085EB0F42040000000AD7A3
+3C0000703F0AD7233C0AD7233D0AD7233D030000000000
+0040000000400000000000008040060000000AD7233D01
+000000CDCC4C3E00000000000000000000A04106010000
+010000000AD7A33C0000803E0000A03E02000000000080
+3F000000000000D0410A000000000040C0000000C03333
+834133338341881300008FC2753EFFFFFFFF0301030000
+0000000000803F01000000000000000A000000000040C0
+000000C03333834133338341000000000000F041000000
+0000000000000000000000000000000000000000000000
+00000100000000C0794400C079440000A0406400FA0000
+000000000000000000C6420000C6420000C64285EB0F42
+040000000AD7A33C0000613F0AD7233C0AD7A33C0AD723
+3D03000000000000400000004000000000000080400600
+00000AD7A33C010000000000C03F000000000000000000
+00A04106010000010000000AD7233D0000803E0000963E
+010200000000803F000000000000604104000000CDCC8C
+C0CDCC8CC06666AE419A99BD41B80B00008FC2753EFFFF
+FFFF03010300000000000000803F010000000000000004
+000000CDCC8CC0CDCC8CC06666AE419A99BD4100000000
+0000F04100000000000000000000000000000000000000
+000100000005000000010000009A99193ECDCCCC3E0000
+A0406400FA0000000000000000000000C6420000C64200
+00C64285EB0F42040000000AD7A33C00004D3F0AD7233C
+0AD7A33C0AD7A33C030000000000004100000040000000
+0000000040060000000AD7A33C02000000000000400000
+00000000803F0000F0410601000001000000EC51383E00
+00803E0000883E010200000000803F0100000000006041
+010000000000C0C00000C0C0CDCCD041CDCCE841D00700
+008FC2753EFFFFFFFF03020103000000000000803F0100
+000000000000010000000000C0C00000C0C0CDCCD04100
+00E841010000000000F041000000000000000000000000
+00000000000000000100000005000000010000009A9919
+3ECDCCCC3E0000A0406400FA0000000000000000000000
+C6420000C6420000C64285EB0F42020000000AD7233C00
+00003E0AD7233C0AD7A33C0AD7A33C0300000000001041
+000080400000000000000040060000000AD7233C020000
+0000004040000000000000004000004842060100000100
+0000CDCCCC3E0000803E0000803D010200000000803F01
+0000000000604101000000000020C1F1940330B6810000
+0020C1CDCC4543CD4C7543F40100008FC2753EFFFFFFFF
+03020103000000000000803F0100000000000000010000
+00000020C1000020C10000AF42CDCCD442010000000000
+F041000000000000000000000000000000000000000001
+0000000500000001000000CDCCCC3DCDCCCC3E0000A040
+32006400FA000000000000000000C6420000C6420000C6
+4285EB0F42000000000AD7233C0000803D0AD7233C0AD7
+A33C0AD7A33C0300000000002041000080400000000000
+000040060000000AD7233C020000000000404000000000
+000080400000484206010000010000009A99193F000080
+3E0000003D010200000000803F01000000000060410100
+0000000020C1000020C13363924400C0B744F40100008F
+C2753EFFFFFFFF03020103000000000000803F01000000
+0000000001000000000020C1000020C10000ED43008014
+44010000000000F0410000000000000000000000000000
+000000000000010000000500000001000000CDCCCC3D9A
+99993E0000A04032006400FA000000000000000000C642
+0000C6420000C642012100F01F029140414A400942F820
+1070470000F8B504463E48254650F8252002F1480302F1
+44011E681E600F6826EA070738060DD50F6847F080070F
+604FF400671F600B6823F400630B601269120600E03A05
+06D5086840F4006008602046F9F72AD92C48782111FB05
+00C26C100002D031462046904704F11F00BDE8F24040B2
+BDE770B50446032804BFBDE87040F7F75C9B022804BFBD
+E87040FDF7C89D1D49782212FB00152E1D96F944000128
+02D06FF0060070BD00212046F8F702DF95F8720010B120
+46F9F7F6D82046F8F71FDB00212046F8F7A3DF2046FCF7
+B2DA95F8521000222046FCF7CADA70780C2804D0F8F725
+D93078F8F722D920460749884700212046F8F76DDF0020
+70BD000080E200E0647F0100E8D491007D3F01002DE9F0
+4186B0E0F45DF40026846FE0F459F400F5117801A80090
+03AB02AA04A94046E2F437F000283BD402980199081803
+D14046E2F43EF033E0E0F443F4761C90F88802F6B28642
+03D30020E1F4CAF427E000270AE0C51BB5F5006F88BF4F
+F400652368049800F01FF8EF1902988742F1D300270AE0
+C51BB5F5006F88BF4FF400652368039800F00FF8EF1901
+988742F1D30298019909184046E2F403F00028B9D106B0
+BDE8F081DB683A18A9B2204618470000FEB500200090E0
+F403F4214D846F0FF298072846E5F7DADE06461DE06946
+2846E5F742DE012817DB142805D0F19403C0B981000246
+142362213846E4F780FE0120ADF8040001A90020ADF806
+000098029020462268126B90472846E5F746DE3046461E
+0128DDDAF7BD00001CB5E0F4D3F30A490968806F89B201
+910849096889B2009107490B6807490A6804680749E46B
+0968A04713BD3CBB9100747B890090F69100ECF89100E8
+F89100E4F8910070617463685F7076745F6576656E7473
+2E63707000000000012100F01F029140DFF8C82306E000
+00012100F01F029140DFF8BC23400942F8201070470121
+00F01F029140DFF8AC23F4E700002DE9F04107000D4618
+BF002D164698462AD04EB3A9882868FCF744DC20B3B188
+3068FCF73FDCF8B1387868B17969D9B9032813D0DFF874
+4304F15800FBF736DDA8B16FF0010059E0F868DFF86413
+A0F51650884224BF4FF46120F86007F10800FBF7C6DF00
+28E5D14FF0FF3046E00E20FFF7B4FFFBF7D0DB97EC060B
+84EC060B277843460022294604F15800FBF7DCDC002301
+22314604F11800FBF7D5DC3846DFF8101388473846DFF8
+0C138847380018BF0120E7F75AFC802517B94FF420750E
+E0032F0CD1217CDFF8F052FF291CBF0320FCF705D9A17A
+01220320FCF76CD9DFF8DC02B8F1000F1CBF4021816101
+68A94301600E20FFF769FF0020BDE8F08170B5DFF8A852
+DFF8BC4205F15800FBF7CDDC10B92070607052E0DFF8A4
+62706C000404D0CE210FF2B820E4F775FDF7F793DB10B1
+706A000407D02878032804BF0021FBF7D1DF002070BD0E
+20FFF746FF3068DFF8741208406060DFF8701230680843
+30600020FBF71DDB0020FBF710DBB069DFF85C1280B288
+60706980B24860706B80B2C860287803280ED1DFF84402
+0068000A00F0010080F001010020FCF7C1D901210120FC
+F7BDD901202070002060702878012803D100210320F5F7
+24DD012070BD38B5794C7E4D04F15800FBF76DDC08B928
+7008E0287840B92078032804BF0021FBF780DF00206870
+31BD0E20FFF7F4FEFBF710DB0020FBF7D3DA0020FBF7C6
+DA6E4D71492868084328606949207888476E48816889B2
+A961416889B26961C06880B2686304F15800FBF772DC04
+F11800BDE83240FBF76C9C38B5614C2078F8B1594D5C49
+287888470E20FFF7CFFE60685C49084059490860002020
+7060700E20FFF7B2FE287800B10120E7F77DFB28780128
+05D1BDE8344001210320F5F7C29C31BD00007CB5F4F73F
+D94C4C4D49606822680840114040F213120240884342EA
+000512B12068104320604A48026810001CBF28469047A8
+053B4E4CD5206840F400702060F1940350BD8100206F00
+F003013170080018BF0120E7F749FB307803281ED1B07A
+FBF719DA206820F400302060317CFF291CBF0320FBF7F3
+DFB17A01220320FCF75AD8A06F354B0203120BD004C00C
+C2F34531D20C18BF01229847F060716908001AD030788D
+F8000003280FD1606F0005000DADF80200606F0002000D
+ADF80400206FC003400CADF8060003E00020ADF8020001
+906846884740F2031005421CBF06F15800FBF751DC15F0
+900F1CBF06F11800FBF74ADCA8030CD53078032809D130
+7CFF2806D0606C000403D100210320FBF7C1DF6560F4F7
+BCD873BD000000E100E080E100E080E200E098E4910081
+DA3100D12A01000D2B0100800002003440104030E59100
+DFFF7F00DFFF3F0034E59100D8401040B8D19100892C01
+0070617463685F6873692E6300012100F01F0291406D4A
+05E0012100F01F029140DFF8AC21400942F8201070472D
+E9F04F83B0EFF3108B72B6F3F756DF43F60958401C41F1
+0001A8FB004508FB0155640A44EAC5546D0A2046294642
+4600230DF48FF4A8FB0023A4EB020A0026B4EB0A0865EB
+060940F2E7300021001BA941CDE900014FF47A72204629
+4600230DF478F44FF47A72A2FB0045DDE9000100190090
+4C4F4D48F8630098F865C7F85480C9EA0A40B865F86B40
+F00100F863386F20F0100038672520FFF7A1FF38684349
+40F001003860386840F0100038600E70F3F703DF8BF310
+88BDE8F78F000070B53C4E3A4982B0306820F000703060
+70680A788002001682180A7052B23AB9A8B10128B4BF4F
+F080604FF040600FE008B9002A06E000F0800102F08002
+914205D100284CBF01200320800600E00020316821F040
+610843306000208DF80000FFF77ED8441C41F100054B20
+02E09DF80000401E8DF800009DF9000030B1FFF76FD88D
+42F3D828BF8442F0D29DF9000020B9A9210FF27400E4F7
+58FB306840F00070306073BD000038B5F3F7C9DF124C25
+6825B9B3210FF25400E4F747FBE80607D510202060A068
+C0F3001008B9FFF797FF2520FFF72AFFBDE83140F3F7B4
+9F00E100E080E200E000205040A0E106009BCB91003C20
+50406820504080B50720F5F7E0D8BDE8014000F024B870
+617463685F74696D5F6C6C2E630000012100F01F029140
+084A05E0012100F01F029140DFF81820400942F8201070
+47012100F01F029140024AF5E700E100E080E100E080E2
+00E080B51B20FFF7E6FF2520FFF7E3FF1C20FFF7E0FF1D
+20FFF7DDFF1E20FFF7DAFF1B20FFF7E1FF2520FFF7DEFF
+1C20FFF7DBFF1D20FFF7D8FFF19403E0C08100BDE80240
+1E20D3E780B51B20FFF7C0FF2520FFF7BDFF1C20FFF7BA
+FF1D20FFF7B7FFBDE802401E20B2E7000010B50C4CA079
+C00744BF0120FAF7BADBA079800704D5BDE810400320FA
+F7B29B10BD000080B5FAF71DDB0348FAF79EDE1AE00000
+E8D691000A2AAA0280B5FAF711DB0022004901E00A2AAA
+020120FAF711DB0020FAF71ADCFAF7FEDEFAF722DF5FF0
+0100FAF702DEBDE80140C8E70000864870478648874A01
+681368194031F0006104D140685168084020F020010800
+18BF0120C0B2704770B5F5F7B1DF7E487E4C7F4E8047FF
+F779FFFAF703DFF3F7BDDD2060A068401CA060306840F0
+04003060F3F7CFDC0546306820F004003060F3F7ACDD60
+6025B1FAF72CDF7148804703E0FAF7EFDEFFF779FF2846
+70BD000010B5FFF7BDFF04460120F5F71DDF94F8290110
+B9F8F780DF58B9002200210D20E7F714F90D20F5F797DB
+0120F5F71EDF02E0F6F7DBD820B9BDE810400120F5F727
+9F10BD2DE9F047FFF79CFF08B10020A2E0F9F76BD9FFF7
+95FF08B1002697E0554880470600FAD0544C554EFFF788
+FF2568052D00F5947A0DDB7088C0F3400048B9F6F773DA
+30B9F5F79EDF18B930890021012703E070894FF42F7100
+2761606FF000418D4218BF2D1A284645498847060002D1
+444880476AE0E7F7A7F800F08BF80FF2201820B940F201
+114046E4F7E9F901208AF80000FFF792FF5FB10120F5F7
+88DEF8F718DF28B9F5F77DDE10B10220F9F7EDDD1120F9
+F7DEDE3846FFF753FF074600F068F820B940F217114046
+E4F7C8F9F5F77ADEDFF8B09090B9F5F7D3DCE4F731F804
+460D46E7F7D9F8FAF715D9C8474FF0FF302549A043A943
+E7F7CFF80CE0C847F5F72FD9FAF707D99AF8010010B9F5
+F748DE08B9FFF7EBFE0020F5F748DE57B11420FAF772D9
+20B94FF4AB714046E4F796F9FCF712D9FAF7FCD8144880
+4700208AF800001120F9F794DE0120F9F7CBD83046BDE8
+F087007E404000E100E000E200E0E95101000CEA910010
+ED00E0055201006D540100F8E9910090E99100B9550100
+91540100F5520100FFFF0300FD5601004FF4FA611120F9
+F7359E000070617463685F706D2E6300002F48704710B5
+FFF7FBFF04682CB94FF48B710FF2BC00E4F74DF9204610
+BD000080B5FFF7EFFF806802BD000010B5032805D00246
+2B210FF2AC00E4F746F9FFF7EFFF2049846C436B01F1F0
+0213711E4B1C1994611D4C1460147944B9846B9460446C
+5461C46BD460046C146105E0641E042C84BF0FF2840494
+610268CA6042680A618268F1940370C481004A61C2688A
+610269CA6142690A6282694A62C2698A62026ACA63426A
+9A184A64826A9A188A64026B9A184A60006B1818086008
+46BDE8104000F02CB8007E4040ECE09100000040405C77
+149162636D5F73797374656D5F7368617265642E680070
+617463685F6661696C736166655F636D302E6300000000
+556E6B6E6F776E20486172647761726520457863657074
+696F6E00002DE9F041044688B02146292014F40AF1304D
+314FD5F8008004F1F806012030754FF480110020B847B0
+61002070622B492B480A46002802BF00292A482A4A3262
+F06100281CBF316A002901D0B8477062002704EB870000
+F59071F8B2F9F7E2DB7F1C032FF5D3686810B328681F4F
+002818BFB8421CD130690090B8453068019070680290B0
+680390A06C0590606C06902068049003D072B60320F9F7
+95DC696868468847B84511D00120F9F709DA0DE072B603
+20F9F788DC0D480E494461183000F2FF3000090001F9F7
+69DE08B0BDE8F08100BFE4E09100750801005A58020000
+00800000000000ACEF0F00EFBEADDECCDC9100B9070100
+012100F01F029140734A05E0012100F01F029140DFF8C4
+21400942F820107047012100F01F0291406D4AF5E72DE9
+FE4304466C4D0E461746984605F14400FAF77BDF10B16F
+F0010079E0F9F7A7DFB18830680FF2A419FBF76BDE18B9
+40214846E4F720F8B9883868FBF762DE18B941214846E4
+F717F843460022314605F14400FAF728DF002301223946
+281DFAF722DF2420FFF7BBFF03F481F3012003F48AF351
+48007803F49AF3012003F48DF3F5F7EBDD18B94B214846
+E3F7F4FF002003F497F3012003F494F3E86C0090694628
+6D00F038F86888ADF80800002003F49EF3E86800906946
+2869404D00F02BF8ADF80800012003F492F36FF4607028
+6040F2DF306860207800F0010003F4BBF3002003F47AF3
+012003F477F3882068602420FFF77EFF0120F5F761DD32
+20F3F76CDC2320FFF765FF2420FFF762FF0020BDE8FE83
+0000ADF804000020ADF80600704770B5244C04F14400FA
+F7EEDE10B96FF0060070BD1425224E03E00120F3F74CDC
+6D1EF06B10B93068800701D4002DF4D1EFF3108572B620
+7808B11A4880472320FFF73CFF2420FFF739FF85F31088
+002003F426F3012003F423F3002003F402F30020F5F71B
+DD04F14400FAF7CBDE201DFAF7C8DEF9F7F4DEF5F79EDD
+002814BF00206FF0070070BD00E100E080E100E080E200
+E060E29100FDE2910004501040005010400DC201007061
+7463685F6769692E6300F1940300C8810010B504460021
+FEF73BDE2046FBF7FADA08480C2111FB04000022017A20
+46FBF70FDB2046044988472046BDE810400021024A1047
+54E5910085B301009DB30100F8B50446207A002843D0E5
+682068E9071FD5617A03291AD06FF00801A161016DC1F3
+460199B1A37C04F1200202EBC306776847B177898F4202
+D3791A718106E0C91B002777815B1E01D40029EED10121
+E171690705D56FF00900A0610120E07101E0A16919B120
+460B49884711E0617C21B950F8701F21F00E01016015F4
+897F1CBF204603F44AF1A80644BF204603F445F10020E0
+60F1BDB5F801002848294A01681160C168516001699160
+4169D16025490B681361436A5361006B9061086AD06122
+4A486A5060886A9060C86AD06000211F481F4A50F8043B
+42F82130491C1029F8DB7047000038B5164C1448216815
+4D184A01606168C160A1680161E1684161216929606169
+4162A169016300210F4852F8213040F8043B491C1029F8
+DB0D488047E06928620848416869628168A962C068E862
+BDE832400848004700001000204070E89100900020408C
+E89100C000204010C89100E9A10100DDA1010038B5FF25
+1728044617D8DFE800F00C1E2F4249505E6C7A81888F96
+9DA4ABB2B9C0C7CED5DC290020E6F720FD012858D00C20
+E6F71BFD02284CD02246D9210FF29410E3F768FE284632
+BD0320E6F70EFD012854D00F20E6F709FD0228EDD147E0
+0320E6F703FD0128E7D148E00420E6F7FDFC01284AD025
+20E6F7F8FC022808BF2525E0D00E20E6F7F1FC0328D5D1
+0E25D9E71420E6F7EAFC0128CED11425D2E71720E6F7E3
+FC0128C7D11725CBE73120E6F7DCFC012808BF3125C4D0
+1620E6F7D5FC0228B9D11625BDE70C20E6F7CEFC012801
+D10C25B6E70020E6F7C7FC0228ABD10025AFE70F20E6F7
+C0FC012801D10F25A8E70320E6F7B9FC02289DD10325A1
+E70420E6F7B2FC012896D104259AE71020E6F7ABFC0128
+8FD1102593E71320E6F7A4FC012888D113258CE71F20E6
+F79DFC0128F7D11F2585E71E20E6F796FC0128F0D11E25
+7EE72020E6F78FFC0128E9D1202577E72720E6F788FC01
+28E2D1272570E70920E6F781FC0128DBD1092569E70620
+E6F77AFC0128D4D1062562E72F20E6F773FC0228CDD12F
+255BE72B20E6F76CFC0128C6D12B2554E72E20E6F765FC
+0128BFD12E254DE72D20E6F75EFC0128B8D12D2546E708
+20E6F757FC0128B1D108253FE70B20E6F750FC0128AAD1
+0B2538E770617463685F706D692E630010B50446EDF75E
+FB04F5FE40BDE81040F1940390CB8100603025F47BB600
+0070B5A4B004461D4602292898299B2A9E04BF51780029
+06D101930296009013780FF254020BE0002A1ABF117800
+290FF26C0201930296134600900FF26802802103A81CF4
+7DF104201BF466F118B91C201BF462F140B1606800F5FE
+402A4603A9603028F4E3F305E017F462F22A4603A91DF4
+70F524B070BD4553575F46494C453D2564206172677328
+25686C752025686C752025686C752900000000756E6B6E
+6F776E00257320617267732825686C752025686C752025
+686C75290038B505460C4604F1100105F110003EF411F4
+04F11C0105F11C000A6802604A6842608A688260CA68C2
+600969016105F1300004F1300191ED000B80ED000B8A68
+82600A7B02734A7B427391ED040B80ED040B0A7E02764A
+7E42768A7E8276CA69C2610A6A02624A6A42628A6A8262
+CA6AC262096B016331BD2DE9FE4F2DED108B04460D46B0
+EE408AF0EE608AADF50A7D53EC182B002000210BF45EF3
+06D160682CF4E4F70BF42AF541EC180B20462EF46FF228
+B19C989C99806820F0210088600022606800F060FD31F4
+00F506460022294607A81AF47EF20121301D1AF422F058
+B19C98007A800607D56068002200F045FD07A931F4EAF4
+064674A82AF4A2F3024600F041FD04F584704BF4AFF09F
+EDC6AB9FEDC7BB0027059078B1006A0DF49BF541EC1B0B
+0598DFF87C1AD0E9062300200BF467F3012741EC1A0BA7
+984FF0000908B1007821E00AA81AF4BBF1DFF85C1ACDE9
+089100F011FD1AF4E5F4014608A80090CDF804900AAB0E
+AA04F58F504BF45AF303902878342808DB422806DA0398
+20B10C98C00900F001000390002F9FEDA9DB9FEDAA9B48
+D0287834289FEDAACA4CDA2878002776283FDB9A283DDA
+41F21040005D002838D008A82AF442F3024600F027FD5F
+EA00081EBF059890F83C0004281CBF98F83C00042823D0
+00F091FCC16980690BF497F441EC100B1AF4A7F200F0CF
+FC16D208F1180898ED020A00F070FC0FD500F073FC0CD2
+51EC1A0B02460B46D8E900010BF4C6F300F08EFC012741
+EC1D0B08A84CF4E8F060A83EF4E1F1A699002943D04AF4
+36F14AE04228B0DA04F59850F030007A0028AAD008A82A
+F4F8F2024604F5985100F0D1FC07001EBF059890F83C00
+04281CBF97F83C00042821D000F046FC416800680BF44C
+F441EC100B1AF45CF200F084FC14D2183797ED020A00F0
+26FC0ED500F029FC0BD2D7E9002351EC1A0B0BF47EF300
+F046FC4FF0010941EC1D0B08A84CF49FF071E700F05CFC
+1AF4BEF2024660A9F1940320CF810004F1780049F4B0F0
+04F10800009060AB059A314622A84CF49BF008A82FF4FA
+F39C98007A800604D5606807A931F4FAF203E060682946
+31F4F5F2804604F138004CF4BAF6B0EE40AAF0EE60AA20
+462EF439F163994A075ABFC90901F00101012101900091
+0295B0EE4A1A9C9AF0EE6A1A434608A900F01CFC22A84C
+F4B5F2307B800603D50E9840F480700E90DFF854080690
+2878342803DB4228B8BF012000DB00208DF8100018AE9D
+F810004FF0FF0B002886F808B086F809B086F80AB00DF1
+380A9FED85AB00F0B48003988DF801B000EA09008DF800
+00D8469DF80000002871D004F59851002200F024FC8046
+04F59850F030D0E9002300F082FB53EC1A2B0BF41AF241
+EC1B0B9AED06EB51EC1E0B53EC1B2BB7EE000AD8ED090A
+0BF4CCF130EE60CA9FED6E1BB0EE41FAF0EE61FA1CEE10
+0A24D80DF429F48046894651EC1E0B53EC1B2B0BF481F3
+00F08DFB00F07FFBB0EE40BAF0EE60BA28E00000000000
+000080FFFFFFFFFFFFEF7F000000000000000000000000
+00408F406F12833A0DF404F48046894651EC1B0B53EC1E
+2B0BF45CF300F068FB00F05AFB53EC102B00204FF08041
+0BF451F341EC1B0B28464CF406F651EC1B0B53EC102B0B
+F406F400F04EFB804660680DF1010308AA29462CF442F4
+9DF80010002900F08D8086F80880307AFF2803D00E9840
+F080000E90307AC0071DD59DF83800000619D5307A401C
+3072B7EE000AC0B2C828A4BF38303072DAED020A30EE60
+0ADFED330A20EE200A00F031FBDAE906230BF457F2CAE9
+0601287876289FED2DBB9FED2ECA9FED24FBC0F2F2809A
+2880F2EF80039896F809908DF8119010EA070879D00022
+00F073FB074604F59850F030D0E9062300F0C7FA53EC1A
+2B0BF45FF141EC1D0B9AED06EB51EC1E0B53EC1D2B0BF4
+15F19FED101B8DED021BB7EE000AD7ED090A30EE600A10
+EE100A2FD80DF470F3CDE9000153EC1D2B51EC1E0B0BF4
+C8F2DDE900230BF43AF100F0BEFA00F084FA34E000BF9A
+9999999999B93FFCA9F1D24D62503F0000000000000040
+0AD7233C00000000007522416F12033A18B19DF8010030
+726FE786F808B076E70DF440F3CDE9000153EC1E2B51EC
+1D0B0BF498F2DDE900230BF40AF100F08EFA53EC102B51
+EC1F0B0BF48CF241EC1D0B28464CF441F551EC1D0B53EC
+102B0BF441F300F089FA814660680DF1110308AA29462C
+F4B9F3B8F1000F18BF86F8099006D100281ABF9DF81100
+707286F809B0DAE906239DF8107000F07DFA00F08AFA05
+9800F023FAD0B1F19403B0D28100059AD369926900F033
+FA00F035FA01280BDB00F01DFA00F073FA00F009FA53EC
+1D2B0BF493F141EC1D0B00F0CFFA00F05BFA00F0AFFA70
+7AFF282AD1059800282BD000F01FFA28D551EC1D0B00F0
+9EFA03D200F007FA41EC1D0B9DED060A00F013FA1AD59F
+ED7B1B00F0F6F900F0EAF900F0EEF9002851EC1D0BDFF8
+DC240CBFDFF8D834DFF8D8340BF4D8F200F020FA70720E
+9840F480600E9028464CF4D4F4002802D000F0D4F90028
+00F08880DAE906239DF8107000F01AFA00F027FA059800
+2800F0BFF958D053EC1D2B0020DFF894140BF43BF1059A
+D36992690BF436F100F0CAF901280BDB00F0B2F900F008
+FA00F09EF953EC1D2B0BF428F141EC1D0B00F064FA00F0
+F0F900F044FA00F0BAF933D551EC1D0B00F039FA03D200
+F0A2F941EC1D0B9DED060A00F0AEF925D500F08FF90228
+18BF9FEDC1FB00F089F9022818BF9FEDD7ABB0EE4F1AF0
+EE6F1A00F083F951EC100B53EC1A2B0BF46FF200F0B7F9
+87B2B77200F073F9012804BF380A70720E9840F480500E
+900E98C0041ED400F024FA00F0B0F900F004FAB8B1C168
+8A0714D5890612D59FED2E1B90ED060B1DF466F051EC10
+0BEB4AED4B0BF446F200F08EF9B0720E9840F480500E90
+DAE906239DF8106000F092F906AF41EC100B3246394600
+F0A0F905988DED180B002800F0F680007834280DDB4228
+0BDA9DED060ADFEDD40AB4EE600AF1EE10FAA4BF00208D
+F85D000598C1698069DDE918230BF49CF0CDE9180109A8
+19F4B1F601280BDB00F015F900F06BF900F001F9DDE918
+230BF48BF0CDE91801287834280DDB42280BDA00F09EF9
+13D253EC1A2B0020C5490AE09A9999999999B93F00F092
+F907D253EC1A2B51EC1B0B0BF46FF0CDE91801284616F4
+24F7012840F0A9800598D0ED080A9FEDB00AF4EE400AF1
+EE10FA42BFDDED060AF4EE400AF1EE10FA40F1978000F0
+93F9DAE90623064600F01FF941EC100B60680022314631
+F4D9F000212846F2F749FDB0EE409AF0EE609A53EC192B
+0020A5490AF467F741EC1A0BB0EE491AF0EE691A9DED18
+0B1CF4C1F7B0EE40BAF0EE60BAB7EE000ADAED020A30EE
+600A00F0F9F806460F4651EC190B53EC1B2B0BF4D3F032
+463B460AF445F7DAE906230BF413F041EC1B0B8AED06BB
+00F023F951EC1B0B53EC102B0BF4BFF041EC100B21F000
+4141EC1B0B51EC100B002200230AF4E9F694BF01244FF0
+FF3451EC1A0B53EC1B2B0AF403F72DD20AF4EEF753EC19
+2B0BF462F141EC100B1AF4A6F0064620460BF482F00446
+894630460BF4F1940340D6810087F000F0A5F8B7EE000A
+DAED020A064630EE600A0F4600F0A7F832463B460AF4FB
+F6224600F091F802460B46DAE906010BF47CF0CAE90601
+0E9840F400600E902A469B98011D684646F406F700F0CC
+F89B9880ED020B08A99B98FFF7DBFA9C98007A400704D5
+9B980022002143F4E0F30598002814BF0124002408A831
+F4E2F722A84CF41DF360A83DF4EAF574A84BF4BFF40DF5
+0A7D2046BDEC108BBDE8FE8F4FF094424E4B0BF401B100
+000000000000003240B0EE40DAF0EE60DA704700002846
+19F495B50000B0EE4D0AF0EE6D0A1CF406B753EC1D2B51
+EC1B0B0AF46EB751EC1D0B0AF46AB741EC1D0B09A819F4
+7FB500009DED6A0AB4EE4C0AF1EE10FA7047000051EC1B
+0B2F4A314B0AF468B67B14AE47E17A843F04F59850F030
+53EC182B704741EC100B9DED021B1CF4D8B641EC100BB0
+EE4F1AF0EE6F1A1CF4D0B641EC100B19F488B642464B46
+0AF464B653EC192B0AF460B6DAE90623074651EC190B0A
+F459B6000010EE100A0DF47EB0059901EB8000C06A0DF4
+78B00DF1180841EC100B3A46414604F584704AF412B3B0
+EE480AF0EE680A70470000B0EE480AF0EE680A29467047
+51EC100B00220D4B0AF416B67012033A95BFD6330000F0
+BF0000F03FFFFF7F7FFCA9F1D24D62703F4D62503F0000
+2CC00018F5400000E03F78DEB14100F90541B0EE480AF0
+EE680A1AF4B6B09DED18AB51EC1A0B002200230AF4EEB5
+41EC100B60680022394630F467B70000B0EE480AF0EE68
+0AE83104F584704AF42DB30000B0EE480AF0EE680A04F5
+A05104F584704AF422B300222946684619F4D1B400002D
+E9F0412DED028B06460C46BCB0154620463DF4CDF42846
+3DF4CAF406F530767068ADF429F101462AA84CF471F301
+4604A81AF485F046E004A968461AF486F0684616F4C1F2
+0746012F39D07068002269467BF4B1F080467BF45CF420
+B34046D6F41AF300BB70680023002269467BF435F0C8B1
+C06800F03001302914D110F00C0F11D0306802AA394676
+F449F000F0C5F853EC102B51EC180B0AF47DF503D26946
+204617F48AF64046B3F48FF338B14046D8F469F218B969
+46284617F47EF604A81AF439F004A81AF434F00028B3D0
+204629F4EDF4012804BF20463DF468F4284629F4E5F401
+2804BF28463DF460F43CB0BDEC028BBDE8F081000070B5
+2DED028B0D468AB0044695F850008DF80800164602A804
+F5307416F456F20146206806AA75F4FDF700F079F851EC
+100B53EC182B0AF431F538BF002062D3D5E90623DDE906
+010AF416F6F19403D0D98100CDE9000100202F49CDE904
+01022204A9684671F4E1F353EC102B00202A490AF433F5
+41EC180B606896F468F105460020CDE90000039003AB20
+686A4602A976F4CBF09DED000B19F4B1F60446306840B9
+B0EE480AF0EE680A19F4A8F62018401B306028460AF48C
+F6044630680D460AF47DF622462B460AF4D9F553EC182B
+0AF48DF60AF447F6044619F48AF40F49884212D320460A
+F46AF6CDE9040100200C49CDE90801002208A904A871F4
+95F351EC100B0AF42FF6044620460AB0BDEC028B70BD00
+000018F54000408F40012E930270999441B0EE408AF0EE
+608A82F46AB280B5D6487BF4D8F4BDE80840D44ADC4912
+F4B5B32DE9F0472DED088B0D0088B080460FF26C3603D1
+20213046E2F7E0FD287908B1212807DB281D4DF43FF018
+B921213046E2F7D4FD6879012809D1A869C449084204D1
+297908F1400019F49CF0ACE0052804D108F1400018F401
+F6A5E0297908F1400019F427F10028F7D16879042803D0
+3E213046E2F7B2FDA969B6480840B0F1606FEAD1EA6990
+0FE7D1286A830FE4D1C1F38733C1F3871101910093C2F3
+87510291C2F387310391C2F387110491C0F387510591C0
+F38731C0F387100790069100205DF82010CA11012A06D1
+61F0FF01C943491C49424DF82010401C0828F0D300980A
+F4C9F500229B4B0AF453F408F1080741EC180B87ED008B
+9FED98AB01980AF4BAF500224FF079530AF443F441EC19
+0B87ED029B02980AF4AEF553EC1A2B0AF438F441EC1B0B
+87ED04BB03980AF4A3F553EC1A2B0AF42DF441EC1A0B87
+ED06AB0498C4023C6205984FEA8039C7F8249006984FEA
+004AC7F828A007980604FE6208F1380701203870281D4C
+F49CF798B1754800F1080181ED008B81ED029B81ED04BB
+81ED06AB0C62C1F82490C1F828A0CE62032180F8381001
+2038777877002140467BF482F508B0BDEC088BBDE8F087
+000000B591B0002100F8541F0121417068467BF4EEF301
+465F487BF404F46846D7F4C7F711B000BD00002DE9F84F
+2DED028B98B004462598DDF890900D46002104F1A00601
+709046307800289B469FED5B8B73D108A87BF4CCF34146
+204600F076F804F1380720B14B4991F83800032807D038
+7F00281DBF38780028214604F1580108A87BF4CFF3DDE9
+0A010CF48BF500900DF1280AA434DAE902010CF483F501
+90DAE904010CF47EF50290DAE906010CF479F59AED080A
+0390B8EEC00A8DED040A9AED090AB8EEC00A8DED050A9A
+ED0A0AB8EEC00A8DED060A9AED0B0AB8EEC00A8DED070A
+70698542F1940360DD810008D0786E2246294678F476F1
+10F1010F07D075619DF8580002280CBF0123002305E008
+A8D7F450F79FED2A0B15E06A46D9ED000A9BED000A4146
+204670F4FAF610EE100A0CF482F541EC180B08A8D7F43B
+F7B0EE480AF0EE680A18B0BDEC028BBDE8F18F10B50C46
+2DED028B94ED000B19F4E0F251EC100B0022134B0AF420
+F30FD294ED028B114B51EC180B01220AF4F3F206D80022
+114B0AF412F338BF012000D30020BDEC028B10BD0000C8
+A4890094CB9100003F00C00000C0CF0000103E00000000
+0000703E00004E4000805640295C0F0000000000000000
+000080664070617463685F676C70655F696F6E6F6D6772
+2E63707000002DE9FE4304468846C2F456F108B100205E
+E0FAF77DDB0646A068371A606810F1010F02D0B7F57A7F
+02D90020A6606060656805E0DEF48AF1D0F88002E2F7B6
+DBF5F726DCF5F7A2DC8146DEF47FF1D0F87C0281450DD2
+DEF479F16168D0F8800240186060DEF472F16168D0F884
+028842E0D242469FA18E20F5F7CEDBDEF466F16168D0F8
+840288420DD2F5F701DCF5F77DDC024660680FF2882102
+9001973346A068009010E0002918BF8D420FD0F5F7EFDB
+F5F76BDC6168029101973346A168009102460FF27C218F
+20F5F7A5DB0120BDE8FE8338B50C461546DEF437F12A46
+214600F51170DFF409F50246AA4206D0BDE838404E210F
+F20C20E2F7B0BB31BD30B50C46C1B00FF260219720F5F7
+84DB002C00F0ED80DEF419F1012180F8611212AD2068E9
+6A68614908A0882883E08868832089A8836089E883A089
+2884E0896884208AA884608AE8846069A86294F8480000
+F0010040EA4100E86220F00200A16CC1F3400140EA4100
+E86220F00400A16CC1F3800140EA8100E86220F00800A1
+6CC1F3C00140EAC100E86220F01000A16CC1F3001140EA
+0110E86220F02000A16CC1F3401140EA4110E86294ED06
+0B8DED100B94ED080B8DED120BD4E90A010CF400F4A860
+D4F8F0010CF443F402460B46D4E90A010AF49DF30CF4F3
+F3E860D4E90C010CF4EEF32861D4E90E010CF4E9F36863
+D4E910010CF4E4F328633E48006868643D480068A8643D
+480068E86494F84C003228A8BF32208DF8980000200DE0
+04EBC00210A912F84E3F01EB400103F03F0301F8593F40
+1C92794A709DF89810884238BF3228EBD310A8DFF41EF5
+6869DFF42DF518A8DEF480F294F84C0004F14E01E7F728
+FEDEF494F50446DEF499F5844206D1DEF491F50446DEF4
+96F584420CD00FF208119620F5F7C5DADEF485F50446DE
+F47EF5F19403F0E081002146DEF4B5F5F8F791DD0FF234
+11D0E90623CDE90E23D0E90423CDE90C23D0E90223CDE9
+0A23D0E90023CDE90823D0E91023CDE90623D0E90E23CD
+E90423D0E90C23CDE90223D0E90A23CDE90023D0E90823
+9620F5F794DA41B030BD2573000040C9910044C9910048
+C9910070617463685F7076745F656E67696E655F636273
+2E63707000000000284F6E4C6F673A427265616B202564
+2C2025642C2025642C2025642C202564290A000000284F
+6E4C6F673A44656C61792025642C2025642C2025642C20
+25642C202564290A000000476C4D6963726F4E61764361
+6C6C6261636B733A3A4F6E526573706F6E736520737461
+72740A00005570646174696E672073746F72656420636F
+6E7465787420737461747573207768656E207468652066
+6972737420706F736974696F6E206973207075626C6973
+6865640A00000000436B6747657452756E74696D65496E
+666F2C256C6C752C256C6C752C256C6C752C256C6C752C
+256C6C752C256C6C752C256C6C752C256C6C752C256C6C
+750A000830EEF7EFBF000010B504464FF4E2F2204610BD
+70B504460D4604F54F6690B004F55471304600F027F868
+4629F418F402462946304642F4A3F450B101208DF83900
+694600208DF83800606D02689268904710B070BD000001
+2900D0704780B541684FF4FA7000903C23052201F55D70
+3DF400F201BD000070B5874D82B000200C462870687000
+2611E0E06800EB86014888400544BF0120287068463DF4
+A6F0684636F4BFF408B101206870761C60898642EAD373
+BD000070B506462DED0A8BD6F8E4000C460168D1F8A411
+884724280CBF01250025B4F90A0000EE100AB4F9000000
+EE900AD6F8E4000168B8EEC00AF8EEE00AC0EE80BADFED
+560A896F80EE208A88470028DFED548A59D000F0C6F8F3
+EE000AA08A20EE20CA00EE100AD6F8E4000168896CB8EE
+400A20EE2B0ADFED4B0A20EE200A00EE08CA88475649F2
+EE01AA0A780228B7EE089ADFED459A9FED45AAB0EE6ABA
+02D162B9012005E0042801D13AB908E0012804D1DFED3F
+9A0DB1DFED3E9A032805D1DFED3D9ACDB1F0EE6A9A16E0
+042805D1DFED3A9A8DB1DFED3A9A0EE0022805D1DFED38
+9A4DB1DFED389A06E0052804D1DFED369A0DB1DFED369A
+487808B39FED350A79EE809A1CE000F06CF820EE2B0ADF
+ED310A20EE200AA08A20EE08CA00EE100AB8EE400AF2EE
+0B0AB7EE009AF3EE099A9FED2AAAB0EE04BAF2EE068A00
+EE20CAB4F9000000F04FF8B4F9100000EE29CA00F049F8
+B4F9F1940380E48100080000EE0ACA00F043F8E08A00EE
+0BCA00EE100AB8EE400AB4F90A0000EE28CA30B100F035
+F88CEE000A30EE090A03E09FED050A39EE000A84ED030A
+BDEC0A8B70BD000000007A4400000000CDCC4C3E9A9919
+41CDCCCC3ECDCC24415C8F1A41CDCC0C4133339341E17A
+8A419A999D41CDCC92413333B7417B14AC413333333F00
+0016420000FC41A4CB9100B4F9120000EE100AB8EEC00A
+704700002DE9F8430C46462C804616461D460FF2605902
+D3102100F061F808F5F7671421386811FB04040020A070
+0120A0700020E07055EA060008D038690168D1F8A41088
+4710B91A2100F049F8002E08F5F870214616D02AF47CF1
+10B9252100F03EF8204636F481F328B10020A0700120A0
+70E0700CE0A078411CA17000190121C17005E02AF469F1
+10B9342100F027F8002D08F50670214616D02AF45AF110
+B93A2100F01CF8204636F45FF328B138690168D1F87C11
+884778B1A078411CA17000190221C17008E02AF447F128
+B94846BDE8F4434321E2F756B8BDE8F1834846E2F751B8
+00002DE9F34FC3B000F5E4700C90439800F5F76415E000
+F000FA00F006FA0168C9688847C11C20698B440168D1F8
+CC108847584519D20FA834F4E3F70FA835F420F0439840
+3018F48CF0002840F0CF8144990FA834F435F7439800F1
+40011CA818F40DF44FF0060B5BE0B878012803D04FF493
+7100F0D5F997F9030018B140F2271100F0CEF920680599
+0818407B18B94FF4947100F0C5F900F0B7F907687F6A51
+184A782169B84718B94FF4967100F0B8F900F0B2F900F0
+B8F92168059A0495511809AB0A7B03920122029208AA01
+9200F091F9AD680FA9A847079D4398EDB22946583018F4
+B1F243982946403018F4CEF2002000F085F94118401C00
+2203288A71F7D300F07DF90020087300F079F9FF204873
+00F075F9002008611CA818F48EF31CA81BF437F7002884
+D11CA81BF43CF7C0B20790142148430590059920680F18
+384636F4A3F20028394606BF439800F5BC700C982AF48A
+F0B8723946439800F5D0702AF483F0F87208AB07994398
+3A46C9B23AF4E5F6384600F0DEF90CC809A938460CC136
+F482F2002598B320690168D1F81011884700281CBFB87C
+002805D078782F2818BF4FF0010800D1A8460C9839462A
+F45BF088F00101084214D020690168896F884778B9BDF8
+280040F47F40ADF828000A2138788DF825104000EB3840
+F47F40ADF828009DF8200000F0E3008DF82000B87CA8B1
+384636F44BF2402518B9384636F442F200B1C025384636
+F4F1940310E8810039F238B14398394600F5F8702AF426
+F000B1C02520690168D1F8A410884700283FF4F0AEB878
+069008B99F2102E0042802D3A02100F0ECF800F0E6F800
+F0ECF8026806995269C9B29047C01C0B9020690168D1F8
+CC1088470B9959448842FFF4E1AE09A915A837F4A3F04F
+F0000809E038464CF477F118B1384635F459F5706008F1
+0108069880457BDA08EB070090F9039019A800EB880A48
+4635F4BFF58AF8000007EB4906707B10B9BA2100F0B0F8
+307B8AF801008AF8025008A80DA901EB480102780A70B9
+F1000F42784A7015A800EB8806CCD00DA80DA910F81800
+00F0E70001F81800B9F1010F08D138464BF4EDF5002838
+460ED035F43EF4BFE7B9F1020FBDD138464BF4E1F50028
+38460AD035F460F4B3E74CF421F1002838460AD035F442
+F4ABE74CF419F1002838460AD035F468F4A3E736F4A1F1
+0028384618D035F4CAF49BE736F499F10028384602D035
+F490F493E736F48DF1002890D09AF8020000F07F008AF8
+0200384600F0FAF885E736F47FF1002882D0384600F01C
+F97DE7002000E0401C0699C0B28842FADB00F032F80568
+6D6A51184A782169A84718B94FF4827100F033F800F02D
+F800F033F819A904910DA9039115AB0699059AC9B20291
+012101912168511800F00AF82D690FA9A8470B98834475
+E645B0BDE8F08F00004978079A0091D2B2056870472168
+059A511870476069059A002100913B462168704700000F
+A834F461B600000FF26800E1F73CBE0168096A08470000
+70B504460D463AF41BF40FF2500620B94FF4A7713046E1
+F72BFE294604F140001BF420F520B140F24F113046E1F7
+20FE294604F1580018F411F1294604F1F80018F40CF129
+4604F1D00043F46FF3294604F1A000BDE8704018F4DEB0
+70617463685F676C6D657372645F7361745F6D67722E63
+707000000038B504464CF442F00FF268150168896F8847
+10B9162100F07FF8204618F4B4F3002820460DD14CF44B
+F0062807D8DFE800F016162C1604161600042032BD2321
+21E018F4A1F3012820460CD14CF438F028B1C01E012802
+D9801E0FD001E0022032BD2F210FE018F48FF302280AD1
+20464CF426F010B1C01E022801D8082032BD3A2100E040
+2100F047F8012032BD000010B586B00478A4F156000928
+10D268460FF2BC0114220AF471F5062117484170694601
+EB4401047031F8AC1C416002E0134800EBC40006B010BD
+000070B5044636F484F00FF29C0510B96A2100F01CF800
+F038F802D36C2100F016F82078562808DB5F2806DA0FF2
+F19403A0EB8100A40101EB400030F8AC0C70BD034830F8
+160070BD88CB910074440500F84B05002846E1F76DBD00
+0070B5044636F45AF00FF2480510B97A21FFF7F2FF00F0
+0EF802D37C21FFF7ECFF2078562804DB5F2802DA313880
+B270BD304670BD2078A0F15106F6B2252E70472407F505
+EF061A00C4016A0567029A04BE07000070617463685F67
+6C6D657372645F617369635F756E69745F636F6E766572
+7465722E637070000000801D021CAA16D6179C052A167D
+19980C9F1100002DE9F041ADF5006D0446C0208DF80000
+0D46C1208DF8010090460220002641F6C81716E0725D00
+F80D200846B0F5006F02D100F027F80020715DC02902BF
+00F80D10401CB0F5006F02D100F01BF80020761C411C46
+45E5D3C02200F80D20B1F5006F02D100F00EF80021C420
+01F80D004A1C385912B26946CDF4C4F10DF5006DBDE8F0
+8138594FF400626946CDF4BAB170470000704700004F21
+0FF2A420E1F7D3BC00002DE9F04104468EB0174667600D
+46A068B842984604D058210FF28020E1F7C2FC4FF0FF30
+A06004F5C85656F8B80F02686168D26FC9B29047306802
+686168926A89B2904760680A280CBF0121002104F50450
+D030E7F79AFF0420ADF80000ADF806501420ADF80200AD
+F808700020ADF80A00ADF81200042F18BF052F07D12368
+D3F8E43004AA03A92046984702E00390ADF81000AF4271
+D0012F06D0032F09D0042F1FD00A2F55D063E000F075F8
+306803215BE0042D5CD1E07B002859D00020E073032130
+680268D26A9047B06800284FD041F2683103680A5DD3F8
+A8300021984746E004F11C0017F49CF404F1300017F498
+F404F1440017F494F404F1580017F490F442F218110020
+0855A07B70B10020A073B06840B10268D2F884209FED4D
+1B9FED4C0B0021904700F035F8052D1FD006A828F4D0F2
+41F60831095BADF81810B268AAB1014610461268D2F894
+2090470EE030680268D26A1021904730680268D26A0221
+9047306804210268D26A9047002104F5DD50D1F4E0F0B8
+F1000F06D100F081F869462046984700F074F80EB0BDE8
+F081000030680268D26A01211047000070470000F0B5AD
+F6F47D04460C20ADF80200ADF806100D20ADF800001646
+1D4615F402F12BF476F50290022222A103A80AF4B0F300
+F048F82B460020ADF80E00324600F041F840F6EC70BDF8
+0210471A394604A819F4EAF7BDF802104118ADF8021069
+464118381A01F1100605D106220FF2A401B01F0AF47DF3
+16F8010C20B1002006F8010B00F019F89DF80200C007F1
+940330EF810003D50020307000F011F8694600F022F820
+46984700F016F80DF6F47DF0BD00000000000000000000
+25730000BDF80200401CADF802007047BDF80200801CAD
+F802007047BDF80200821C92B2694620466AE600002368
+BDF80220D3F8F830704770470000704700007061746368
+5F676C6D655F706569665F696D706C5F656E632E637070
+00000000202E2E2E200A000010B590B004462DF417F620
+680268926804F160019047684628F47AF50021ADF83810
+014604F1640028F4B0F510B010BDF0B589B004460F4615
+462EF47DF1B86D02689268294690470646786801230122
+294629F469F7070000F0D580E068C00540F1D1802846F0
+F7B9FF002800F0A980287808B1212803DB422812DB5128
+10DAE06880030DD52946384629F403F54AF445F7022805
+D100F0B9F800F0C3F800F0B9F8287834282ADB422828DA
+E068800325D500208DF8140004902946384629F4FDF404
+A903910DF111030DF11201029106AA0DF11301019105A9
+009107A930F429F49DF81110084209D09DF81000022805
+D100F08BF800F095F800F08BF8287851281EDB76281CDA
+E068800319D501208DF800002946384629F40CF522696B
+46294646F4E5F09DF8001081F00101084207D000F071F8
+00F069F800F073F8C4E90E01287876283CDB9A283ADA00
+208DF80A008DF809002946384629F4BFF402A901910DF1
+0A030DF10901009103AA04A945F43CF2201D816821F400
+3181609DF8080001281DD002280DD1201D41F400318160
+41F40011816000F038F800F042F8C4E90E010DE096F874
+000D281CBF0C28112806D1201D41F40031816021F40011
+8160287851281EDB76281CDA284618F44FF0012804D028
+4618F44AF0022812D1201D816841F400318160816821F0
+20018160207B800747BF201D41F01001201D21F0100181
+6009B0F0BD0000284615F4A7B10000C4E90E01201D8168
+41F4001181607047D4E90E0153EC102B09F4BEB210B504
+0007D09FED102B9FED0F1B9FED0E0B6EF461F79FED0C0B
+9FED0D1B84ED060B84ED080B84ED0A1B84ED0C0B002084
+ED100B84ED121BA063BDE810400148F1F712BC28AF8900
+000000000000000000000000008803412DE9F04FADF2CC
+4D82460AF5D75168463BF408F00AF52455F8352A466946
+61A80AF5345628F452F07436B06A81075ABF400900F001
+0701276E212CA817F42CF61FB92E9840F010002E900121
+9DA814F457F6022193A814F453F6042189A814F44FF6FF
+A8A83014F451F6052157A814F447F6FFA806218030F194
+03C0F2810014F442F60AF114072CA93C68684617F40DF6
+23685B6A0246214617A898472A4617A90DA828F416F061
+A921A83BF46EF721AA0DA903A828F40DF09DA900F0F9FA
+2FAA03A97FA828F405F038680168096A884701462A4614
+A827F4FCF761A900F0E8FA00F0EFFA7FA900F0D7FA00F0
+E4FA9DA943A83BF44AF743AA694622A827F4E9F77FA914
+A83BF441F722A900F0D1FA00F0D8FA00F0C0FA00F0CEFA
+2A46694675A827F4D7F742F6F41042F2117150F80A0088
+4208D322AA7FA968463BF438F7694675A83BF446F77FA9
+18A814F4CAF57FA90EA814F4C6F575A904A814F4C2F575
+A94DA814F4BEF50AF5A85000F11C08404636F497F50146
+2A4600F0B0FA00F08BFA39AA2FA943A827F4A4F739A814
+F4A3F50146504620F463F16BA814F49CF50146504620F4
+96F242F6EF5919F80A00002865D061A9E3A83BF4E8F6E3
+AA2946D9A827F487F7FFA98031EDA83BF4DEF6EDAAD9A9
+CFA827F47DF793A9F7A83BF4D5F6F7AACFA9BBA827F474
+F7FFA889A908303BF4CBF6FFAA0832BBA9B1A827F469F7
+FFA857A930303BF4C0F6FFAA3032B1A900F05FFAFFA89D
+A958303BF4B6F6FFAA583200F05AFA00F02AFA61A900F0
+3CFAB1AA294600F04DFA9DA9BBA83BF4A5F6BBAA00F04A
+FA00F012FA38680168096A884701462A46B1A827F43BF7
+61A9BBA83BF493F6BBAAB1A900F033FA9DA9CFA83BF48B
+F6CFAA00F030FA00F0F4F90AF5D45420463AF4CDF48346
+17F448F100283CD15946CFA817F4D0F406E0694622A83B
+F4A3F6CFA817F4A8F4CFA81BF451F060BBCFA81BF457F0
+C2B20AF51461684639F433F5CFA81BF44EF0C1B220463A
+F49AF40828E6D8DFE800F0070A06060D1005131600DAE7
+DDE7694639A8D8E7694643A8D5E769460EA8D2E7694618
+A8CFE769464DA8CCE7694604A8C9E76BA83BF470F6B8B9
+6BA900F0CBF900F0ACF92FA922A817F45AF62FA90EA817
+F456F600F0AEF92FA94DA817F450F62FA943A817F44CF6
+02E06BA83BF456F60AF5345419F80A00C13460B1207818
+B900F0A8F900F08AF900F090F943A83BF445F622A83DE0
+E07958B318A83BF43EF622A83BF43BF600F081F94DA83B
+F436F639A83BF433F643A83BF430F661A900F082F92A46
+00F09CF900F06CF9607820B99DA900F080F900F06DF9F8
+680168D1F87411884700281CBF207A002856D004A80FE0
+504620F466F370B118A83BF40EF622A83BF40BF600F051
+F904A83BF406F639A83BF403F641E093AA7FA9C5A827F4
+6BF6C5A83BF4F8F518B900F053F900F041F96078F19403
+50F6810020B99DA900F04DF900F03AF989AA93A900F058
+F9A7A900F044F92FA94DA817F4D5F5E07810B900F027F9
+11E0FFAAA83257A9BBA83BF4B4F589AABBA9B1A83BF4AF
+F500F03DF9A7A900F02BF900F018F9207848B900F024F9
+00F006F900F020F92FA922A817F4B2F519F80A0068B943
+A8039018AB39A8029004AA0EA801904DA922A800905046
+20F4C7F1FFA9A83100F008F92FA939A817F499F5F86801
+68896F884700283FD100F0F3F8A7AA04A900F00EF900F0
+DDF800F0EBF8A7AA4DA900F006F900F0CDF800F0E3F8A7
+AA18A900F0FEF800F0C1F800F0DBF8A7AA22A900F0F6F8
+2FA922A83BF473F500F0D1F8A7AA0EA900F0ECF82FA90E
+A83BF469F500F0C7F8A7AA39A900F0E2F82FA939A83BF4
+5FF500F0BDF8A7AA43A900F0D8F82FA943A83BF455F597
+480078002864D02FA814F4CAF3002513E0306830F82500
+8DF80000684635F476F248B1306800EB850000F028F918
+B169462FA815F44BF76D1C42F6725030F80A008542E5D3
+2FA83BF439F5002840D100F08FF8B1AA04A900F0A1F8A7
+A900F075F800F086F8B1AA4DA900F098F8A7A900F064F8
+00F07DF8B1AA18A900F08FF8A7A900F057F800F074F8B1
+AA22A900F086F8A7A922A83BF408F500F06AF800F07CF8
+A7A90EA83BF400F500F062F8B1AA39A900F074F8A7A939
+A83BF4F6F400F058F8B1AA43A900F06AF8A7A943A83BF4
+ECF40AF5905004A9743036F482F24DA90AF5895036F47D
+F218A90AF5BA5036F478F20AF5C05022A9103036F472F2
+0AF5B0500EA9703036F46CF20AF5985039A9C83036F466
+F243A9404636F462F26BA90AF5C75036F45DF20DF2CC4D
+BDE8F08F00002FA918A83BF4B8B42FA94DA83BF4B4B42F
+A918A817F4AEB42FA904A83BF4ACB40EA83BF4B5B40000
+2FA904A817F4A2B461A939A83BF476B457A9A7A83BF472
+B42FA9B1A83BF46EB493A92FA83BF46AB439AA0AA96846
+27F409B500002FAA14A90AA827F403B50000B1AA0EA9A7
+A827F4FDB40000A7A92FA827F4F8B41FB5044608780228
+06D003284AD03D2845D03F283DD047E0012003903F23FF
+2002902D223420019016215020009004F5B050703036F4
+C6F2012003903C233A2002901B22302001900521472000
+9004F5895036F4B7F2012003903C23FF2002901A223020
+019004214720009004F59050743036F4A7F200F01FF804
+F5BA5036F4A1F200F019F804F5C050103036F49AF208E0
+2EF49FF542F6C451085502E0204620F410F3002000E002
+4804B010BD0000C4888900D508040001200390F19403E0
+F981004023FF2002902222302001900221472000907047
+4088400A00F0010070470000002070472DE9F0410F4682
+B080463878022808F5097408F5F6766CA50AD0032800F0
+CB80052800F0B180062814D00C282DD0C6E040463DF46D
+F6206800F59670009000230622414630463BF44BF608F5
+E67016F465F6AEE0787802280DDA40463DF480F540463D
+F455F62068C830009006227878431CDBB204E04FF49670
+009000230522414630463BF42CF693E078780C2804BF20
+7F0028F8D108F13C06B0680168276A896C88470146DFF8
+7C05DFF87CE5DFF87C35DFF87C2500EA070474451CBF38
+4098422BD1DFF86C450FF2B050A74218BF974209D10129
+18BF022920D0032918BF04291CD0712116E0DFF84C2597
+4209D1012918BF022912D0032918BF04290ED07B2108E0
+9F4205D1012918BF032906D0822100E08621E0F7C1FD00
+E0174630680268926939469047B0680268126D39469047
+B06890ED540AFAEE060A30EE200A80ED540A9FEDB30AB0
+680168D1F8E0118847B0684EF468F3B06812F493F248B9
+B06813231122012112F47EF22A46DFF8CC141BE0B06803
+68DB6D0022002198472A46DFF8BC1411E098F81E02401C
+88F81E02C0B2022806DB40463DF429F22A46DFF8A01402
+E02A46DFF89C1440463BF47BF3002005E030463BF4DAF5
+F9E7DFF88C04BDE8F6810000000000002DE9F04F0D460F
+F2C441ADF6FC0D4CC9044606A800274CC000208DF81000
+0FF29046606C11F4EEF5606C15F427F503284FD100F00B
+F901280BD000F007F9022807D000F003F9032803D000F0
+FFF808283FD1606C0168C96A8847DFF82814884208D0DF
+F82414884224D0DFF82014884214D02BE000F0EAF80128
+03D000F0E6F8022801D1032728E000F0E0F8032803D000
+F0DCF8082820D104271EE000F0D6F8032803D000F0D2F8
+082801D1052714E0F32110E000F0CAF8032803D000F0C6
+F8082801D1062708E0FF2104E040F2051101E04FF48671
+00F0BDF8606C0168896C88478046606C41F487F0814660
+6C15F4A9F45FEA000A17D0606CDFF85CB30168496D8847
+0BEA0000D44988420CD0606C0168496D88470BEA0000D1
+49884203D040F2191100F096F8606C0168896A8847CDF8
+00A04B46424639460AA84EF4D6F204A94FF451F0606C4F
+F4EAF338B1606C4FF4E6F301460AA84EF468F511E001A8
+00900DF10503606C02AA0DF1060113F4C3F630B19DF804
+009DF80530029A00F08DF903210AA800F0A7F9074605A9
+0AA84EF4E8F38146002000E0401C05998842F1940370FD
+8100FBD3FF2903D940F23F1100F053F800208DF819008D
+F81A0064208DF81B00D0208DF81C0000208DF81D00ADF8
+1E00ADF820008DF82200606C0168DDF81480C96A884708
+F4CDF40022A94B08F497F541EC100B17F4DBF48DF81800
+1FB940F2731100F028F8284633F483F401688968884706
+46606C4FF488F30390CDF8049006AB9DF8100002903A46
+5FFA88F000902946346824693046A0470AA84FF479F30D
+F6FC0DBDE8F08F00006866F640606C4FF471B300003046
+E0F73BBC000070B50446C80782B015461E4605D440F27B
+110FF24020E0F72DFC60688649006C086029466068406C
+4FF476F36068406C31464FF473F30022002168463BF4FC
+F208218DF8001003218DF801100146606836F4D8F373BD
+00002DE9F0470646ADF6F80D706C0FF2EC180D4615F4D9
+F3032804D04FF4C5714046E0F7FCFB706C0168C96A8847
+00276849884206D06749884227D06749884217D030E000
+F0D7F8012803D000F0D3F8022801D103272BE000F0CDF8
+032803D000F0C9F8082801D1042721E04FF4CF711BE000
+F0C0F8032803D000F0BCF8082801D1052714E040F2AB11
+0EE000F0B3F8032803D000F0AFF8082801D1062707E04F
+F4DC7101E04FF4E0714046E0F7B7FB706C0168896C8847
+8146706C40F443F78246706C15F465F30446706C016889
+6A8847009453464A4639460AA84EF4ADF100218DF80810
+02A94EF425F7706C4FF4BEF288B901A800900DF1050370
+6C03AA0DF1060113F49FF530B19DF804009DF80530039A
+00F069F8686C12F4D4F038B1686C12F4D4F0024601210A
+A84FF467F203A90AA800F02DF90646002000E0401C0399
+8842FBD3FF2904D940F2F1114046E0F765FB286C016803
+9F496A88470146182000902B461F4A04A833F472F233F4
+76F301688968884700940196FAB204689DF80830646904
+A9A04704A833F4F7F204A833F434F30AA84FF471F20DF6
+F80DBDE8F0870000FFFF00F00F00003011000030110000
+34110000371100003581BC050015C0050009BA0500C9BD
+050045BC050080BA8C0100F049020075190380842E4198
+C99100D1B905009DF8061000900AA84EF4D2B5706C4FF4
+43B2000070617463685F676C6D657372645F6173696369
+6E69742E63707000000A64806480648064806480002DE9
+F0410446DFF83C3594F84078DFF83855DFF83865DFF838
+85DFF838C5DFF838E50FF2E450032F43F2300206D004D3
+052F2DD002D3062F4FD086E027781FB17F1E042F02D921
+E01A217FE040F6B360A061C4F804E000F0F19403000182
+007FF80CBFDFF8FC04DFF8FC042062A263DFF8F8046062
+DFF8F804A062DFF8F404E062DFF8F4042063DFF8F00460
+6342F2A11058E04E215DE027787F1E042F1ED840F69940
+A061C4F804E000F059F80CBFDFF8CC04DFF8CC042062A2
+63DFF8C8046062DFF8C804A062DFF8C404E062DFF8C404
+20630120606344F2423033E0762138E023785B1E042B31
+D8DFF8AC046060DFF8A804A060DFF8A804E060DFF8A404
+2061DFF8A404606140F60C00A061DFF89C04E061207805
+280CBFDFF89404DFF894042062A263DFF890046062DFF8
+8C04A062DFF88C04E062DFF8880420630120606343F2AB
+10A08784F83E1004E09C2100E0A021E0F754FA201DBDE8
+F0810000C4F808C0C4F80C8026616561E3612078052870
+4770B586B004460D4668460FF27841182209F406F204F6
+48062178307C032918BF042900F0010009D1717C80F001
+00084304D1C022694620464EF4B2F4204600F023F93068
+286006B004F1400070BD000038B5044604F504650FF240
+402978042905D003D3062900F087800CD3E4E02178491E
+012940F2E480891E012940F2D08040F22311DAE0217849
+1E032971D8D423742200F0F5F83423752200F0F1F8E723
+762200F0EDF80123772200F0E9F82123782200F0E5F80D
+23F62200F0E1F80823902200F0DDF80223912200F0D9F8
+8D23982200F0D5F800F0D1F89C239A2200F0CFF800239B
+2200F0CBF808235D2200F0C7F801235E2200F0C3F88A23
+7A2200F0BFF869237B2200F0BBF8DD237C2200F0B7F802
+237D2200F0B3F821237E2200F0AFF80D23F72200F0ABF8
+0823A32200F0A7F80223A42200F0A3F82078022818BF04
+2868D19F23AB2200F09AF81223AC2200F096F86823AD22
+00F092F80023AE2200F08EF84823352200F08AF8002336
+224FE04FF4B77161E02178491E032958D83023742200F0
+7CF8C223752200F078F89323762200F074F80223772200
+F070F897237A2200F06CF829237B2200F068F8E1237C22
+00F064F803237D2200F060F88023902200F05CF8012391
+2200F058F8AE23982200F054F800F050F874239A2200F0
+4EF82078022818BF042813D18023A32200F045F80123A4
+2200F041F8AC23AB2200F03DF81223AC2200F039F84D23
+AD2200F035F82078032818BF04280FD1687E68B18023EF
+22E02120464EF458F006E04FF4D37101E04FF4D971E0F7
+26F9287803281CBF0428052815D1E87D20B12046BDE832
+404EF4E5B3A87D60B10123832200F00DF8204601B0BDE8
+30400023BB22E0214EF40CB031BD0000F1940390048200
+12239922E02120464EF404B02DE9F047044604F5046528
+7E00F00108400800F00109687850BB0026002728780FF2
+F01A001F02286ED8217820464EF46BF320B94FF4F47150
+46E0F7E3F82278012A07EA080006EA080106D059D3032A
+03D029D3042A27D053E0012A04D0032A57D16A7E002A54
+D061B1C022574944E06868012808BF0126D0D000260228
+CDD10127CCE716B1C022514936E010B1C022504932E017
+B1C0224F492EE0B8F1000F37D0C0224D4928E0022A03D0
+042A1FD16A7EEAB111B1C022494910E016B1C02248490C
+E010B1C022474908E017B1C022464904E0B8F1000F04D0
+C022444920464EF41AF3B9F1000F13D0C022414904E0B9
+F1000F0DD0C0223F4920464EF40CF307E04FF4157101E0
+40F25F215046E0F779F8287803281CBF0428052816D1A8
+7D10B120464EF4C8F3687878B104F6C8039D22C0212046
+4EF45BF704F6CC032046BDE8F0479422C0214EF452B7BD
+E8F087ECCBB127E77F5D048BEC2E90BC4FC4528457E9C1
+DF3CC67E8ABFDC1556C8EA88DC8F1577002B2D00226863
+0008010701020001003CB9DC1508C2EA888E8915778095
+160011B4310084008302B83DC67E43A9E9C1BDA0C452AB
+3F2F90EF7F5D0430CCB12770ADDC1594B3EA88B27C1577
+00502000D6A3200668016703E0BC000008BD0000A0BD00
+00D8BD0000D0BC000040BD000068BD000010BE000048BE
+000030BD000090BD0000C0BC0000010100004050000804
+01000090500008FFFF0000FFFF000070617463685F676C
+6D657372645F7266696E69745F343735352E6370700000
+002DE9F84F2DED048B9CB0154633980FF26C4A0078B0EE
+408AB0EE419AF0EE619A10B9272100F082F9DDF8C49048
+4643F4E9F610B9282100F079F9369F2A98F862389C2046
+65F42AF50020019023462D98DDF8B0802B99009042462E
+68D6F80CC02846E047379E8346304665F417F521463046
+65F40BF53078092802DB362100F055F93178B0EE480A06
+F1080067F426F1002030717079584502D03D2100F046F9
+2F984FF0000A20B1B079404538BF4FF0010A002000E040
+1C3178C0B28842FAD300F030F918B100F02DF9012807D1
+20980078052814BF06284FF0010B01D04FF0000B484649
+F4A0F228B100F01BF9012808BF002100D0309935980490
+0291CDF800B02098039007F132000190B3787278317806
+F1080066F4D7F278700120387028462968496988478DF8
+3400284629680969884701280CBF4FF001084FF0000832
+78209813A965F447F300F0E7F80346F194032008820010
+A80C90CDF81CB011A80B90CDF814800EA80A90CDF80C90
+0FA80990B0EE490A12A80890F0EE690A2E98069013A932
+9804909DF834000290B07801907078009006F108003278
+66F45DF6484613F4E0F700EE100AB8EE400ADFEDAC0A20
+EE200A87ED030A3398007860B300F0AFF8032828DB00F0
+ABF800EE100A3398D0ED020AA548B8EE400A20EE200AD0
+ED000A80EE800A87ED030A484613F4BAF700EE100A9E48
+D0ED000A9FED9A1AC0EE810AB8EE400A20EE800AD7ED03
+0A00F031F948BF87ED030A00203861786113AD60780028
+4AD09FED900A00200CE004EB8001D1ED020AB4EE600AF1
+EE10FA48BFB0EE600A401CC0B2A1788842EFDB002000E0
+401C2178C0B28842FAD3B5EE400AF1EE10FA2ADDA0789F
+ED7F8ADFED7E8A9FED7D9A16E004EB8001D1ED020AC0EE
+800AB4EE608AF1EE10FA09D506EB8001B0EE608AD1ED02
+8A55F8201009EE101A401CC0B221788842E5DB00F03DF8
+08B1B0EE688A87ED048A87ED059ABAF1000F9DF83400DD
+ED130A9DED0E1A05EB800090ED000A30EE600ADDED0F0A
+70EE810AC7ED010A1198B8611298F861D7ED070A30EE80
+0A87ED080A0F9878620E98B86207F1300071790170B179
+41701098B8601CBF002078701CB0BDEC048BBDE8F18F29
+68896928460847484616F41BB400005046DFF74FBE0000
+2DE9F0412DED028B0446B0EE408A9046DEB28DB22DB94F
+F48C710FF22C10DFF73DFE099F00203860404641F439F4
+18B1404616F4FBF340B1404649F45BF130B1404616F4F3
+F3012801D1012000E000200899002211E0B5EE400AF1EE
+10FA01D59FED330A01EB8203521C83ED000AD7ED000A30
+EE800A87ED000AAA4245DA04EB8203002893ED000A30EE
+480AF0EEC00AB7EE000A30EE601AB0EE410ADBD0B7EE00
+0A00F04BF8DBD5B0EE000AF7EE001A40EE801ABDEEE10A
+10EE103AA3F1030C0CFB03FC5B000CF1010CC3F1050300
+EE10CA01EE903AB8EEC00AF8EEE11A002E01EEA00A18BF
+022AB0EEC00ABAD0032A18BF042AB6D0B6EE000A00F01F
+F854BFB0EE410AB0EE600AACE700EE105AB8EE400AD7ED
+000A80EE800A87ED000ABDEC028BBDE8F081000087F4B2
+34C2F38E4D000000008452000088520000F4EE400AF1EE
+10FA7047000070617463685F676C6D657372645F706B66
+69742E63707000F0B50546ADF22C5D0E4605F581673946
+01A84CF46DF6002420E001A9684649F49FF16946304627
+F473F6B8B1694638464CF478F6FFA90078A03160546946
+38464CF470F66A46037800212846F19403B00B820037F4
+BEF369463846641C4CF471F6E4B201A849F47DF10028D9
+D19CB3DFF8C455286810B92A2100F0F5FA2D6807A84FF4
+906108F4F5F4002622E0A71B212F28BF20272968496A28
+468847014601A832F459F432F46DF501688969884707A9
+0091FAB207687F6AFFA9A031731801A9B84701A832F4ED
+F401A83AF440F42036F6B2A642DADB0DF22C5DF0BD0000
+2DE9F84F2DED0E8B80460C4615469FEDC29B86B053EC10
+2B51EC190B07F4D0F400F0BEFADDF878900746484649F4
+46F018B100F099FA012800D000208DF810002421204608
+F4A6F4A07BA78140F00500A07305F11801484691ED020A
+32F48AF5208005F11801484691ED040A32F43AF605F148
+0660809FEDAA0AD6ED010A00F077FA6082D6ED020A00F0
+72FAA082D6ED030A00F06DFAE0829DF85000D0B1A07B40
+F00A00A073DFED9F0AD6ED051A96ED041A21EE800ABDEE
+C00A10EE100A96ED060A21EE201A20EE200ABDEEC11ABD
+EEC00A03E09FED941A9FED930A208384ED080A05F11800
+84ED071ADFED900A90ED080AB4EE600AF1EE10FA80F21C
+82D8F804000268D269291D9047D8F80810B0EE408A4846
+13F4CCF6B0EE40AAF0EE60AA384607F4F7F407468B4618
+EE100A09F49FF505F11802D369926907F441F453EC1A2B
+07F43DF441EC100B30F445F153EC102B3846594607F4EB
+F441EC180B484613F46AF50390484613F412F49DF81010
+09B14FF4E1600090002201208DF8040001A902A816F432
+F251EC180B21F0004141EC1A0B484613F40DF5074602A8
+13F409F5791C401C16F47FF207F4A9F402460B4651EC1A
+0B07F415F302D3852100F0E3F9002726E0484616F418F2
+0398B0EE40AAF0EE60AA07F49DF453EC1A2B07F41DF382
+4605F11800B7EE000AD0ED020A30EE600A8B4610EE100A
+09F439F552465B4607F40BF353EC182B07F4D9F341EC18
+0B7F1C02A813F4CDF4401C874206D251EC180B00220023
+07F4DCF2CBD305F11800F7EE000A90ED020A30EE200A10
+EE100A09F415F553EC182B07F4E7F20022002307F4A3F2
+41EC1D0B02D9932100F093F9484613F4C6F407F454F400
+22B44B07F41EF541EC1A0B484613F419F50190D8F80800
+0168D1F894108847804653EC1D2B51EC1A0B07F4C1F241
+EC1B0B404607F438F441EC1C0BB0EE4C1AF0EE6C1AB0EE
+418AF0EE618A404607F42BF453EC1B2B07F4ABF200F063
+F9B0EE40EAF0EE60EA404607F41EF453EC1A2B07F49EF2
+00F04EF900F05CF907F414F453EC1D2B07F494F241EC18
+0B51EC1C0B53EC1E2B07F416F4F19403400F820001228F
+4B07F46CF210D2B0EE480AF0EE680A13E0000000000000
+E03F00000047286B6E52000000000AD7A33B53EC182B51
+EC190B07F442F341EC100B16F4FEF38346BBFBF8FA08FB
+1AB0A0729FED7DDB00F008F9012851D100F000F918B100
+F0FDF803284AD1584607F4D2F353EC1C2B07F49CF441EC
+1B0BB0EE4A1AF0EE6A1AB0EE4B0AF0EE6B0A19F4AAF2B0
+EE40CAF0EE60CA16F4D2F320819FED6C1BB0EE418AF0EE
+618A51EC1B0B53EC1A2B07F47DF400F0EBF816F4C1F3A0
+7153EC1C2B51EC1D0B07F428F200F0D8F800F0E6F82074
+53EC1A2B00205F4907F41DF202460B4651EC1B0B07F461
+F400F0D7F84B2190FBF1F14B2202FB11001DE001980199
+BAFBF0F001FB10A1218153EC1B2B0399B0FBF1F801FB18
+00A07151EC1D0B07F4FBF100F0ABF800F0B9F820740098
+0099B8FBF0F001FB1080A080287E10F01A0F1DD0A07B40
+F04000A07300F087F818B100F084F8032812D100F084F8
+012803D000F080F802280AD100F07CF8022802D0A86900
+0503D5A07B40F08000A073A869010603D4410501D4C004
+48D5A07B40F08000A073A869010604D5A088317850FA81
+F00EE0400502D5A088717808E0B0789DF8101019B17178
+090251FA80F0A1884018A0800099A0888842A4BF401AA0
+80A088B84202D200990818A080A088C01BA08000F03BF8
+05280AD1A869400507D500F038F8012803DBA088A07100
+20A08000F02CF804280AD1A869C00407D500F029F80228
+03D1A088A0710020A080A07B40F02000A0739DF8501011
+B140F01000A07306B0BDEC0E8BBDE8F18F00408F400000
+E03F0000000000007040000000000000344098C9910000
+003440484649F4E3B40000484616F443B0000060EE800A
+FDEEE00A10EE900A7047000053EC192B07F41CB20FF21C
+00DFF76ABA41EC100BB0EE481AF0EE681A19F4A2B141EC
+100B16F4CCB270617463685F676C6D657372645F616964
+696E675F6D67722E637070000000002DE9F04182B00446
+0D4616463146684629F400F395F85E000FF2B40708B1A8
+2802DB112100F04AF805F1340898ED000A00F048F802DA
+142100F040F898ED010A00F040F802DA152100F038F898
+ED030A00F038F802DA162100F030F8684629F405F30228
+1ED105F15E0015F4DFF750B105F15E0033F404F5A0B105
+F15E0015F4D5F701280ED132462946204658F4D6F63146
+204658F450F732462946204658F4CDF708E0684629F4E1
+F204281CBF04F21C7059F4C7F0BDE8F38100003846DFF7
+EDB90000B5EE400AF1EE10FAF19403D012820070470000
+70617463685F676C6D657372645F7361745F7265706F72
+745F76616C69646974795F63686B2E63707000000070B5
+A0B0044638F47BF420464CF4EAF2014601A839F45AF720
+4634F4E3F5014601AA0BA825F4F6F70BA839F483F70028
+5ED1002545E020690168D1F8C011884710B3204634F406
+F504281DD1684633F4A1F4C8B169460BA827F488F2A0B1
+022101A812F4F1F520464CF4BCF2014601AA15A825F4CF
+F715A825F4DEF7052803DB69460BA839F452F769460BA8
+27F46EF2B0B16068C06800EB8500FEF72BFB06466068C0
+6800EB850026F40EF0034632466946204600F028F86946
+0BA839F436F76D1C60684089854212D2A06837F448F270
+B16068C06830F825008DF80000694620690268D2F8E820
+90470028A3D1E3E70BA839F41FF720464CF4AEF14F2115
+F47FF220B070BD00002DE9F04387B00446884617461D46
+34F499F70646FF2E0FF2F80903D116214846DFF73AF920
+690168D1F8A410884708B900270025062104A808F4C6F0
+404633F41DF438420AD1002200F058F800F05AF88DF810
+0001208DF8110008E0A07E022818BF032803D02F214846
+DFF715F94FB1012200F043F800F045F88DF8120001208D
+F813004DB1022200F038F800F03AF88DF8140001208DF8
+15003146204634F4D3F781463146204635F414F0039501
+900297CDF8009004ABA0683246414637F4E9F106464146
+04F11C0014F4B7F0314604F1440015F4B4F3314604F15C
+0015F4D1F3314604F1740015F4CCF3314604F18C0015F4
+C7F307B0BDE8F0834146684615F48EB623685B6A024631
+462046184770617463685F676C6D657372645F73656172
+63685F6D67725F626173652E6370700000002DE9F44F2D
+ED028B81468846AFF44AF004460025002609F5A3674FF0
+300A01E0761C36B2A64216DA38681AFB060BD8E90023DB
+E9020107F4FBF000F06FF8EFD2DBE90401D8E9022307F4
+F2F000F066F8E6D201252DE0182C05DAB9F86400401CA9
+F8640023E0A9F864509FED308B002638681AFB06F42018
+B1F480F610B9A9F8646014E000F044F851EC100B53EC18
+2B06F428F707D200F03BF8B0EE408AF0EE608AA9F86460
+761C36B2192EE0DBB9F9646038681AFB06F4201809F138
+0120307DF486F28DB9386898ED000B201880ED020B3868
+98ED020B201880ED040B386898ED040B201880ED060B00
+203968611881F82C00BE809DF80800022803D139686118
+81F82C00BDEC028BBDE8F18F00003868201820307DF4FB
+B2000021F00041014A044BF194036016820006F4DEB6F1
+68E388FFFFFFFFFFFFEF7FB5F8E43E30B591B004460D46
+01A826F405F39DF80900401E012823D8684642F4C1F602
+46606802A96FF406F520B926210FF23C00DEF7FCFF9DF8
+001060686EF479F260B1297CC90609D46979012903D169
+6AC1F3406111B901A982F415F7684662F468F601A848F4
+0BF711B030BD000070617463685F676C70655F6E61766D
+73677061727365722E637070002DE9FE4F2DED048B96B0
+04462E9E0FF2841930780D4610B9252100F0B7F8307E10
+B9262100F0B2F8309F387810B9272100F0ACF8DDF8C4A0
+9AF8000010B9282100F0A4F8DDF8A080404642F4C5F610
+B9292100F09BF84246211D684642F49EF60EA864F45FF0
+0021201DEEF74FFCB0EE408AF0EE608A201D13F4BAF009
+EE100A0EA805902B98DDF89C90049096F878000390CDF8
+00A0339802903298019051EC180B09F43DF001EE900A3B
+464A46B8EE491A06F1380196ED040B20464EF4E2F106A8
+64F42FF0269FDDF8BCB01B9A0390CDF808B00196CDF800
+903B46294620464EF48EF22D98359D039004950EAB2C98
+029049462A98019006A80090204672684EF42AF3307A68
+700120E8759DF8380080F0010028761498E86101206875
+9DF8180080F00100A875404615F403F5022807D0019500
+971C9A1B995B4620464EF415F71C980078062818D12878
+00281CBFE87D002812D0287E80B99AED070AB0EEC00ADF
+ED090AB4EE600AF1EE10FA05DB28700021C5E902012861
+287516B0BDEC048BBDE8F78F0000CECCCC3E4846DEF709
+BF000070617463685F676C6D657372645F636F64657072
+6D2E637070000000042900D1704710B584B0089C029407
+9C0194069C00943DF4C5F51FBD30B5ADF2CC4D40680C46
+0168D1F8CC1015468847B0F5966F04D917210FF26C00DE
+F7DAFE204631F4A7F603464FF4966207A901A862F4F0F5
+297862F471F6697800F020F8A97800F01DF8E97800F01A
+F8297900F017F8512100F014F8762100F011F8002100F0
+0EF801A862F4DFF5009007AB02220421204631F4EAF50D
+F2CC4D30BD000001A862F44BB6000070617463685F676C
+6D657372645F7472616E73616374696F6E5F7270635F65
+6E636F6465725F636172702E63707000002DE9F043ABB0
+044604F6941105A84BF42DF704F634290AE004F6BC1048
+F46CF2694648464BF4A4F705A84BF43FF705A84BF43EF7
+C0B905A968464BF41DF7266861686A4602A837F4E3F200
+F07DF800F075F800F06DF802A93046984700286946DAD1
+04F60C20DDE704F62C11F19403F019820005A815F443F2
+42E0761C6068F9B237F453F3F6B2864207D260683246F9
+B237F467F30028F0D1A8460022F9B201A840F449F388F0
+0100054209D00122F9B2684640F440F3024601A902A840
+F491F4606801A937F413F304EB4010008A042813DB2668
+616801AA03A837F49CF200F036F800F02EF800F026F803
+A93046984718B901A9484648F402F205A815F4DFF105A8
+18F488F598B905A818F48EF507466168FAB204A837F46A
+F204A833F4F3F0002500284FF00008B7D001250026A5E7
+2BB0BDE8F08333685B6941EC100B3A4670470746D4F8EC
+0E06F443B60000E0680168D1F8BC1108470000F8B50446
+0D46002600277AB22946684640F4E4F2014604F604104B
+F4E5F608B1012603E07F1CFFB2032FEEDB3046F2BD30B5
+0FF2A80485B004AB25680FF2A4041D6000200FF298031B
+7825680FF298048DF80C3002AB1D6001AB25680FF28C04
+1D60002325680095062918D8DFE801F00F0F040F0B0713
+009AB903AB0FE0032A0FD202A90AE0032A0BD201A906E0
+032A07D204A902E0032A03D26946531803B1187805B030
+BD00000B4B1B7801220BB101207047007C06280CD8DFE8
+00F00606060606040800072902E0012900E0052908BF00
+2210467047A3CB91000106080001000000070201000103
+05000100000030B5ADF2CC4D40680C460168D1F8CC1015
+468847B0F5966F04D912210FF28C00DEF75AFD204631F4
+27F503464FF4966207A901A862F470F4296862F45BF569
+6800F031F8A96800F02EF8E96800F02BF8296900F028F8
+696900F025F8A96900F022F8E96900F01FF8296A00F01C
+F800F019F8A96A00F017F8E96A00F014F8296B00F011F8
+00F00EF801A862F44FF4009007AB0E220421204631F45A
+F40DF2CC4D30BD0000696A01A862F424B570617463685F
+676C6D657372645F7472616E73616374696F6E5F727063
+5F656E636F6465725F70696B652E63707000002DE9F84F
+80462DED0A8B08F12C0A82B09AF801B09AF802900C4608
+F17F0040F4EFF200259FED549B9FED55AB38B108F17F00
+15F4ABF2471EBF41FF0F00E0002708F17F0048F406F030
+B108F17F0015F49DF2012808BF01270097002757E0BBF1
+000F01D04F4550DA009810B1B81E03284BD208EB87069F
+ED44CB706B08F4C4F541EC180BF06D08F4BFF541EC1B0B
+53EC182B0020002106F437F304D153EC1B2B06F432F31B
+D051EC180B08F465F500EE900AB0EE608A51EC1B0B08F4
+5DF500EE100AF0EE480A18F4C7F3DFED310A00F06BF830
+4A304B06F4B7F541ECF19403801D82001C0B51EC1C0B53
+EC1A2B06F449F33CBFB0EE4CAAF0EE6CAA51EC190B53EC
+1C2B06F43EF33CBFB0EE4C9AF0EE6C9A7F1CFFB29AF800
+008742A3DB51EC190B53EC1A2B06F4D3F49AED190ADFED
+1D0A41EC180B00F03BF841EC100B15F45DF3052816DB20
+78A0B1174894ED010AD0ED000AB4EE600AF1EE10FA0ADB
+1348006808F455F553EC182B06F40BF334BF0325012502
+B02846BDEC0A8BBDE8F28F0000000080842EC100000000
+80842E4100000000000000000000B443112D4454FB2119
+4000007A44185200001452000020EE200A10EE100A08F4
+2AB570B582B00E4614461D46BEF455F120B116210FF278
+00DEF717FC16F1010F18D1E80705D5C7F442F004F00101
+E4F7AEFEA80729D5C7F43AF02A462146E4F7AEFEC7F434
+F02A46214602B0BDE87040E4F7AFBE00210020BEF403F3
+0168096888470799069B00912A4621460468A468A04700
+210020BEF4F4F20168896A88473146BDE87C40C9F46EB7
+73BD000070617463685F67756C706D655F6368696E6F6F
+6B5F656E67696E652E6370700010B5DFF82447204612F4
+04F004F12800BDE8104011F4FEB7F8B50446DFF80C0720
+600D4616461F46002012F497F713F437F06060002012F4
+91F713F45FF0A06004F514603EF4B6F704F594503EF4D2
+F704F59850002100F8181F41608560C660076100200023
+04EB4002FF21918104EB800204EBC00101F58061C2F85C
+31C1E90033401CA828EED3DFF89C5605F1280039F450F1
+284639F44DF12046F2BD00002DE9F843044690460D4640
+463FF46AF420B12A210FF2A460DEF770FB41F224374246
+385903689B68294698470022002128463EF44BF7002200
+2140463EF446F705F15E0015F422F150B105F15E0015F4
+1DF1012804D040463FF4BEF600284FD005F16006DFF820
+96307D0A2818BF0B2803D00C2818BF112804D105F15E01
+484613F40EF3307D0E281DD105F15E0109F1280026F41D
+F4002805F15E0104D009F1280013F4FDF20EE0484626F4
+0DF450B105F15E0109F1280039F4E6F038590268317812
+68904705F15E0104F514603FF489F629463FF4C6F600F0
+14F823F436F318B100F00FF823F4BDF300F00BF823F4B5
+F228B100F006F8BDE8F84323F406B3BDE8F18342462946
+204670472DE9F04F934687B0044600268A468BF89C6005
+A861680FF298580A68926A90470BF1780703E0C7214046
+DEF7E1FA05A840F4C2F0002800F0EC80656805A901A840
+F4BCF02A68926801A9284690478146494604A816F46EF6
+514604A825F4F6F0F19403102182000028E4D149466846
+16F48AF6494603A816F488F603A828F4A3F3012809F128
+0506D0D0D3032839D05DD3042858D0CAE7684640F415F1
+18B16F214046DEF7A8FA00F0C4F80146584614F476F528
+6B012640031BD595ED000AD7ED010A00F0B0F804D587ED
+010A00F0B1F8787099F8740009280BD195ED000AD7ED02
+0A00F0A0F804D587ED020A00F0A1F8B87099F874000F28
+9CD100F09AF8387098E7684640F4DFF018B188214046DE
+F772FA00F08EF801460BF1600014F43FF5286B01264003
+41BF95ED000AD7ED030AF4EE400AF1EE10FA04D587ED03
+0A00F078F8F87076E701208BF89C00684640F4BAF000B9
+012695F83000800608D4494602A816F412F602A828F42D
+F3042832D195F8300040062ED500F05BF801460BF13000
+14F40CF599F874000B281CBF0C28112806D100F04DF801
+460BF1480014F4FEF497ED050A00F03CF809DB387C7874
+87ED060A00F03DF838742868786139E797ED060A00F02F
+F8F9DBC7ED060A00F030F878742EE700F02CF801460BF1
+180014F4DDF497ED070A00F01BF809DBB87CF87487ED08
+0A00F01CF8B8742868F86118E797ED080A00F00EF8F9DB
+C7ED080A00F00FF8F8740DE7304607B0BDE8F08F0000D5
+ED000AF4EE400AF1EE10FA7047000068463FF4D1B70000
+2DE9F84F804608F598562DED028B1836ADF52A7D7160CC
+4C214604F1280014F48BF7204638F496F79FA811F403F6
+0FA811F400F68DA815F479F3D8F804100A68926A06A890
+4726E0D8F8044006A968463FF49AF72268926869462046
+904704462146684616F44CF569469FA813F478F194F874
+000A2818BF0B2804D00C281CBF11280D2807D121466846
+16F44DF569468DA815F459F306A83FF474F70028D3D1B0
+68026892688DA990479FA967A815F42BF366E04269002A
+1CBFDBF81420002A39D009782A79914235D141680068DB
+E9002306F4D9F121F0004141EC100B53EC102B00209A49
+06F445F041EC100B15F4DBF0B0EE408AF0EE608A04F15E
+003FF45FF7142500B10425284606F4AFF141EC110BB0EE
+480AF0EE680A18F48FF051EC100B8C4A8C4B05F4E5F704
+D8F0680268126A01A99047B0680268D268214690479DF8
+00018AF00101084314D12146404624F452F0B56804F15E
+0108A828F44AF22A68D26901462846904720B104F15E01
+0FA813F4F5F07F1C032F38DB67A815F4D1F267A815F4D0
+F2002840F09A8067A905A815F4BFF219A83FF418F767A9
+684615F4B8F219AA69464046FFF70FFE09A814F4EAF500
+F0D4F8814609A9F19403A024820041A814F4EBF40BE0F4
+6841A818F47CF022681268C1B22046904741A814F4BEF4
+41A818F467F00028EED0B9F1FF0FC7D000277AB2494604
+A83FF4ECF500F0B8F80400BAD04FF0000A04F15C0578B2
+10BB214603A816F49EF403A828F4B9F1022808D0214602
+A816F495F402A828F4B0F1042810D1494625A817F4BCF7
+20B949461FA817F4B7F730B12A7F2146404624F475F04F
+F0010A287E08281CBF01203070002F2FD10222494601A8
+3FF4B3F50146D8F80400026892689047002822D000F160
+0100F1180B8A7E002A04F118003FF413AF416800680022
+002305F42DF711D8DBE9000105F428F70CD82D489BED04
+0AD0ED000AB4EE600AF1EE10FA02DB03202870687039E7
+0FA824F4C6F602282FDB0FA941A815F41AF225E041A968
+4615F41BF219A83FF474F6024669464046FFF76FFD09A8
+14F44AF500F034F80146002201A83FF467F500F033F8B4
+6800F15E0102A828F471F12268126A01462046904741A8
+15F401F241A815F400F20028D4D008F594503EF4CAF440
+4623F423F70DF52A7DBDEC028BBDE8F18F00009CC99100
+D0C0000000408F409B9999999999B93F90B80700024619
+A9404623F43FB30000D8F8042001461046126892681047
+000070617463685F676C6D657372645F737669645F7265
+706F72745F6D67722E637070000000704700002DE9F84F
+2DED048B044692B0207A8A469346B0EE408A10B90F2100
+F051FA04F2447500F029FA8046A8680168496C8847209E
+0121317008F1940706F17C0979783171797886F82C1079
+7886F85410797989F800102199B172817B808900EE101A
+00F016FA286880EE209A64F40DF3D8ED000AB0F8DC0000
+F005FA60EE208A00203279904206EB80011FD25AF82020
+00EE102AB8EE400A00F0D5F881ED030A9DF858200AB100
+2212E05BF8202000EE102A00F0C6F80BEB800281ED0D0A
+92ED080A00F0BEF881ED170A03E00022CA604A63CA6540
+1C0828D3D300F0CAF918B100F0C7F9012840D138780528
+18BF06283BD109A80FF2FC31202206F458F700F0B4F94F
+F0000B70B100F0CBF983280AD201A80FF2FC31202206F4
+49F7202201A909A806F444F7307983450ED209A850F82B
+005AF8200000F0A6F920EE090A06EB8B0080EE280A80ED
+030A0BF1010BBBF1080FE8D3002000E0401C31798842FB
+D3002000E0401C8842FCD3A8690121EDF708FCB0EE409A
+F0EE609A18EE900A08F452F004F5ED625368126805F422
+F653EC192B06F468F007F4FEF708EE900A286864F47BF2
+89F8020006F1F19403302882007F01AA69684641F42FF6
+06F1880080ED028AD8F82C10C160E168C9F8081094ED0E
+0B80ED000BC0ED048A01203070B87889F8010000F048F9
+60B900F041F948B100F05AF9832805D23878072804BF04
+2089F801003878052812BF0628032089F80100B8797071
+06F12C01F879B071B8794870F879887006F15401B87948
+70F8798870B079082802D3932100F045F912B0BDEC048B
+BDE8F18FB8EEC00A20EE090A80EE280A704700002DE9F8
+4F2DED048B044682B0207A10B9992100F02DF994F85800
+00281CBF94F8F800002802D19A2100F022F904F24475A8
+680168496C8847019000F0F5F88046A8680268697FD26D
+90470646286864F4F1F18246286864F4EFF18146A86802
+68697F526A90470746A8680268697F926A9047002F08BF
+032806D1202209F5807109F5907006F45AF608F19400D6
+ED058A96ED169A477998ED008A04F55676012030709AF8
+25003072012030760AF11400A96931F40BF186ED040BE0
+687060B9F8DC0000F0B7F820EE080A80EE288A00EE107A
+B8EE400AF6EE008A20EE090A20EE280A10EE100A07F475
+F741EC100B14F467F5C0B2009029EE280A86ED0B0A04F5
+627000990170477008F1940086ED0A8A877890F803A090
+F804B000F081F878B900F07AF860B100F093F8832808D2
+98F89400072804D104274FF0010A4FF0020B0198807B00
+EE100A0198808900F078F8082FC0EE208A02D3DE2100F0
+89F809EB870000F07BF886ED090A00F059F818B100F056
+F8012809D198F8940006281CBF0528072802D109EB8B00
+03E00098C01909EB800000F062F886ED070A98F8940006
+281CBF052807280CD00098874202DAF72100F05DF80098
+381A082802D3F82100F056F800F02CF818B100F029F801
+2809D198F8940006281CBF0528072802D109EB8A0003E0
+0098381A09EB800000F035F886ED080A204659F466F284
+F8D00302B004F10801BDEC048B04F56470BDE8F44F40F4
+1FB3000020680168896F0847A86914F499B30000A86802
+68697F526D1047000000EE100AB8EE400A7047000000EE
+900AB8EE400AF8EE600A7047000020680168D1F8701108
+47000090ED480AB8EE400A20EE280A80EE080A70470000
+0FF20400DDF7A8BD70617463685F676C6D657372645F73
+61745F7265706F72745F74726B5F6D736D742E63707000
+0000020000000300000000000000060000000100000005
+0000000400000007000000030000000400000001000000
+0000000002000000060000000500000007000000F8B504
+460D461646F19403C02B82001F4605F15E0014F433F301
+2800F0B980E567C4F88060394604F1780064F426F00698
+E0752946204664F42EF00020207600274FF07E50E06130
+4627F455F63818007BFF2808D194ED070ADFED4E0A30EE
+200A84ED070A0DE0304627F445F63818217E007B814205
+D2304627F43DF63818007B20767F1C052FDEDBDFED430A
+94ED070A0FF21417B4EE600AF1EE10FA03DA33213846DD
+F724FD94ED070A17F484F484ED070A294604F1280058F4
+0FF004F1780062F4CFF520B904F1780063F4EAF718B104
+F1280063F4EBF700220021684638F4E8F3014606208DF8
+000007988DF80100204633F4C4F4204663F4EFF7E0B105
+F15000816821F02001816021F04001816021F080018160
+21F00801816021F40071816041F48001816000F039F801
+213EF428F519480068686300F031F80546204663F4CBF7
+85F8480000F029F80546204663F4C5F785F84A0000F021
+F80546204663F47DF785F84B0000F019F80546204663F4
+7BF785F84C00204663F470F738B1204663F472F718B15B
+213846DDF7AFFCF1BDCDCC4CBE9A99193EA83E00003046
+63F4B3B6000070617463685F676C6D657372645F736174
+5F7265706F72745F76657474696E672E63707000000000
+2DE9FC4D0D46044605F16007606897F800801646414600
+F5146036F477F2002838D1606805F15E02414600F51460
+36F44BF200287BD0284627F492F0002860680FF2081B42
+F6D45A414624D000F5D45037F438F0C8B9002542F6D016
+606800EB85004146305833F495F238B1606800EB850142
+4671581EF429F506E06D1C092DECD330215846DDF74BFC
+60684146504413F41AF74BE000F5D750FEF75DFE00283F
+D000F04BF8387D0A2804D060684146504413F42BF72946
+01A827F45DF001A83FF496F2022832DB00F034F890F84B
+0090B100F02FF890F84C0018B149215846DDF71EFC2946
+684627F446F06068694600F5D75037F452F300F01CF890
+F84C00A8B100F017F890F84B0018B152215846DDF706FC
+23685B6A324629462046984705E0606841461EF49DF400
+F007F8BDE8F38D0000304627F4F7B40000606832462946
+00F5D75037F449B3000070617463685F676C6D65737264
+5F6163715F6D67722E6370700000002DE9F0418AB00446
+04F5927504F59476287804F1FC0704F1D40838BB404638
+F495F120B1204632F421F707281ED120464AF4E4F40246
+3946684638F465F1694640464AF4D5F488B1304638F47F
+F120B916210FF25800DDF7AFFB012028702146D4F8CC00
+02689268F19403502F820090471BE02878C8B139464046
+4AF4BCF4A0B100202870384638F466F13146384638F468
+F1304638F45FF1E86A401CE8622146D4F8CC000268D268
+90470AB0BDE8F081000070617463685F676C6D65737264
+5F7368617265645F7361745F7365617263685F6D67722E
+6370700070B52DED068B82B004460D461646B0EE409AF0
+EE608AB0EE418A00F0FDF800F0F7F800F0C3F900F0FDF8
+EDB290ED060A002D18BF032D16D1F6B2022E18BF032E11
+D1A06801686668896825B9884701460223002203E08847
+01230422014635686D693046A84700F0BBF800F0C5F8B0
+EE409A31F425F6B0EE69AA4168006807F4EFF309EE29AA
+09EE100A00F01FF80AEE089A808900EE100A6068016849
+6CB8EE408A884729EE080AD0ED000AC0EEA80A20EE208A
+00F09AF802DC452100F05EFE02B0B0EE480ABDEC068B70
+BD60680168496C084770B52DED048BB0EE409A9FEDA80A
+B4EE409A82B00446F1EE10FAF0EE608AB0EE418A0D4616
+4648BF00206BD400F08AF800F084F800F050F900F08AF8
+EDB290ED060A002D18BF032D16D1F6B2022E18BF032E11
+D1A06801686668896825B9884701460223002203E08847
+01230422014635686D693046A84700F048F800F052F8F0
+EE408A31F4B2F5B0EE699A4168006807F47CF308EEA99A
+08EE900A60680FF68854FFF7AAFF49EE088A808900F00E
+F920EE288A00F030F803DA78212046DDF7A7FAB0EE480A
+17F407F2B0EE408A00F023F803DC7D212046DDF79AFAB6
+EE000A38EE008A9FED720AB4EE408AF1EE10FA03D47E21
+2046DDF78BFABDEEC80A10EE100A80B202B0BDEC048B70
+BD60EE299AB0EE680A17F4C6B1B5EE408AF1EE10FA7047
+0000F0EE400AB2EE040A00EE809AF2EE040AC9EE200A17
+F4C6B101216846ECF71ABFF3B2EAB22146684600F034BE
+00EE100A60680268D26CC8EE809AE9B2104700002DE9F0
+412DED068B064682B070680C460168496C1546F0EE408A
+B0EE608A88472B46808900EE100AF8EE409A2246314668
+4600F00FFEFFF7CFFF00F09BF800EE100A70680268D26C
+88EE008A21469047270090ED06AA18BF032FB3EE069A1A
+D1022D18BF032D16D1B0680168D6F80480896824B98847
+01460223002203E08847012304220146D8F800C0DCF814
+C04046E047B0EE40AA70680268D26C21469047012F007A
+00F060F880EE080ABDEEC00A10EE104AE4B22AEE08AA04
+D1022D06D16406240E03E0022F08BF9FED219ABBEE0E0A
+39EE000AF2EE040AF2EE04AA00F03DF8042F20EE080A09
+D1BBEEF19403E0328200080A39EE000AF2EE040A00F031
+F820EE080A00EE904AF8EE600A20EE0A0A20EE200A20EE
+200A032F20EE290A08BF032D20EE280A0CD1DFED0C0AF4
+EE608AF1EE10FAACBFF5EE000ADFED080A20EE200A02B0
+BDEC068BBDE8F08100000100A04000FF7F4700000042B7
+F37D3D0000803DC0EE200AB0EE6A0A17F4FEB000EE100A
+B8EE400A7047000051EC100B07F456B22DE9F24F2DED0E
+8B0446ADF56E7DFFF783FE4FF460710EAD808900EE100A
+0DA806F41EF14FF47A70ADF83400B8EE40AAC820ADF838
+00F3EE048A0F20A8714FF4C3702881F0EE680AAA7B9FED
+1F0A002120462FAE1AF498F1B0800022606803681B6B00
+219847074600F0E6FC00219847804600F0C5FC39469047
+414690ED02BA00F0BEFC9047394690ED028A00F0B8FC90
+47007919F4B6F000F0B2FCF0EE40BA41469047007919F4
+ADF0A0680168D1F89811B0EE409A884700F008FD06D200
+F0E5FC90ED030A07E00000484300F086FCFFF792FF00EE
+100A00F068FCA0680168D1F89811F0EE40AA884700F0EF
+FC04D200F0CCFC90ED030A05E000F06FFCFFF77BFF00EE
+100A00F047FCA0680168D1F8A011F0EE409A884700F0D8
+FC04D200F0B5FC90ED040A05E000F052FCFFF764FF00EE
+100A00F03AFCA0680168D1F8A011B0EE40BA884700F0C1
+FC04D200F09EFC90ED040A05E000F03BFCFFF74DFF00EE
+100A00F019FCDFED7F0A2AEEA08A60EE20AAB0EE480A2B
+EE209A09EEE00A00F0F5FB03D44FF48D7100F01EFC39EE
+6A0A00F0ECFB03D440F21B1100F015FCFFF74BFE03DA40
+F2211100F00EFCDFED6EAAB4EE6A8ADFED6D9AF1EE10FA
+A8BFB0EE698AB5EE409AF1EE10FA03DA40F2271100F0FA
+FBB4EE6A9AF1EE10FAA8BFB0EE699AB0EE480A13F4AFF7
+2874B0EE490A13F4AAF7687400F007FC00219847074600
+F038FC00F0A6FB18B94FF49A7100F0DBFB00F02FFC00F0
+B9FB0DF14A0100F0D0FB00F003FC0021984700F0AFFB0D
+F15A0100F0C6FB00F0E8FB02220021984700F0A4FB0DF1
+6A0100F0BBFBDFF8A0062F90002100F02AFC007D307200
+F0CAFB08B1032002E000F011FC407D7072002100F01CFC
+0021807DB07200F017FC007DF07200F0B7FB08B1032002
+E000F0FEFB407D3073002100F009FC0021807D70730DF1
+DE0B00F002FC002100F0FBFB0022807D30740021042070
+7600F0EEFB307701220420F07700F0E7FB8DF8DE000222
+04208BF8030000F0DFFB8BF8060004208BF80900A06801
+68C96F884718B1A88840F48060A880A0680168D1F8A811
+8847F194037036820018B1A88840F40060A880F6EE000A
+DFF8CC0590ED000ADFF8C80540EE0A0A90ED000A0DF5B2
+7AFCEEE0AAF6EE000A40EE0A0ABCEEE0BAC6ED05AACAED
+03AA1BEE100A00210DAA02EB8102491C0E29C2F8D001F7
+DBDFF88C0500F012FBDFF8880506E000BF000080350100
+7E4300007E43B6EE001A40EE0A0A90ED000A8FA800F101
+0820EE0A0ABDF83800B3AFDFAEFCEEE0BAF5EE000A00EE
+201ABCEEC1CA00EE100A98F81920C7ED05BA86ED05CAF0
+EE680AB8EE400A0321204619F4E5F7B8804FF0FF0988F8
+1B9000F02AFB00F0C8FA96A900F0F5FA00F029FB032198
+4700F0BFFA9AA900F0ECFA00F00FFB03220321984700F0
+B5FAAEA900F0E2FADFF8F004B390032100F052FB032100
+7D38722820787200F04BFB0321807DB87200F046FB0321
+007DF8725020387300F03FFB0321807D787300F03AFB00
+7DB87300F0DAFA20B100F0D1FA08B1022000E05020F873
+032100F02BFB0022807D387403212C2038830920B87600
+F018FBF87600F0D8FA00F076FABAA900F0A4FA04208DF8
+F902BEAF00F0D9FA03217F1C9847F87003220220B87103
+2100F000FB0146797260680268526D904790ED008A6068
+0268797A526D9047F0EE480A90ED0C0A204618F481F178
+71022200F0A5FA0090012200F0A1FA00999431943031F4
+28F218B940F2D51100F071FA0420F872F0EE680ABDF838
+007A7BFFF77AFD0421204619F444F7B08003220120B873
+87F80F9004216068DFF8D87303689B6D9847042100F021
+FAC6A900F04DFA00F0ABFA042100F019FACAA900F045FA
+00F0A3FA042100F011FADAA900F03DFA00F09BFA042100
+F009FACEA900F035FADF97042100F0A7FA0421007D3072
+00F0A2FA0421407D707200F09DFA0421807DB07200F098
+FA0421007DF0720220307300F091FA0421807D707300F0
+8CFA042100F085FA807D30740120707600F049FA042198
+47307702220120F077042100F071FA8DF89E03E7AEB61C
+0120F0700322606803681B6B04219847B07186F80C9001
+2070728BF8129000F013FA02219847834600F032FA0BF1
+9401943031F49BF118B94FF40A7100F0E4F900F026FA02
+2100F0ACF90DF1F20100F0D8F900F00BFA022198470221
+00F0A1F90DF5817100F0CDF95997022100F03EFA007D8A
+F8080000F0DDF920B100F0D4F908B1032005E060680268
+D26C02219047407D8AF80900022100F028FA0022807D8A
+F80A00022102208AF8110000F015FA8AF8140001220220
+8AF81700022100F00CFA8AF81A008DF8849100F0BDF901
+21F19403003A82009847074600F0D6F900F05CF938B100
+F0DDF9074600F0E0F900F054F918B940F2552100F089F9
+00F0C5F900F001FA0DF5C37100F07EF900F0CFF900F0F9
+F90DF5CB7100F076F900F0C1F900F0F1F90DF5D37100F0
+6EF982487E90012100F0DEF9007D8DF8000200F07DF920
+B100F074F908B10A2005E060680268D26C01219047407D
+80AD012168709FED768B00F0C6F90022807DA870012102
+208DF83D029FED73DB00F0B2F988F803000122022088F8
+060000F0B7F988F809000222042088F80C0000F0AFF988
+F80F0088F81590022088F812009FED679B0820B073A068
+0168D1F88811884751EC100B644A644B04F4FDF653EC18
+2B04F4AFF453EC1D2B04F47DF504F4EFF500B240423082
+022201208DF8040001A9684613F486F3A168ECF7B1FA00
+F0C3F804F4DDF500B2404270826846A168ECF7A6FA9FED
+521BB0EE41EAF0EE61EA00F0B2F841EC100BB0EE4E1AF0
+EE6E1A16F4E4F453EC102B51EC180B04F47AF453EC1D2B
+04F448F504F4BAF540B24042F073FC982FF4B2F5016889
+6988470368FC991B6B0DAA98473F4890ED000A3F48CDED
+00AAF6EE000A00F08CF88DED010A00F0A4F83A488DED03
+BA00F083F88DED020A00F09BF8CDED06BA00F07BF88DED
+070AF6EE000A334890ED000A32488DED0BCA00F06FF88D
+ED080A00F087F82F4800F068F88DED040A00F080F82C48
+00F061F88DED050A00F079F82A4800F05AF88DED0C0AF2
+EE040A90ED000AFC9820EE0A0A80EE200AF6EE000A30EE
+200ABCEEC00A8DED090A2FF459F50168896988470368FC
+995B6B6A4698470DF56E7DBDEC0E8BBDE8F18F00004832
+0000583200005C32000068320000303333009899190000
+00000000003040000000000000E03F0000000000FBC340
+92EC0044234E3D40000000000000F03F4C320000543200
+00643200006032000078320000743200007C3200001CB1
+810053EC102B51EC190B04F4D0B340EE0A0ABCEEE00A70
+47000007F19401943030F4E7B700000321009100F19402
+AB797047B0EEC00AF6EE000AB4EE600AF1EE10FA704700
+00F6EE000A90ED000A704700000021009100F19402AB79
+704701220021B0EE491AF0EE480A2046FFF751B9000001
+220021B0EE6B1AF0EE4B0A2046FFF747B90000891C2046
+1AF478B40FF27C10DCF7B0BCA0680168D1F8A011084700
+00A0680168D1F8981108470000A0680168D1F898100847
+0000A0680168D1F844110847000060680268D26D704701
+22606803689B6D70470000606803689B6D042118470000
+F19403903D82000022606803689B6D0321184760680368
+9B6D012270470000606803681B6B012270470000606803
+689B6D002201211847606803689B6D0022022118476068
+03689B6D022201211847606803689B6D01220121184760
+6803689B6D002200211847606803689B6D032204211847
+60680268D26C0021104700000021606803681B6B184700
+00007DB0735020F07360680268D26C1047012160680368
+1B6B184700000121009100F19402AB79704751EC100B00
+22002304F4ECB238B5044632B1022A0ED00BD3042A17D0
+0CD317E0022B21D1002168460FF48AF7022220E002211A
+E0012118E0032B05D1042168460FF47EF7012214E00421
+0EE005210CE00FF2280540F2D6212846DCF703FC4FF436
+712846DCF7FEFB002168460FF468F700226946204613F4
+B9F131BD70617463685F676C6D657372645F7265636569
+7665725F706172616D65746572735F70726F6772616D6D
+65722E637070000000002DE9F0438946ADF5097D044699
+F9140000270B2890461E4604D01A210FF29C10DCF7C8FB
+002504A8302101FB050074F409F06D1C0B2DF6DB424604
+A9204600F01FF803288DF8080014DB9FED570B86ED0A0B
+86ED0C0B0B2106F138006BF4E6F402A8019000960B2304
+AA49462046A9F4C1F6074638460DF5097DBDE8F0830000
+2DE9F0410D00FCB00446174604D146210FF22810DCF78E
+FB00264CA800EB06181021404606F446F54046A4F49BF3
+761C0C2EF2DB3AA813F435F5206875F4E2F00246394602
+A8ADF43DF002A914A813F405F54CAE30E000F06DF82068
+0022694674F438F5074600F065F8206800230022694674
+F4C1F480463846ADF435F0C0B100F058F86A4606F10901
+01A840F44EF2D8F8480006F454F40022224B04F426F2C6
+E9000100F046F869463AA813F408F5103614A813F4CEF4
+14A813F4C9F40028C9D03AA812F4F8F341B2022904DB18
+4B10224CA886F49AF53AA812F4EDF30B21C0B213F417F1
+46B2002714E04CA800EB071000F10901684626F438F401
+463AA843F49CF130B16A4629462046A9F456F000B13035
+7F1CB742E8DB30467CB0BDE8F081000065CDCD41000000
+0000007940E1330D0014A9684613F496B470617463685F
+676C70655F6C73712E63707000002DE9F041ADF5856D16
+00044608BF0D26A6F109000528884604D322210FF26010
+DCF7E0FA404611F4B5F2002800F091803246012105A811
+F4B3F204F15E0040F4BFF1014605A811F42BF304F15001
+684612F484F7694605A811F442F304F15C0705A83978F1
+94032041820011F4CCF204F1080505A895ED070A11F435
+F5696A00F070F8A86906F4B7F300F073F8E86A06F4B2F3
+00F06EF895ED000B00F06CF895ED0C0A00F062F895ED0D
+0A00F05EF895ED0E0A00F05AF895ED020B00F05CF895ED
+040B00F058F8397900F059F8397E00F056F8A96A00F045
+F8797E00F050F895ED080A00F042F80A2E09DBE96B00F0
+39F8296C00F036F895ED110A00F036F80B2E02DB797800
+F03BF80C2E18DB04F15E0013F433F0012804D1032100F0
+30F80D210BE004F15E0013F428F0C1B200F027F804F15E
+0010F4C1F0014600F020F80D2E02DB797900F01BF80422
+414605A811F44CF205A812F4CDF101200DF5856DBDE8F0
+8105A811F4E7B2000005A811F4BBB4000041EC100B05A8
+11F4E1B4000005A811F441B2000070617463685F676C6D
+655F6D736D746D67722E637070000038B5044615467CF4
+75F130B12168C96B2046884785F84000012032BDF8B505
+460C462A68126D1B219047002670B12268126D1B212046
+904740B12A68126D1C212846904700F08EF887420AD112
+21284675F45CF607461221204675F457F6874200D00126
+2A68126D05212846904700F073F8874218BF01262A6812
+6D0321284690472268126D0746032120469047874214BF
+002686F001062A68126D0721284690472268126D054607
+2120469047854218BF00263046F2BDF8B516461C4621B1
+481E252801D2262904DB37210FF2A000DCF7BCF9326812
+6D1C213046904700F041F8002587420CD13268126D1221
+304690472268126D0746122120469047874200D0012532
+68126D05213046904700F023F8874218BF01253268126D
+1D21304690472268126D07461D2120469047874214BF01
+2700273268126D0321304690472268126D064603212046
+9047864218BF012547EA0500F2BD2268126D0746052120
+4610472268126D07461C212046104770617463685F676C
+70655F62646570686D67722E6370700070B504460D4628
+4646F4C0F306280FF2044658D8DFE800F0040C141C2E3D
+4F0000F058F8D8B102281FD01BD320214BE000F050F810
+B994ED010A70BD2A2143E000F048F810B994ED020A70BD
+34213BE000F040F818B1022807D003D308E094ED000A70
+BD94ED050A70BD94ED080A70BD422129E000F02EF818B1
+022804D026D305E094ED030A70BD94ED090A70BD50211A
+E000F01FF818B1022807D003D308E094ED040A70BD94ED
+070A70BD94ED0A0A70BD5E2108E000F00DF810B994ED0B
+0A70BD682100E06A213046DCF7FBF89FEDC70A70BDF194
+03B0448200284612F4BDB6000070B51E46052A04BF012E
+C2480C46154611D0022E0AD1002D14BF032ABE480AD005
+2A18BF042A09D1BC4804E0042A08BF012E03D1BA4890ED
+000A70BD0168D1F88410884733462A462146BDE87040D2
+F45BB4000038B50D46D3F436F100F066F902D3882100F0
+34F900F04CF9457800F0A9F8854202DB892100F02AF928
+4632BD70B505460E46D3F41FF10FF2AC24806800788642
+02D3902100F01AF9281DD3F40FF1A04906EB4602555C85
+4202DB912100F00EF9284670BDF8B5054614462A68126C
+0E469047A0B100F07CF884420FF2682702DB9C2100F071
+F8281DD3F4F0F0864202DB9D2100F069F8002E08BF042C
+01D10020F2BD032E08BF032C0BD02846D3F4E2F0B42180
+6911FB060000EB8400D0F8C80000B10120F2BD000070B5
+04460D462268926A90472268526A064629462046904705
+46042D10D1B4210FF2F810DCF752F82046D3F4BFF0B421
+806911FB060000EB8500D0F8C80070BD032E08BF032DEF
+D1704870BDF8B504460D46164600F028F886420FF2C017
+02DBC32100F01DF8201DD3F49CF0854202DBC42100F015
+F8042E0CD1C62100F010F82046D3F493F0B421806911FB
+050000EB86008BE0032D08BF032EF1D15B48F2BD3846DC
+F713B8000005202FF405B000002DE9F843054688462A68
+0FF26016926A90472A68526A0746414628469047044604
+2C04D1D7213046DBF7F8FF03E0032F08BF032C1AD02846
+D3F460F0814600F01FF8B4214F43D9F8181000F01DF818
+B9E1213046DBF7E2FF2846D3F44FF0064600F00EF8B169
+00F00FF806E000F008F8394901EB8000D0F87801BDE8F2
+8300004146284642E00000791801EB8401D1F8C81001EB
+8000D0F8A4007047F8B506460F461546FFF7A8FF85420F
+F2C00402DBF02100F027F8301DD3F41CF0874202DBF121
+00F01FF8032F08BF032D00D18DE73046D3F413F00646B4
+204743B069381800EB8500D0F8C80018B94FF4807100F0
+09F8B06917EB000000EB8500D0F8C800F2BD00002046DB
+F789BF000038B50D46D2F4F4F700F024F803D340F20911
+FFF7F1FF00F009F88578052D03DB4FF48571FFF7E8FF28
+4632BD074805EB45010818704700000000000070320000
+14B1810018B181001CB1810020B18100F4B181000FF208
+04806800788542704770617463685F676C6D657372645F
+72656365697665725F706172616D65746572732E637070
+0000002DE9F0472DED0E8B04468846CAB04046C7F4BAF7
+064641F2AC47317838596BF4B5F1050068D02A68F19403
+40488200D2F89020711C9047002861D02B681B6B012271
+1C284698475FEA000958D0D9F80010C96B8847D8E90223
+054698F810A098ED0A9B98ED10AB98ED16BB98ED18CB9F
+ED65EB51EC1E0B03F4B8F6AA4541EC1D0B1ED003234822
+614914A80BF412F4395914AB9FED5F1BB0EE4D0AF0EE6D
+0A42466846BEF408F6C7F4A2F768B314AAB0EE4D0AF0EE
+6D0A41464046BEF424F723E002A86CF420F29FED521B05
+46B0EE418AF0EE618A53EC1D2B51EC1E0B03F485F641EC
+100B39592B46B0EE481AF0EE681A42466846BEF49FF5C7
+F45BF7002875D002A94046BEF4C9F7D8E90A2351EC190B
+03F423F721F00041D8E9102341EC180B51EC1A0B03F419
+F721F00041D8E9162341EC190B51EC1B0B03F40FF721F0
+0041D8E9182341EC1A0B51EC1C0B03F405F721F000414F
+F09442304B03F474F598F810509FED2ECBAA4541EC1B0B
+18BF9FED2DCB05D13078022804BF012D9FED20CB51EC1C
+0B53EC182B03F441F50ED353EC192B03F43CF509D353EC
+1A2B03F437F504D353EC1B2B03F432F521D2012D0AD1D9
+F80010C96C4846884720B9385931466BF40DF512E0BAF1
+030F1CBF98F8100003280BD1701C88F434F70546385989
+F454F7317800232A4687F4D5F2002000E001204AB0BDEC
+0E8BBDE8F08700BF0000000000003E4000000000004CDD
+40190D0900000000000000000078DEB141000000000000
+2440000000000000594030B5A7B004460D4612F410F329
+4601A848F4CEF616E001A9684648F4CFF668463DF486F4
+20B168463DF482F4012806D168463DF407F40146204612
+F4E5F001A848F4D6F601A848F4D5F60028E3D027B030BD
+000038B504460D46A81F142821D8DFE800F056170B0E20
+20201D1A111A14171A1D1A1D201D4747009FED2E0B31BD
+9FED2E0B31BD9FED2F0B31BD9FED2F0B31BD9FED300B31
+BD9FED300B31BD9FED310B31BD2268126D202120469047
+28B1022812D008D3032821D032E029462046BDE8344077
+F4A8B70A2D21D00B2D25D00C2D1AD19FED250B31BD0A2D
+06D00B2D0AD00C2D05D0172D06D01FE09FED210B31BD9F
+ED220B31BD9FED220B31BD0A2D06D00B2D0AD00C2D05D0
+172D06D00DE09FED1E0B31BD9FED1F0B31BD9FED1F0B31
+BD57210FF28400DBF79AFD9FED1D0B31BD0000FFFFFFFF
+FFFF7F3CFEFFFFFFFFFF3F3DFFFFFFFFFFFFDF3D000000
+000000C03E0000000000003040000000000000203E112D
+4454FB21193E112D4454FB21893D010000000000503E0F
+2D4454FB21593D000000000000A03F00000000F19403D0
+4B82000000003E102D4454FB21D93D000000000000B03F
+000000000000F03F70617463685F676C70655F6570686D
+67722E63707000000010B504461D212268126D9047A028
+11D22268126D042120469047C1B220467EF4D1F2DFED05
+0AB4EE600AF1EE10FA01D5012010BD002010BD0100C841
+006A05490840054988420CBF0FF2100000A07047000000
+00FEFFFFF010000030343737365F4130000749086808B1
+002070470648C008C00008600549C908C900091A016070
+4700BF90CB9100070389000053890038B504460D46AC42
+05D0206820188047241DAC42F9D131BD10B50446044979
+440E31044878440C30FFF7EAFF204610BD240000000400
+0000E5B4FEFFE18DFFFFB935FEFF79F2FEFFF194FEFF25
+D2FFFFAD28FEFF19E050F8041BCB0744BFA9F101035918
+121F0023042A41F8043BF9D25FEA827C0B4604D54FF000
+0CA1F800C09B1CD10744BF0021197050F8042B002AE1D1
+7047816807E002681168536889185B18C36008320260C2
+689142F4D04A1C82600878704738B504460D46A068E168
+884212D120686168884208BF08F419F52068227C016802
+B14944A16042685218E260083091422060ECD0A068401C
+A06000F8015D31BD2DE9F0418AB000F108010591026852
+0801EBC20106910021079108910168490800EBC1010831
+0091017901F001018DF8101040680099400801EBC00001
+9000200290039084E005A8FFF7A9FF044614F0030603D1
+05A8FFF7A2FFC61C25090F2D1BD105A8FFF79BFF00F10F
+0515E00598016808180599079049680818089005980830
+0590079808998842F0D0401C079010F8011D6846FFF793
+FF761EF2D1002D51D005A8FFF77BFF0646A00800F00300
+032804BF05A8FFF772FFDDF800800299039F06EB002008
+E0A8F10808A8F10801801A0A6849688F18394658F8082C
+8A1A8242F1D30C1AAE1C2DD0BC4206D158F8044B58F804
+0B0719BC42F8D00298039914F8015B884217D100980199
+884208BF08F47CF4009800689DF81010029009B1484402
+90009902984968009A09180832884203910092E7D00298
+401C0290761E00F8015DD1D10298039988427FF47BAF01
+98009981427FF476AF0AB0BDE8F0810000FDFDFFFFD842
+0800D0888900000000008FFEFFFF020000000200000014
+0000003E09000000538900CC35000095FDFFFFB2000132
+320FF3FF040001F1FF01F1FF01F1FF01F1FF01F1FF01F1
+FF01F1FF01F1FF01F1FF01F1FF01F1FF01F1FF01F1FF01
+F1FF01F1FF01F1FF01F1FF01F1FF01F1FF01F19403604F
+8200F1FF01F1FF01F1FF01F1FF01F1FF01F1FF01F1FF01
+F1FF01F1FF01F1FF01F1FF01F1FF01F1FF01F1FF01F1FF
+01F1FF01F1FF01F1F5011003CD150100D9043E206028FE
+040166281003A1068000EA1C20027FB8C0FF0812B71012
+FC0812CD0820060E010100BEE7AEFF0812E31012200820
+1305C58100E408010019C48100180A0100093480009068
+110812E00810078D03800010180100790810079C190100
+11048000D408100889BB8100D02B01004DBC4010022C01
+00C50813642D181003BA8100142E28101EBD8100683001
+00D5B78100E845010045B88100A849010081C181008C52
+0100FD0812B008100741C2810038530100A5101003A054
+0100310810032C6F01004908123C081008A1C981009480
+0100DDC8401002A10100291012E408100F51C0810098AF
+010095BE810000B0010001201344B42012C65012C29810
+03C781006CC36011181324FC7012BF281022040200694C
+82009CD70200F16D8000EC170300ED728000503703009D
+FF800028430300BD0810043C4503000900501002460300
+51081003044703008508100B8849030081018100FC4A03
+00990813304B1012CB20128610110813C48B40100F2F82
+00B4C5030091308200D4C60300F53108100BC803007133
+8200C8D7030049F2F81003F0030025F938100A09040085
+E2810028310400C9081004845304001D1F301002540400
+A508101860550400B1208200A05A0400E5228200106104
+0001FA8100C073081007223846FC990400BD4030100A9F
+0400CDCC810080B404005508100B9CBD0400F1EF810074
+CD0400C108101330CE0400A9EA8100203F050039EB8100
+54410500750814241043050009148200BC610500812D82
+00FC6E0500650B8200047605003D0C8200147D05001DE5
+68100A89050001E68100708A050031481008648E0500E9
+2E82009497181007138200F89A0500851948100AA20500
+D91A82006CB4050005A8101070BE0500D1FB810040CD05
+002DFE8100BCDF281108100440E4050029E3B010070606
+00414A8200C0210815981004FCDC0600A900F8100AE306
+001502820040E50600650812580810039D048200D00810
+18FD16820020030700A51C8200DC71070005128200889F
+0700B92B481433AA0700892682004CC50700D928820030
+D10700D1068200F0710800050A82008C780800A11F8100
+60910800AD2A8100DC9F08000D2D881803AB0800C53130
+101AAF0800E1458000B0B508007946800008BB0800C903
+81000C030900DD0812240812FD08125808F19403F05282
+001BB5F240101A260900F1F68000783109000DF780007C
+40090031F88000A84A09008D08140C044B090001F98000
+54590900C5DA78180395090079DC581002980900A10814
+03E49A090095001004DCD809007142D8140A130A000D43
+8200D81C0A0005101C0414300A00E90430031803750A00
+11092814027B0A007500100B88D70A0099C08000BCE40A
+00C10812F4081C20893F8100F4C90B00E5418100F0CF0B
+00FD428100D8D20B0099518100E0EA0B0065589003200D
+F20B008D7381006EF60B00204684F8081B7D5A28100302
+0C003D5BE01403060C00FD5CE018030B0C00BD5F48100B
+1C0C00404600BFF0240C00216460110812410810040026
+0C001D65283018270C00C5688100A4360C00D96A8100C8
+370C00E96B8100B83C0C68141384600C0025A48100AC89
+0C00F1F18100489D0C008580100F14AF0C00ED3E82000C
+E40C006D3F8200840817F5982012F5381299B812F69010
+0E15820090080D00159D8100CC100D00D9081C0418120D
+00819E680311081BF1A0D81C03150D00653B98031C0228
+0D007140031404EC940D00A98210129A281006838000C0
+9B0D009D0812E00810012585808010010D007508128C08
+10041587800098A6581C078A80001CA90D00C98B080410
+07AA0D00458C800014AB481108123C081004A18D8000F0
+AC70100A8F8000ACAE0D0079908000F8081B7191201003
+B00D00699260100AB10D002993800084B30D00CD081007
+A4B40D0009948000CC081008F199800074B80D00E59D68
+100BBB0D00C5A280005CC80D00F5A54812CE40100FAF80
+0094D60D0001B1800064D70D0031B27812D8801108138C
+D9701EB3900512DAB812B7081006DD0D002DB88000D808
+1B59B95812E04811081310E3101003BB8000C8EC081007
+1E820044000E005135901003050E00D97520100B070E00
+4120A388140D0E002DD128100B1F0E00BDD2800088230E
+00B5D6081803270E0005D850100A280E0071DC8000E42D
+0E0099081404542E0E00A9DD101C03310E001948C0041C
+03420E00891A10041413500E00D5E1800070580E0091E2
+8000B45D0E0001E4201002610E009D081C0CF0620E00CD
+E88000806D0E0059EA80061C03730E00F1ED38061C0378
+0E00F9663003100B950E00B9688000C4960E0035692011
+0810044D6A80006C9818110812900817756B901002990E
+008108129C0812BD081C04F89A0E00C59008061002A40E
+00D1081804E0A70E0095918017A80E70100581007CAD0E
+0085081C0490B10E008D9708031002B4F1940380568200
+0E00E908133CB5E01960128008122508100390B60E0029
+081744B9281108126C081F091B180612C37011081300C4
+481A82A81003CB0E000D880812D0301C07C1800024080F
+000D36300418030C0F0035389010020F0F00C1081004AC
+180F00993A101003220F0059ECA01002280F00E9081003
+38290F00ED08124C0812F10812880812FD081C040C2A0F
+00A1EE28031002310F00A5081C0340340F0091A8051003
+54350F00950818043C370F0089D8E81003520F0085D9E0
+1C03550F00A99318031C02630F00DD20041008B46C0F00
+B9448200A46D901E45400310026F0F00390812BC081271
+08100398700F00D50810047C710F002146301108128508
+131072101E47580311081291081008A8740F00C9188200
+E48B0811F818033CA00F00F9381003A8C10F00F50812EC
+08135136101C03C30F001D0AE0041403C50F00115D901C
+03C60F00255E50031403C70F006560F012C8581661F01C
+02C90F00E1E80713D8D24816B9001803D40F008163B016
+D91812DEF01C03DC0F002DDF080612DE1011081003ACDF
+0F00AD801C03B85100005500054004D0C90000050004C3
+01000CF1CB0492030C520904F2F60104520D04E118F321
+03004CF19F04F1D3E4F157044C04300200002C029C3512
+16112BA0BB564DB235212012FF01000000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000010007300
+BF16F1019E020400B3491B27EBE6FFFF52E7EBCA236D59
+C02E0BF09D1E4D2FFFB6F9E1FF28FFFFFF020000001300
+730022F87C009E02040080355F27ABB6FFFF61EB14A546
+2C1E99289744D465DF178030EB1C007C00000002000000
+14007300521572009E0204009D2B5F27FBB6FFFF6FF014
+A571AA249985ADFBE45BD64A8E1D94E3FF700000000200
+00001500730082B668009E020400EBAB572734B7FFFF26
+ED14A5D20A36998239C8DDE2C08336CC5BE1FF04000000
+0200000016007300F74A59009E0204006CC2572750B6FF
+FFECEB14A5412A359921A508F6B51C163E22E5E0FF0900
+00000200000017007300EF9B28009E0204005FB2B12670
+B8FFFFED0715A5A455EFEE9973ECB6F19403105A820073
+A79AA8920BE1FF8EFFFFFF02000000180073006CF03200
+9E020400519DB12618B8FFFF35FC14A5B06BEDEEAAE10D
+04BA916D9C9E55E2FF69FFFFFF02000000190073003795
+2F009E0204002FBFBE26A7B7FFFF810C15A545B8E5ED63
+4E78057CB45C79AE9CE2FF33000000020000001A007300
+ADA355009E020400CE52BF26E5B8FFFF7B0F15A5CAA1EB
+ED5DC5360805514AB67E201D00D1FFFFFF020000001B00
+7300F05764009E0204006F785E27E4B0FFFF32F214A5B6
+C9A4444F5CF32EF9823ABA6C1C12003600000002000000
+1C0073002B6613009E02040003625D2793B1FFFFB7F714
+A575F3A2449C1D2D6853D420A10910FEFF290000000200
+00001D0073008BFC2E009E0204003AE351270FB0FFFF4E
+F514A5357D1243C1F7243D712E2D6C7D6D0D002E000000
+020000001E007300537141009E020400004A5127DDAFFF
+FF8BF714A5570F184399C578197C93B0B008740F000C00
+00000200000020007300AFAF4E009E020400F371512757
+B6FFFF3AE614A55982E698055493D4DA1DC0BFE7B4E1FF
+080000000200000021007300402C42009E02040089C351
+27C2B5FFFF82EE14A53CF5E498C23634EAD4284AEA0E43
+E1FFF0FFFFFF0200000022007300C9674F009E02040094
+CE3D278FB0FFFF95F414A58F4836430574521FF2E48329
+12E3EAFF4B0000000200000023007300BF805D009E0204
+00B4863E2794AFFFFF36F414A5F6F834437CB7E9125C87
+0677F0C4F8FF9C0000000200000024007300D9F170009E
+020400E056C02647B8FFFFD30D15A5EBA2D5EECF01E5BC
+52289542A31FE8FFF2FFFFFF0200000025007300B4E05B
+009E020400B87AC026EDB8FFFF26FA14A5F9F5D3EE2B82
+6AD00D9EAB6F416DE3FF280000000200000026007300B9
+B4F4009E0204007879DD272FEEFFFF5210E8CAE3599669
+762F6184A0B0996E5D2505001600000002000000270073
+00B1FB03019E020400A49D2127B7E6FFFFA5B0E9CAC407
+88BD89E8AF869BBE0115390C0100030000000200000028
+0073003E3DFF009E020400B0F62529EAE7FFFF4052EBCA
+6052811634E7FA8AA4D371B775B0050021000000020000
+00290073000C7CC5009E020400279A452761B5FFFF02E6
+14A5F66910993D2903C01E35AAF476DBE0FFDDFFFFFF02
+0000002A007300C90CB8009E02040046FE4527ABB6FFFF
+D9EE14A5E50A16999C27C0CB916DDE28F106E2FFF2FFFF
+FF020000002B007300C8E748009E020400864F1E2784B0
+FFFF42F614A53EA34043106D321CF19403A05D8200B206
+0C0E7F27E6FF67FFFFFF020000002C007300CA0061009E
+020400D2092327A3AFFFFFC4F614A52DD240432AA1F216
+2FFB9552EF4B0800A9000000020000002D0073004EF435
+009E0204008007E926F3B8FFFF090B15A59B25DDEE773B
+8AE29F4FBFFC118B0F0059000000020000002E00730077
+7259009E0204001B58E9269EB8FFFFC11B15A51290E2EE
+457F26EC48E4853208F1060066FFFFFF020000000FFF00
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000200000011
+FF00000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000020000
+0012FF0000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000002
+0000001FFF000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+000200000020000000010073008AE30B0098090400324B
+DA2702C7FFFF89EA04AA59D56D02C97F0EC2DBD9137DFF
+CEDAFFB9FFFFFF020000000200730097951A0098090400
+0561DA279EC6FFFFCAF404AAF68C6D024B1AB6F99E8B35
+C575780700170000000200000003007300903B2A009809
+04005889E42668C0FFFFF1D504AA2172EEAC4C34E8F060
+C1E622EA6BF1FFDBFFFFFF02000000040073009D012800
+9809040030FBE426AAC0FFFF8DD504AA1E47EFACF8BBF3
+C9830C43AA80D8E5FFB9FFFFFF02000000050073006CD0
+1D009002040052AAE426E6BFFFFF06D604AAC579EEAC1E
+61EAD1315D0B593D20F7FF1A0000000200000007007300
+1BC332009809040078F9E4261FC0FFFF00DE04AA91C0EE
+AC8E347DDBC86755F81EE0EDFFD8FFFFFF020000000800
+730000FD2B00980904000ACD2227A7C1FFFF32D804AA37
+63BDACF8A6CCE89B4EDE0A1802C400CBFFFFFF02000000
+09007300381C360098090400B81B23273AC1FFFF24D904
+AA9F93BDACF7728FE68042F96CFA4DB8008FFFFFFF0200
+00000B00730087E7410090020400BF8F6A2867C3FFFF08
+FE04AA1F7F5257485788260F7BD1798A92BE004BFEFFFF
+020000000C007300B44D330098090400E8B16A286BC3FF
+FF62E204AA514C5257E5073516ED5227B464A5A8005AFF
+FFFF020000000D007300D6FB1100E8040400F9948B281C
+C4FFFFEFE204AA43862F57C605A918A4436F0B41B30D00
+04000000020000000E007300BEB49354980904003419E7
+23AE7CFFFF4B9B4AA5EB8CF536F1940330618200A490DA
+4F412E7AEE50A6CFFF8BFFFFFF020000000F0073005DF2
+0B009809040071248B2887C3FFFFAEE504AA27122F57A7
+0B2A0AD103244083741A00EEFFFFFF0200000012007300
+E1E7BA5498090400EC83E123A8B9FFFF491A4BA5879BA2
+3732D0474FFAACB76BB108CBFF7EFFFFFF020000001300
+730021D9250098090400423B202710C0FFFF6DCD04AAF5
+18F4AC9959CBC1E468B3D561200A005400000002000000
+15007300C94B060040070400B2D6D52759C6FFFF4D0305
+AAC51A5002496570A1E1005FB924F9E9FFECFFFFFF0200
+000018007300FB22370098090400B64CC02789C5FFFF97
+F504AAAE5681021081161BBE4C6BE4273CE0FF4CFFFFFF
+0200000019007300D9101C00980904004DE5D527B0C5FF
+FFA60005AAD00350021A04DFBE38034E1FEE60EEFFF6FF
+FFFF020000001A00730005D20D00980904001D2845288F
+C3FFFF3A0305AA296F6157D9B6E24B6254D1BC60753600
+7DFEFFFF020000001B007300C11A160098090400978AD5
+2701C6FFFF94F204AA7A0B500289B652D44F0AC9A97907
+FEFFB7FFFFFF020000001E00730067FF1E009809040089
+24C02775C6FFFF74F004AA28A680023C7FE11E1376D480
+FE1D5D00F2FEFFFF020000001F007300B3C12200900204
+00E694D5279FC6FFFF26FA04AA3FA84F02BAB983BA2A2D
+795A8E30F0FFFDFFFFFF0200000021007300DA16150098
+090400A6878B2804C4FFFF1FE304AAB0092F5741B98911
+5429D3D8CBA3F0FF050000000200000024007300CEF816
+0040070400189F8B2874C3FFFF95E804AADE6B2F57DDF3
+06196EEC0A6E8DA3F8FFD2FFFFFF0200000006FF000000
+0000000000000000000000000000000000000000000000
+00000000000000000000000000000000020000000AFF00
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000200000010
+FF00000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000020000
+0011FF0000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000002
+00000014FF000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+000200000016FF00000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000200000017FF0000000000000000000000000000
+000000000000000000000000F19403C064820000000000
+000000000000000000000000020000001CFF0000000000
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000020000001DFF000000
+0000000000000000000000000000000000000000000000
+000000000000000000000000000000000200000020FF00
+0000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000200000022
+FF00000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000020000
+0023FF0000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000002
+000000240000000100730100203A0000000400CDBCB42D
+09B5FFFFF394D49DD2AB05A000003AEF58C0F40500A002
+000000000002000000020073FC0020010100200400CD5C
+082E48B6FFFFBF6ED49D051B22A1000073A68CB3AD5C00
+C00F000000000002000000030073050060FB0000300400
+CD3CEA2DD5B5FFFF146FD49D380AE2A00000DCA99D1883
+530040010000000000020000000400730600008F000040
+0400CD84232EB0B6FFFF416CD49D3D64FAA0000095BECD
+E17D390000030000000000020000000500730100405300
+00600400CC54262EBBB6FFFF7068D49DF25113A1000097
+A6AD461866006002000000000002000000060073FC00C0
+370000D00300CD8CB12DFCB4FFFFBE70D49D1488F19F00
+00D56B48AC3E9400800600000000000200000007007305
+00A0DA0000E00300CD94EB2DDAB5FFFF1370D49D538CEE
+A00000A4AA2AE7375000A0FEFF00000000020000000800
+73060080120100F00300CDECEC2DDFB5FFFF186BD49D08
+27EFA0000066B97C773C3D0020FEFF0000000002000000
+090073FE0000D80000000400CD345D2DBBB3FFFF4667D4
+9D8DEEA1F500004E912138466900000000000000000200
+00000A0073F900C0BE0000100400CD34DC2D9FB5FFFF55
+56D49DCD72A0F500001C0409736CF200C0FDFF00000000
+020000000B01730000E0450000300400CCC40C2E59B6FF
+FF2B55D49D1E6486F5000052AB517C415E00A0FFFF0000
+0000020000000C0073FF0020900000400400CD9CE42DBF
+B5FFFF7166D49DF71D02F600005ECE84D9FA3300C00700
+00000000020000000D0073FE00C0370000500400CD8CDA
+2D98B5FFFF2C54D49D539295F5000048441C8EEBB80040
+FEFF00000000020000000E0073F90060520000600400CD
+A4B02DF8B4FFFF9E64D49DF1940350688200E6AEF4F500
+003DA8ECC38C4D0020020000000000020000000F007300
+00006A0000E00300CDCCD72D8EB5FFFF9D65D49D10DD1E
+F6000039BE033811490060030000000000020000001000
+73FF00006C0100F00300CD9C912D82B4FFFFE376D49D0A
+9A0FF5000094099B2A83F50080FFFF0000000002000000
+110073040000660000000400CD449E2E89B8FFFFC666D4
+9DF9DEBB4B0000FA80898C898500400E00000000000200
+0000120073FD00C0930000100400CD44CD2E3EB9FFFF1E
+64D49D37E1F74B00008BF796256A0A00A0020000000000
+020000001300730300A0250000200400CDB4F72EE2B9FF
+FFFF56D49D54E9FA4C00009048622069B60020FBFF0000
+000002000000140073020080750000300400CD0CFA2EEB
+B9FFFFCB61D49D7CE80B4D0000D000972BF5F30060FEFF
+00000000020000001500730400C04D0000500400CD54C2
+2E14B9FFFF3F6FD49DD146E24B0000E56B2EFEB29900E0
+F8FF0000000002000000160073FD00001D0100600400CD
+ECE32E96B9FFFFCF5CD49DBA332F4C0000000FEF8B68F2
+0020FCFF0000000002000000170073030000470000E003
+00CDACE12E8CB9FFFF772FD49D4BB1294C00006A3B77C1
+DFCF00C0FFFF00000000020000001800730200A0340000
+F00300CDFC242EB6B6FFFF7661D49DDFC0604C0000E0A3
+B90C296800800100000000000200000018000000010073
+007625A505901004005F4B1F2824A9FFFFC07E0DA1CED3
+915FA54C23234DD0BAFA814D150099FFFFFF0200000002
+00730020F3540AA010040064CA3F27CFA3FFFF3EA50DA1
+59D1215C353568C285AE7606F1DDEBFFE7FFFFFF020000
+0003007300D2CFD901A0100400E18885274CABFFFF6B9B
+0CA16504D18922473123440098D0F674F9FFA1FFFFFF02
+000000040073008E2BA600A010040048AE1D27ABA4FFFF
+0DC00DA18EB0D7B5FDFA5E884CC4B63DF16CF9FFF7FFFF
+FF0200000005007300D8572403A0100400C9B0FD267AAB
+FFFFF72E0FA19D244D88126130251E4681672780FEFFF6
+FFFFFF0200000006007300DD161501901004004F791928
+A3AAFFFF09520EA148C33B5F511D8FD860077203C4FE00
+002B00000002000000070073005697BB07A0100400DC74
+C42600A7FFFF490A0EA1CBE078DF22A454A17C4DCAE291
+10060054000000020000000800730008AC4003A0100400
+AE5F652775A3FFFFDEE90CA17B12BD338C987902B7F33A
+57EA24FFFFF3FFFFFF0200000009007300D419F700A010
+04000B9FD3266BA4FFFFF19403E06B82005B010EA16200
+C3B3EF8F774A06301767C573F4FFF0FFFFFF020000000A
+007300478C6D03A0100400D433842779ACFFFF4B640DA1
+D714B38958505E97A68F22A96E28FBFFBDFFFFFF020000
+000C0073009B4B4604A0100400ECAAAB272CA9FFFF2BDA
+0DA1AD82B50CE57FD731AB8BEDC35113FEFFD2FFFFFF02
+0000000D00730025479502A010040073F06C27F8A6FFFF
+CB590DA1D871D6B9167E1F270048BB3EAADC04002B0000
+00020000000E00730056686A00A0100400505BFF2641A9
+FFFF550F0EA18B40960B87327F74845BACCB60150200BA
+FFFFFF020000000F007300EC87C806A0100400F59FD625
+4D9FFFFFA9F50CA1EEE0B1AFB9216E2845CDBD305765FB
+FF17000000020000001000730032D23C06A0100400CE3E
+AC27BBABFFFF49C20DA16ECB780DDC20A91B76982C7ABC
+ACF4FFCBFFFFFF0200000011007300C5CED506A0100400
+B29CFF27BCA7FFFF1CEF0CA1E2E0EE368E663EC07007FE
+55A5290F003400000002000000120073006176CC00A010
+04007E8E752705A9FFFF4A550DA1B9260860DC4F847511
+6EAE0804510B00EEFFFFFF0200000013007300E9EFC604
+A0100400FB60F02723A5FFFF93150DA1A7DAC538A44A0D
+4C86C27AB9258E00002C00000002000000140073006247
+1E0390100400999C412674A7FFFF55F3FDA053C7D6837B
+C4E97B619761199B111100FDFFFFFF0200000015007300
+ADE84A0CA0100400B8EF022780ABFFFF0A6E0DA1ACD120
+5CD3FF3CD2F9A2345B8E27040015000000020000001600
+7300CA149503A010040040271F2652A7FFFF84740EA1FB
+FFB985CBE6D9D97829AC2B27F1ECFF5400000002000000
+1700730017D8AB00A01E0400C92550274EABFFFF7D430D
+A16A86BC882863A96AEDE01C00DB110300D8FFFFFF0200
+0000180073008158B705A01004007B9B16267DA4FFFF30
+CF0DA1F7CD43DCFECD2F1EFB87E909BDBD040095000000
+0200000019007300A91E0B05A0100400A301282729AAFF
+FFA0F50CA1F3F3B309D0A38F2757872ABAB94405003C00
+0000020000001A0073001D960603A010040043FB6026AD
+A7FFFF0CB40CA1154DF8079D57620C13B1639EF0550300
+2A000000020000001B00730019CED604A010040082E7BE
+2722A4FFFF87760DA1526173348B5BDD197F9B6C53AB08
+FBFFCAFFFFFF020000001C3F73005F1FF408A0100400F8
+D2A227ADADFFFFD8E50DA16BED9D0DB7492FC9FB26436B
+6B061200C9FFFFFF020000001D0073000D5CFF00A01004
+0070221328EDA4FFFFF19403706F820043F40CA1008671
+371800055972CD125AECEBF3FFC9FFFFFF020000001E00
+73005C30B802A01004004C512A26CBA7FFFF02830DA1F6
+C327E06A42C48FB5AE5FDCCF81F1FFD7FFFFFF02000000
+1F0073009EA02305A0100400718DF1266AAAFFFFDB720C
+A14ED02BE0F6D6C80A26BC77CCB9EAFBFFEDFFFFFF0200
+000020007300B79A9102A0100400CDE4FC2609A7FFFF5B
+5E0DA170E92CB418F5D29FE18A337235920000F2FFFFFF
+020000000BFF0000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+000002000000200000000200730010D73301000B040072
+93641498EBFFFF608DEACA4EC0F3012DC3D281B5A780B6
+9F961B00000000000200000003007300B6EE0A01000B04
+0005489D0194B6FEFF77E9EBCAB51E19AA72096908A837
+B09B81B9F6FFF80200000200000004007300A1C02D0180
+F4030020A1DD1414EBFFFFA372EDCA5D4FFE011FABB481
+3579DBCD0A65FFFF350000000200000005007300F347E9
+00000B0400FA1CC614A4E1FFFF1D62EACA3BCF56814DEF
+9B7F7300BB61202E1500070A00000200000006007300C0
+26020180F4030040725D01ECC7FEFF1D36EBCA01B475C6
+B70F5F87D1A450CB090AE7FFD502000002000000090073
+008B08EF0080F403002260B41484DBFFFF89EDEBCA26FD
+8C8A4A88A5801E1F1D1EBF0E19000DFFFFFF0200000001
+FF00000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000020000
+0007FF0000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000002
+00000008FF000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+000200000009000000C10073005C16DD26A0100400F4EA
+D31D5DDBFFFF9334ECCA39418AA3F0299CC09C639B17EC
+DBF2FFC0FFFFFF02000000C2007300DB1AA426A0100400
+9729291EB3F4FFFFAEBDE9CA1B00A100F0E37ABFEAD5EB
+BADDFCFFFFFEFFFFFF02000000C30073007AB14826A010
+0400574C041D9BE3FFFF7A0FEFCA86B3FA45862B05C125
+D8BC71A2B5FFFFF6FFFFFF02000000C7007300E92E2000
+A010040035740400040A0000A81BECCAED5DF8CDC1001D
+B99E4DBCEABBFFFFFF0000000002000000C4FF00000000
+0000000000000000000000000000000000000000000000
+00000000000000000000000000000002000000C5FF0000
+0000000000000000F15C00007382000000000000000000
+0000000000000000000000000000000000000000000000
+0002000000C6FF00000000000000000000000000000000
+0000000000000000000000000000000000000000000000
+0000000200000007000000>
+
diff --git a/gnss/Android.mk b/gnss/Android.mk
new file mode 100644
index 00000000..12f46b76
--- /dev/null
+++ b/gnss/Android.mk
@@ -0,0 +1,40 @@
+# Copyright (C) 2010 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# We're moving the emulator-specific platform libs to
+# development.git/tools/emulator/. The following test is to ensure
+# smooth builds even if the tree contains both versions.
+#
+
+ifeq ($(BOARD_USES_EXYNOS_GNSS_DUMMY), true)
+
+LOCAL_PATH := $(call my-dir)
+
+# HAL module implemenation stored in
+# hw/<GPS_HARDWARE_MODULE_ID>.<ro.hardware>.so
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_RELATIVE_PATH := hw
+LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware
+LOCAL_SRC_FILES := gps_dummy.c
+LOCAL_MODULE := gps.$(TARGET_BOARD_PLATFORM)
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../NOTICE
+LOCAL_PROPRIETARY_MODULE := true
+
+include $(BUILD_SHARED_LIBRARY)
+
+endif
diff --git a/gnss/device-gnss.mk b/gnss/device-gnss.mk
new file mode 100644
index 00000000..ee3a394e
--- /dev/null
+++ b/gnss/device-gnss.mk
@@ -0,0 +1,49 @@
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.location.gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.location.gps.xml \
+ device/google/gs101/gnss/47765/config/gps.cer:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.cer \
+ device/google/gs101/gnss/47765/firmware/SensorHub.patch:$(TARGET_COPY_OUT_VENDOR)/firmware/SensorHub.patch
+
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+ PRODUCT_COPY_FILES += \
+ device/google/gs101/gnss/47765/config/lhd.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/lhd.conf \
+ device/google/gs101/gnss/47765/config/scd.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/scd.conf
+else
+ PRODUCT_COPY_FILES += \
+ device/google/gs101/gnss/47765/config/lhd_user.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/lhd.conf \
+ device/google/gs101/gnss/47765/config/scd_user.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/scd.conf
+endif
+
+ifneq (,$(filter raven, $(subst _, ,$(TARGET_PRODUCT))))
+ ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+ PRODUCT_COPY_FILES += device/google/gs101/gnss/47765/config/gps.xml.raven:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml
+ else
+ PRODUCT_COPY_FILES += device/google/gs101/gnss/47765/config/gps_user.xml.raven:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml
+ endif
+else ifneq (,$(filter oriole, $(subst _, ,$(TARGET_PRODUCT))))
+ ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+ PRODUCT_COPY_FILES += device/google/gs101/gnss/47765/config/gps.xml.oriole:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml
+ else
+ PRODUCT_COPY_FILES += device/google/gs101/gnss/47765/config/gps_user.xml.oriole:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml
+ endif
+else ifneq (,$(filter slider whitefin, $(subst _, ,$(TARGET_PRODUCT))))
+ ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+ PRODUCT_COPY_FILES += device/google/gs101/gnss/47765/config/gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml
+ else
+ PRODUCT_COPY_FILES += device/google/gs101/gnss/47765/config/gps_user.xml:$(TARGET_COPY_OUT_VENDOR)/etc/gnss/gps.xml
+ endif
+endif
+
+PRODUCT_SOONG_NAMESPACES += \
+ device/google/gs101/gnss/47765
+
+PRODUCT_PACKAGES += \
+ android.hardware.gnss@2.1-impl-google \
+ gps.default \
+ flp.default \
+ gpsd \
+ lhd \
+ scd \
+ android.hardware.gnss@2.1-service-brcm
+
+PRODUCT_PACKAGES_DEBUG += \
+ init.gps_log.rc
diff --git a/gnss/gps_dummy.c b/gnss/gps_dummy.c
new file mode 100644
index 00000000..9ccde1d3
--- /dev/null
+++ b/gnss/gps_dummy.c
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* this implements a GPS hardware library for the Android emulator.
+ * the following code should be built as a shared library that will be
+ * placed into /system/lib/hw/gps.goldfish.so
+ *
+ * it will be loaded by the code in hardware/libhardware/hardware.c
+ * which is itself called from android_location_GpsLocationProvider.cpp
+ */
+
+
+#include <errno.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <sys/epoll.h>
+#include <math.h>
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define LOG_TAG "gps_dummy"
+#include <log/log.h>
+//#include <cutils/sockets.h>
+#include <hardware/gps.h>
+
+#define GPS_DEBUG 0
+
+#if GPS_DEBUG
+# define D(...) ALOGD(__VA_ARGS__)
+#else
+# define D(...) ((void)0)
+#endif
+
+static int
+dummy_gps_init(GpsCallbacks* callbacks)
+{
+ return 0;
+}
+
+static void
+dummy_gps_cleanup(void)
+{
+}
+
+
+static int
+dummy_gps_start()
+{
+ return 0;
+}
+
+
+static int
+dummy_gps_stop()
+{
+ return 0;
+}
+
+
+static int
+dummy_gps_inject_time(GpsUtcTime __unused time,
+ int64_t __unused timeReference,
+ int __unused uncertainty)
+{
+ return 0;
+}
+
+static int
+dummy_gps_inject_location(double __unused latitude,
+ double __unused longitude,
+ float __unused accuracy)
+{
+ return 0;
+}
+
+static void
+dummy_gps_delete_aiding_data(GpsAidingData __unused flags)
+{
+}
+
+static int dummy_gps_set_position_mode(GpsPositionMode __unused mode,
+ GpsPositionRecurrence __unused recurrence,
+ uint32_t __unused min_interval,
+ uint32_t __unused preferred_accuracy,
+ uint32_t __unused preferred_time)
+{
+ // FIXME - support fix_frequency
+ return 0;
+}
+
+static const void*
+dummy_gps_get_extension(const char* __unused name)
+{
+ // no extensions supported
+ return NULL;
+}
+
+static const GpsInterface dummyGpsInterface = {
+ sizeof(GpsInterface),
+ dummy_gps_init,
+ dummy_gps_start,
+ dummy_gps_stop,
+ dummy_gps_cleanup,
+ dummy_gps_inject_time,
+ dummy_gps_inject_location,
+ dummy_gps_delete_aiding_data,
+ dummy_gps_set_position_mode,
+ dummy_gps_get_extension,
+};
+
+const GpsInterface* gps__get_gps_interface(struct gps_device_t* __unused dev)
+{
+ return &dummyGpsInterface;
+}
+
+static int open_gps(const struct hw_module_t* module,
+ char const* __unused name,
+ struct hw_device_t** device)
+{
+ struct gps_device_t *dev = (struct gps_device_t *)malloc(sizeof(struct gps_device_t));
+ memset(dev, 0, sizeof(*dev));
+
+ dev->common.tag = HARDWARE_DEVICE_TAG;
+ dev->common.version = 0;
+ dev->common.module = (struct hw_module_t*)module;
+ dev->get_gps_interface = gps__get_gps_interface;
+
+ *device = (struct hw_device_t*)dev;
+ return 0;
+}
+
+static struct hw_module_methods_t gps_module_methods = {
+ .open = open_gps
+};
+
+struct hw_module_t HAL_MODULE_INFO_SYM = {
+ .tag = HARDWARE_MODULE_TAG,
+ .version_major = 1,
+ .version_minor = 0,
+ .id = GPS_HARDWARE_MODULE_ID,
+ .name = "Dummy GPS Module",
+ .author = "The Android Open Source Project",
+ .methods = &gps_module_methods,
+};
diff --git a/health/Android.bp b/health/Android.bp
new file mode 100644
index 00000000..2bac61bc
--- /dev/null
+++ b/health/Android.bp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2018 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+cc_defaults {
+ name: "android.hardware.health-service.gs101-defaults",
+ defaults: [
+ "libhealth_aidl_impl_user",
+ "libhealth_aidl_charger_defaults",
+ ],
+ relative_install_path: "hw",
+ vintf_fragments: ["android.hardware.health-service.gs101.xml"],
+ srcs: [
+ "Health.cpp",
+ ],
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+ static_libs: [
+ "libhealth_aidl_impl",
+ ],
+}
+cc_binary {
+ name: "android.hardware.health-service.gs101",
+ defaults: ["android.hardware.health-service.gs101-defaults"],
+ proprietary: true,
+ init_rc: ["android.hardware.health-service.gs101.rc"],
+ overrides: ["charger"],
+ shared_libs: [
+ "libpixelhealth",
+ ],
+}
+cc_binary {
+ name: "android.hardware.health-service.gs101_recovery",
+ defaults: ["android.hardware.health-service.gs101-defaults"],
+ recovery: true,
+ init_rc: ["android.hardware.health-service.gs101_recovery.rc"],
+ overrides: ["charger.recovery"],
+}
diff --git a/health/Health.cpp b/health/Health.cpp
new file mode 100644
index 00000000..a81e731f
--- /dev/null
+++ b/health/Health.cpp
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+#define LOG_TAG "android.hardware.health@2.1-impl-gs101"
+#include <android-base/logging.h>
+
+#include <android-base/file.h>
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+#include <android/hardware/health/translate-ndk.h>
+#include <health-impl/Health.h>
+#include <health/utils.h>
+
+// Recovery doesn't have libpixelhealth and charger mode
+#ifndef __ANDROID_RECOVERY__
+#include <health-impl/ChargerUtils.h>
+#include <pixelhealth/BatteryDefender.h>
+#include <pixelhealth/BatteryMetricsLogger.h>
+#include <pixelhealth/ChargerDetect.h>
+#include <pixelhealth/DeviceHealth.h>
+#include <pixelhealth/LowBatteryShutdownMetrics.h>
+#endif // !__ANDROID_RECOVERY__
+
+#include <chrono>
+#include <fstream>
+#include <iomanip>
+#include <string>
+#include <vector>
+
+namespace {
+
+using namespace std::literals;
+
+using aidl::android::hardware::health::DiskStats;
+using aidl::android::hardware::health::HalHealthLoop;
+using aidl::android::hardware::health::HealthInfo;
+using aidl::android::hardware::health::StorageInfo;
+using android::hardware::health::InitHealthdConfig;
+
+#ifndef __ANDROID_RECOVERY__
+using aidl::android::hardware::health::charger::ChargerCallback;
+using aidl::android::hardware::health::charger::ChargerModeMain;
+using hardware::google::pixel::health::BatteryDefender;
+using hardware::google::pixel::health::BatteryMetricsLogger;
+using hardware::google::pixel::health::DeviceHealth;
+using hardware::google::pixel::health::LowBatteryShutdownMetrics;
+using hardware::google::pixel::health::ChargerDetect;
+
+#define FG_DIR "/sys/class/power_supply/battery"
+constexpr char kBatteryResistance[] {FG_DIR "/resistance"};
+constexpr char kBatteryOCV[] {FG_DIR "/voltage_ocv"};
+constexpr char kVoltageAvg[] {FG_DIR "/voltage_now"};
+
+#define WLC_DIR "/sys/class/power_supply/wireless"
+
+static BatteryDefender battDefender(WLC_DIR "/present",
+ "/sys/devices/platform/google,charger/charge_start_level",
+ "/sys/devices/platform/google,charger/charge_stop_level");
+static BatteryMetricsLogger battMetricsLogger(kBatteryResistance, kBatteryOCV);
+static LowBatteryShutdownMetrics shutdownMetrics(kVoltageAvg);
+static DeviceHealth deviceHealth;
+#endif // !__ANDROID_RECOVERY__
+
+#define UFS_DIR "/dev/sys/block/bootdevice"
+constexpr char kUfsHealthEol[]{UFS_DIR "/health_descriptor/eol_info"};
+constexpr char kUfsHealthLifetimeA[]{UFS_DIR "/health_descriptor/life_time_estimation_a"};
+constexpr char kUfsHealthLifetimeB[]{UFS_DIR "/health_descriptor/life_time_estimation_b"};
+constexpr char kUfsVersion[]{UFS_DIR "/device_descriptor/specification_version"};
+constexpr char kDiskStatsFile[]{"/sys/block/sda/stat"};
+
+static std::string ufs_version;
+static uint16_t eol;
+static uint16_t lifetimeA;
+static uint16_t lifetimeB;
+static std::chrono::system_clock::time_point ufs_last_query_time;
+constexpr auto kUfsQueryIntervalHours = std::chrono::hours{24};
+
+#ifndef __ANDROID_RECOVERY__
+static bool needs_wlc_updates = false;
+constexpr char kWlcCapacity[]{WLC_DIR "/capacity"};
+#endif // !__ANDROID_RECOVERY__
+
+std::ifstream assert_open(const std::string &path) {
+ std::ifstream stream(path);
+ if (!stream.is_open()) {
+ LOG(WARNING) << "Cannot read " << path;
+ }
+ return stream;
+}
+
+template <typename T>
+void read_value_from_file(const std::string &path, T *field) {
+ auto stream = assert_open(path);
+ stream.unsetf(std::ios_base::basefield);
+ stream >> *field;
+}
+
+void read_ufs_version(StorageInfo *info) {
+ if (ufs_version.empty()) {
+ uint64_t value;
+ read_value_from_file(kUfsVersion, &value);
+ std::stringstream ss;
+ ss << "ufs " << std::hex << value;
+ ufs_version = ss.str();
+ LOG(INFO) << "ufs: " << ufs_version << " detected";
+ }
+ info->version = ufs_version;
+}
+
+#ifdef __ANDROID_RECOVERY__
+void private_healthd_board_init(struct healthd_config *) {}
+int private_healthd_board_battery_update(HealthInfo *) { return 0; }
+#else // !__ANDROID__RECOVERY__
+static bool FileExists(const std::string &filename) {
+ struct stat buffer;
+
+ return stat(filename.c_str(), &buffer) == 0;
+}
+
+void private_healthd_board_init(struct healthd_config *hc) {
+ std::string tcpmPsyName;
+ ChargerDetect::populateTcpmPsyName(&tcpmPsyName);
+ hc->ignorePowerSupplyNames.push_back(android::String8(tcpmPsyName.c_str()));
+ needs_wlc_updates = FileExists(kWlcCapacity);
+ if (needs_wlc_updates == false) {
+ battDefender.setWirelessNotSupported();
+ }
+}
+
+int private_healthd_board_battery_update(HealthInfo *health_info) {
+ deviceHealth.update(health_info);
+ battMetricsLogger.logBatteryProperties(*health_info);
+ shutdownMetrics.logShutdownVoltage(*health_info);
+ // Allow BatteryDefender to override online properties
+ ChargerDetect::onlineUpdate(health_info);
+ battDefender.update(health_info);
+
+ if (needs_wlc_updates &&
+ !android::base::WriteStringToFile(std::to_string(health_info->batteryLevel), kWlcCapacity))
+ LOG(INFO) << "Unable to write battery level to wireless capacity";
+
+ return 0;
+}
+#endif // __ANDROID_RECOVERY__
+
+void private_get_storage_info(std::vector<StorageInfo> *vec_storage_info) {
+ vec_storage_info->resize(1);
+ StorageInfo *storage_info = &vec_storage_info->at(0);
+
+ read_ufs_version(storage_info);
+
+ auto time_now = std::chrono::system_clock::now();
+ auto time_delta = time_now - ufs_last_query_time;
+ auto hoursElapsed = std::chrono::duration_cast<std::chrono::hours>(time_delta);
+ if (hoursElapsed >= kUfsQueryIntervalHours) {
+ ufs_last_query_time = time_now;
+ read_value_from_file(kUfsHealthEol, &eol);
+ read_value_from_file(kUfsHealthLifetimeA, &lifetimeA);
+ read_value_from_file(kUfsHealthLifetimeB, &lifetimeB);
+ LOG(INFO) << "ufs: eol=" << eol << " lifetimeA=" << lifetimeA << " lifetimeB=" << lifetimeB;
+ }
+ storage_info->eol = eol;
+ storage_info->lifetimeA = lifetimeA;
+ storage_info->lifetimeB = lifetimeB;
+
+ return;
+}
+
+void private_get_disk_stats(std::vector<DiskStats> *vec_stats) {
+ vec_stats->resize(1);
+ DiskStats *stats = &vec_stats->at(0);
+
+ auto stream = assert_open(kDiskStatsFile);
+ // Regular diskstats entries
+ stream >> stats->reads >> stats->readMerges >> stats->readSectors >>
+ stats->readTicks >> stats->writes >> stats->writeMerges >>
+ stats->writeSectors >> stats->writeTicks >> stats->ioInFlight >>
+ stats->ioTicks >> stats->ioInQueue;
+ return;
+}
+} // anonymous namespace
+
+namespace aidl::android::hardware::health::implementation {
+class HealthImpl : public Health {
+ public:
+ HealthImpl(std::string_view instance_name, std::unique_ptr<healthd_config>&& config)
+ : Health(std::move(instance_name), std::move(config)) {}
+
+ ndk::ScopedAStatus getDiskStats(std::vector<DiskStats>* out) override;
+ ndk::ScopedAStatus getStorageInfo(std::vector<StorageInfo>* out) override;
+
+ protected:
+ void UpdateHealthInfo(HealthInfo* health_info) override;
+
+};
+
+void HealthImpl::UpdateHealthInfo(HealthInfo* health_info) {
+ private_healthd_board_battery_update(health_info);
+}
+
+ndk::ScopedAStatus HealthImpl::getStorageInfo(std::vector<StorageInfo>* out)
+{
+ private_get_storage_info(out);
+ if (out->empty()) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ }
+ return ndk::ScopedAStatus::ok();
+}
+
+ndk::ScopedAStatus HealthImpl::getDiskStats(std::vector<DiskStats>* out)
+{
+ private_get_disk_stats(out);
+ if (out->empty()) {
+ return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+ }
+ return ndk::ScopedAStatus::ok();
+}
+
+} // namespace aidl::android::hardware::health::implementation
+
+int main(int argc, char **argv) {
+ using ::aidl::android::hardware::health::implementation::HealthImpl;
+
+ // Use kernel logging in recovery
+#ifdef __ANDROID_RECOVERY__
+ android::base::InitLogging(argv, android::base::KernelLogger);
+#endif
+
+ auto config = std::make_unique<healthd_config>();
+ InitHealthdConfig(config.get());
+
+ private_healthd_board_init(config.get());
+
+ auto binder =
+ ndk::SharedRefBase::make<HealthImpl>("default"sv, std::move(config));
+
+ if (argc >= 2 && argv[1] == "--charger"sv) {
+ // In regular mode, start charger UI.
+#ifndef __ANDROID_RECOVERY__
+ LOG(INFO) << "Starting charger mode with UI.";
+ return ChargerModeMain(binder, std::make_shared<ChargerCallback>(binder));
+#endif
+ // In recovery, ignore --charger arg.
+ LOG(INFO) << "Starting charger mode without UI.";
+ } else {
+ LOG(INFO) << "Starting health HAL.";
+ }
+
+ auto hal_health_loop = std::make_shared<HalHealthLoop>(binder, binder);
+ return hal_health_loop->StartLoop();
+}
diff --git a/health/android.hardware.health-service.gs101.rc b/health/android.hardware.health-service.gs101.rc
new file mode 100644
index 00000000..0c313626
--- /dev/null
+++ b/health/android.hardware.health-service.gs101.rc
@@ -0,0 +1,16 @@
+service vendor.health-gs101 /vendor/bin/hw/android.hardware.health-service.gs101
+ class hal
+ user system
+ group system
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+ file /dev/kmsg w
+service vendor.charger /vendor/bin/hw/android.hardware.health-service.gs101 --charger
+ class charger
+ seclabel u:r:charger_vendor:s0
+ user system
+ group system wakelock input
+ capabilities SYS_BOOT
+ file /dev/kmsg w
+ file /sys/fs/pstore/console-ramoops-0 r
+ file /sys/fs/pstore/console-ramoops r
+ file /proc/last_kmsg r
diff --git a/health/android.hardware.health-service.gs101.xml b/health/android.hardware.health-service.gs101.xml
new file mode 100644
index 00000000..98026cbd
--- /dev/null
+++ b/health/android.hardware.health-service.gs101.xml
@@ -0,0 +1,7 @@
+<manifest version="1.0" type="device">
+ <hal format="aidl">
+ <name>android.hardware.health</name>
+ <version>1</version>
+ <fqname>IHealth/default</fqname>
+ </hal>
+</manifest>
diff --git a/health/android.hardware.health-service.gs101_recovery.rc b/health/android.hardware.health-service.gs101_recovery.rc
new file mode 100644
index 00000000..d1e35042
--- /dev/null
+++ b/health/android.hardware.health-service.gs101_recovery.rc
@@ -0,0 +1,7 @@
+service vendor.health-gs101 /system/bin/hw/android.hardware.health-service.gs101_recovery
+ class hal
+ seclabel u:r:hal_health_default:s0
+ user system
+ group system
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+ file /dev/kmsg w
diff --git a/init.hardware.wlc.rc.userdebug b/init.hardware.wlc.rc.userdebug
new file mode 100644
index 00000000..dee7b6bc
--- /dev/null
+++ b/init.hardware.wlc.rc.userdebug
@@ -0,0 +1,24 @@
+#
+# Copyright (C) 2018 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.
+#
+
+on property:sys.boot_completed=1 && property:persist.vendor.limit.wlc.current=1
+ write /sys/class/power_supply/dc/current_max 75000
+
+on property:sys.boot_completed=1 && property:persist.vendor.limit.wlc.current=0
+ write /sys/class/power_supply/dc/current_max 1100000
+
+on property:vendor.disable.wlc=1
+ write /sys/class/power_supply/wireless/online 0
diff --git a/init.insmod.gs101.cfg b/init.insmod.gs101.cfg
new file mode 100644
index 00000000..1eb29b9a
--- /dev/null
+++ b/init.insmod.gs101.cfg
@@ -0,0 +1,12 @@
+####################################################
+# init.insmod.common.cfg #
+# This file contains common kernel modules to load #
+# at init time by init.insmod.sh script #
+####################################################
+
+# Load common kernel modules
+# Modules here will be loaded *before* device specific modules
+install_display_drivers
+modprobe|-b *
+# All common modules loaded
+setprop|vendor.common.modules.ready
diff --git a/init.insmod.sh b/init.insmod.sh
new file mode 100755
index 00000000..645391af
--- /dev/null
+++ b/init.insmod.sh
@@ -0,0 +1,78 @@
+#!/vendor/bin/sh
+
+#############################################################
+### init.insmod.cfg format: ###
+### ----------------------------------------------------- ###
+### [insmod|setprop|enable/moprobe|wait] [path|prop name] ###
+### ... ###
+#############################################################
+
+modules_dir=
+
+for f in /vendor/lib/modules/*/modules.dep /vendor/lib/modules/modules.dep; do
+ if [[ -f "$f" ]]; then
+ modules_dir="$(dirname "$f")"
+ break
+ fi
+done
+
+if [[ -z "${modules_dir}" ]]; then
+ echo "Unable to locate kernel modules directory" 2>&1
+ exit 1
+fi
+
+# imitates wait_for_file() in init
+wait_for_file()
+{
+ filename="${1}"
+ timeout="${2:-5}"
+
+ expiry=$(($(date "+%s")+timeout))
+ while [[ ! -e "${filename}" ]] && [[ "$(date "+%s")" -le "${expiry}" ]]
+ do
+ sleep 0.01
+ done
+}
+
+install_display_drivers()
+{
+ panel_drv=`getprop ro.boot.primary_panel_drv`
+ if [[ -z "$panel_drv" ]]; then
+ panel_drv="panel-samsung-emul"
+ fi
+ modprobe -d "${modules_dir}" exynos-drm.ko
+ modprobe -d "${modules_dir}" $panel_drv.ko
+}
+
+if [ $# -eq 1 ]; then
+ cfg_file=$1
+else
+ # Set property even if there is no insmod config
+ # to unblock early-boot trigger
+ setprop vendor.common.modules.ready
+ setprop vendor.device.modules.ready
+ setprop vendor.all.modules.ready
+ setprop vendor.all.devices.ready
+ exit 1
+fi
+
+if [ -f $cfg_file ]; then
+ while IFS="|" read -r action arg
+ do
+ case $action in
+ "insmod") insmod $arg ;;
+ "setprop") setprop $arg 1 ;;
+ "enable") echo 1 > $arg ;;
+ "modprobe")
+ case ${arg} in
+ "-b *" | "-b")
+ arg="-b --all=${modules_dir}/modules.load" ;;
+ "*" | "")
+ arg="--all=${modules_dir}/modules.load" ;;
+ esac
+ modprobe -a -d "${modules_dir}" $arg ;;
+ "wait") wait_for_file $arg ;;
+ "install_display_drivers") install_display_drivers ;;
+ esac
+ done < $cfg_file
+fi
diff --git a/interfaces/boot/1.0/Android.bp b/interfaces/boot/1.0/Android.bp
new file mode 100644
index 00000000..179a6f95
--- /dev/null
+++ b/interfaces/boot/1.0/Android.bp
@@ -0,0 +1,66 @@
+//
+// Copyright (C) 2019 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+cc_binary {
+ name: "android.hardware.boot@1.0-service-gs101",
+ defaults: ["hidl_defaults"],
+ relative_install_path: "hw",
+ vendor: true,
+ init_rc: ["android.hardware.boot@1.0-service-gs101.rc"],
+ srcs: [
+ "BootControl.cpp",
+ "GptUtils.cpp",
+ "service.cpp"
+ ],
+ shared_libs: [
+ "libbase",
+ "liblog",
+ "libhidlbase",
+ "libutils",
+ "libcutils",
+ "libz",
+ "android.hardware.boot@1.0",
+ ],
+}
+
+cc_library {
+ name: "android.hardware.boot@1.0-impl-gs101",
+ recovery: true,
+ srcs: [
+ "BootControl.cpp",
+ "GptUtils.cpp",
+ ],
+ relative_install_path: "hw",
+ shared_libs: [
+ "libbase",
+ "liblog",
+ "libhidlbase",
+ "libutils",
+ "libcutils",
+ "libz",
+ "android.hardware.boot@1.0",
+ ],
+}
diff --git a/interfaces/boot/1.0/BootControl.cpp b/interfaces/boot/1.0/BootControl.cpp
new file mode 100644
index 00000000..1f155c9d
--- /dev/null
+++ b/interfaces/boot/1.0/BootControl.cpp
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#define LOG_TAG "bootcontrolhal"
+
+#include "BootControl.h"
+#include "GptUtils.h"
+
+#include <android-base/file.h>
+#include <cutils/properties.h>
+#include <log/log.h>
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_0 {
+namespace implementation {
+
+namespace {
+
+#define BOOT_A_PATH "/dev/block/by-name/boot_a"
+#define BOOT_B_PATH "/dev/block/by-name/boot_b"
+
+// slot flags
+#define AB_ATTR_PRIORITY_SHIFT 52
+#define AB_ATTR_PRIORITY_MASK (3UL << AB_ATTR_PRIORITY_SHIFT)
+#define AB_ATTR_ACTIVE_SHIFT 54
+#define AB_ATTR_ACTIVE (1UL << AB_ATTR_ACTIVE_SHIFT)
+#define AB_ATTR_RETRY_COUNT_SHIFT (55)
+#define AB_ATTR_RETRY_COUNT_MASK (7UL << AB_ATTR_RETRY_COUNT_SHIFT)
+#define AB_ATTR_SUCCESSFUL (1UL << 58)
+#define AB_ATTR_UNBOOTABLE (1UL << 59)
+
+#define AB_ATTR_MAX_PRIORITY 3UL
+#define AB_ATTR_MAX_RETRY_COUNT 3UL
+
+static std::string getDevPath(uint32_t slot) {
+ char real_path[PATH_MAX];
+
+ const char *path = slot == 0 ? BOOT_A_PATH : BOOT_B_PATH;
+
+ int ret = readlink(path, real_path, sizeof real_path);
+ if (ret < 0) {
+ ALOGE("readlink failed for boot device %s\n", strerror(errno));
+ return std::string();
+ }
+
+ std::string dp(real_path);
+ // extract /dev/sda.. part
+ return dp.substr(0, sizeof "/dev/block/sdX" - 1);
+}
+
+static bool isSlotFlagSet(uint32_t slot, uint64_t flag) {
+ std::string dev_path = getDevPath(slot);
+ if (dev_path.empty()) {
+ ALOGI("Could not get device path for slot %d\n", slot);
+ return false;
+ }
+
+ GptUtils gpt(dev_path);
+ if (gpt.Load()) {
+ ALOGI("failed to load gpt data\n");
+ return false;
+ }
+
+ gpt_entry *e = gpt.GetPartitionEntry(slot ? "boot_b" : "boot_a");
+ if (e == nullptr) {
+ ALOGI("failed to get gpt entry\n");
+ return false;
+ }
+
+ return !!(e->attr & flag);
+}
+
+static int setSlotFlag(uint32_t slot, uint64_t flag) {
+ std::string dev_path = getDevPath(slot);
+ if (dev_path.empty()) {
+ ALOGI("Could not get device path for slot %d\n", slot);
+ return -1;
+ }
+
+ GptUtils gpt(dev_path);
+ if (gpt.Load()) {
+ ALOGI("failed to load gpt data\n");
+ return -1;
+ }
+
+ gpt_entry *e = gpt.GetPartitionEntry(slot ? "boot_b" : "boot_a");
+ if (e == nullptr) {
+ ALOGI("failed to get gpt entry\n");
+ return -1;
+ }
+
+ e->attr |= flag;
+ gpt.Sync();
+
+ return 0;
+}
+
+}
+
+// Methods from ::android::hardware::boot::V1_0::IBootControl follow.
+Return<uint32_t> BootControl::getNumberSlots() {
+ uint32_t slots = 0;
+
+ if (access(BOOT_A_PATH, F_OK) == 0)
+ slots++;
+
+ if (access(BOOT_B_PATH, F_OK) == 0)
+ slots++;
+
+ return slots;
+}
+
+Return<uint32_t> BootControl::getCurrentSlot() {
+ char suffix[PROPERTY_VALUE_MAX];
+ property_get("ro.boot.slot_suffix", suffix, "_a");
+ return std::string(suffix) == "_b" ? 1 : 0;
+}
+
+Return<void> BootControl::markBootSuccessful(markBootSuccessful_cb _hidl_cb) {
+ if (getNumberSlots() == 0) {
+ // no slots, just return true otherwise Android keeps trying
+ _hidl_cb({true, ""});
+ return Void();
+ }
+ int ret = setSlotFlag(getCurrentSlot(), AB_ATTR_SUCCESSFUL);
+ ret ? _hidl_cb({false, "Failed to set successfull flag"}) : _hidl_cb({true, ""});
+ return Void();
+}
+
+Return<void> BootControl::setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) {
+ if (slot >= 2) {
+ _hidl_cb({false, "Invalid slot"});
+ return Void();
+ }
+
+ std::string dev_path = getDevPath(slot);
+ if (dev_path.empty()) {
+ _hidl_cb({false, "Could not get device path for slot"});
+ return Void();
+ }
+
+ GptUtils gpt(dev_path);
+ if (gpt.Load()) {
+ _hidl_cb({false, "failed to load gpt data"});
+ return Void();
+ }
+
+ gpt_entry *active_entry = gpt.GetPartitionEntry(slot == 0 ? "boot_a" : "boot_b");
+ gpt_entry *inactive_entry = gpt.GetPartitionEntry(slot == 0 ? "boot_b" : "boot_a");
+ if (active_entry == nullptr || inactive_entry == nullptr) {
+ _hidl_cb({false, "failed to get entries for boot partitions"});
+ return Void();
+ }
+
+ ALOGV("slot active attributes %lx\n", active_entry->attr);
+ ALOGV("slot inactive attributes %lx\n", inactive_entry->attr);
+
+ char boot_dev[PROPERTY_VALUE_MAX];
+ property_get("ro.boot.bootdevice", boot_dev, "");
+ if (boot_dev[0] == '\0') {
+ _hidl_cb({false, "invalid ro.boot.bootdevice prop"});
+ return Void();
+ }
+
+ std::string boot_lun_path = std::string("/sys/devices/platform/") +
+ boot_dev + "/pixel/boot_lun_enabled";
+ int fd = open(boot_lun_path.c_str(), O_RDWR);
+ if (fd < 0) {
+ // Try old path for kernels < 5.4
+ // TODO: remove once kernel 4.19 support is deprecated
+ std::string boot_lun_path = std::string("/sys/devices/platform/") +
+ boot_dev + "/attributes/boot_lun_enabled";
+ fd = open(boot_lun_path.c_str(), O_RDWR);
+ if (fd < 0) {
+ _hidl_cb({false, "failed to open ufs attr boot_lun_enabled"});
+ return Void();
+ }
+ }
+
+ // update attributes for active and inactive
+ inactive_entry->attr &= ~AB_ATTR_ACTIVE;
+ active_entry->attr = AB_ATTR_ACTIVE | (AB_ATTR_MAX_PRIORITY << AB_ATTR_PRIORITY_SHIFT) |
+ (AB_ATTR_MAX_RETRY_COUNT << AB_ATTR_RETRY_COUNT_SHIFT);
+
+ //
+ // bBootLunEn
+ // 0x1 => Boot LU A = enabled, Boot LU B = disable
+ // 0x2 => Boot LU A = disable, Boot LU B = enabled
+ //
+ int ret = android::base::WriteStringToFd(slot == 0 ? "1" : "2", fd);
+ close(fd);
+ if (ret < 0) {
+ _hidl_cb({false, "faied to write boot_lun_enabled attribute"});
+ return Void();
+ }
+
+ _hidl_cb({true, ""});
+ return Void();
+}
+
+Return<void> BootControl::setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) {
+ if (slot >= 2) {
+ _hidl_cb({false, "Invalid slot"});
+ return Void();
+ }
+
+ std::string dev_path = getDevPath(slot);
+ if (dev_path.empty()) {
+ _hidl_cb({false, "Could not get device path for slot"});
+ return Void();
+ }
+
+ GptUtils gpt(dev_path);
+ gpt.Load();
+
+ gpt_entry *e = gpt.GetPartitionEntry(slot ? "boot_b" : "boot_a");
+ e->attr |= AB_ATTR_UNBOOTABLE;
+
+ gpt.Sync();
+
+ _hidl_cb({true, ""});
+ return Void();
+}
+
+Return<::android::hardware::boot::V1_0::BoolResult> BootControl::isSlotBootable(uint32_t slot) {
+ if (getNumberSlots() == 0)
+ return BoolResult::FALSE;
+ if (slot >= getNumberSlots())
+ return BoolResult::INVALID_SLOT;
+ return isSlotFlagSet(slot, AB_ATTR_UNBOOTABLE) ? BoolResult::FALSE : BoolResult::TRUE;
+}
+
+Return<::android::hardware::boot::V1_0::BoolResult> BootControl::isSlotMarkedSuccessful(uint32_t slot) {
+ if (getNumberSlots() == 0) {
+ // just return true so that we don't we another call trying to mark it as successful
+ // when there is no slots
+ return BoolResult::TRUE;
+ }
+ if (slot >= getNumberSlots())
+ return BoolResult::INVALID_SLOT;
+ return isSlotFlagSet(slot, AB_ATTR_SUCCESSFUL) ? BoolResult::TRUE : BoolResult::FALSE;
+}
+
+Return<void> BootControl::getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) {
+ _hidl_cb(slot == 0 ? "_a" : slot == 1 ? "_b" : "");
+ return Void();
+}
+
+extern "C" IBootControl* HIDL_FETCH_IBootControl(const char*) {
+ return new BootControl();
+}
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.0/BootControl.h b/interfaces/boot/1.0/BootControl.h
new file mode 100644
index 00000000..eb81cb07
--- /dev/null
+++ b/interfaces/boot/1.0/BootControl.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <android/hardware/boot/1.0/IBootControl.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+struct BootControl : public IBootControl {
+ // Methods from ::android::hardware::boot::V1_0::IBootControl follow.
+ Return<uint32_t> getNumberSlots() override;
+ Return<uint32_t> getCurrentSlot() override;
+ Return<void> markBootSuccessful(markBootSuccessful_cb _hidl_cb) override;
+ Return<void> setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) override;
+ Return<void> setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) override;
+ Return<::android::hardware::boot::V1_0::BoolResult> isSlotBootable(uint32_t slot) override;
+ Return<::android::hardware::boot::V1_0::BoolResult> isSlotMarkedSuccessful(uint32_t slot) override;
+ Return<void> getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) override;
+
+ // Methods from ::android::hidl::base::V1_0::IBase follow.
+
+};
+
+// FIXME: most likely delete, this is only for passthrough implementations
+extern "C" IBootControl* HIDL_FETCH_IBootControl(const char* name);
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.0/GptUtils.cpp b/interfaces/boot/1.0/GptUtils.cpp
new file mode 100644
index 00000000..f8936175
--- /dev/null
+++ b/interfaces/boot/1.0/GptUtils.cpp
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#define LOG_TAG "bootcontrolhal"
+
+#include "GptUtils.h"
+
+#include <errno.h>
+#include <log/log.h>
+#include <android-base/file.h>
+#include <linux/fs.h>
+#include <zlib.h>
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_0 {
+namespace implementation {
+
+namespace {
+
+static int ValidateGptHeader(gpt_header *gpt)
+{
+ if (gpt->signature != GPT_SIGNATURE) {
+ ALOGE("invalid gpt signature 0x%lx\n", gpt->signature);
+ return -1;
+ }
+
+ if (gpt->header_size != sizeof(gpt_header)) {
+ ALOGE("invalid gpt header size %u\n", gpt->header_size);
+ return -1;
+ }
+
+ if (gpt->entry_size != sizeof(gpt_entry)) {
+ ALOGE("invalid gpt entry size %u\n", gpt->entry_size);
+ return -1;
+ }
+
+ return 0;
+}
+
+}
+
+GptUtils::GptUtils(const std::string dev_path) : dev_path(dev_path), fd(0) {}
+
+int GptUtils::Load(void)
+{
+ fd = open(dev_path.c_str(), O_RDWR);
+ if (fd < 0) {
+ ALOGE("failed to open block dev %s, %d\n", dev_path.c_str(), errno);
+ return -1;
+ }
+
+ int ret = ioctl(fd, BLKSSZGET, &block_size);
+ if (ret < 0) {
+ ALOGE("failed to get block size %d\n", errno);
+ return -1;
+ }
+
+ // read primary header
+ lseek64(fd, block_size, SEEK_SET);
+ ret = read(fd, &gpt_primary, sizeof gpt_primary);
+ if (ret < 0) {
+ ALOGE("failed to read gpt primary header %d\n", errno);
+ return -1;
+ }
+
+ if (ValidateGptHeader(&gpt_primary)) {
+ ALOGE("error validating gpt header\n");
+ return -1;
+ }
+
+ // read partition entries
+ entry_array.resize(gpt_primary.entry_count);
+ uint32_t entries_size = gpt_primary.entry_size * gpt_primary.entry_count;
+ lseek64(fd, block_size * gpt_primary.start_lba, SEEK_SET);
+ ret = read(fd, entry_array.data(), entries_size);
+ if (ret < 0) {
+ ALOGE("failed to read gpt partition entries %d\n", errno);
+ return -1;
+ }
+
+ // read gpt back header
+ lseek64(fd, block_size * gpt_primary.backup_lba, SEEK_SET);
+ ret = read(fd, &gpt_backup, sizeof gpt_backup);
+ if (ret < 0) {
+ ALOGE("failed to read gpt backup header %d\n", errno);
+ return -1;
+ }
+
+ if (ValidateGptHeader(&gpt_backup)) {
+ ALOGW("error validating gpt backup\n"); // just warn about it, not fail
+ }
+
+ // Create map <partition name, gpt_entry pointer>
+ auto get_name = [](const uint16_t *efi_name) {
+ char name[37] = {};
+ for (int i = 0; efi_name[i] && i < sizeof name - 1; ++i)
+ name[i] = efi_name[i];
+ return std::string(name);
+ };
+
+ for (auto const &e: entry_array) {
+ if (e.name[0] == 0)
+ break; // stop at the first partition with no name
+ std::string s = get_name(e.name);
+ entries[s] = const_cast<gpt_entry *>(&e);
+ }
+
+ return 0;
+}
+
+gpt_entry *GptUtils::GetPartitionEntry(std::string name)
+{
+ return entries.find(name) != entries.end() ? entries[name] : nullptr;
+}
+
+int GptUtils::Sync(void)
+{
+ if (!fd)
+ return -1;
+
+ // calculate crc and check if we need to update gpt
+ gpt_primary.entries_crc32 = crc32(0, reinterpret_cast<uint8_t *>(entry_array.data()),
+ entry_array.size() * sizeof(gpt_entry));
+
+ // save old crc
+ uint32_t crc = gpt_primary.crc32;
+ gpt_primary.crc32 = 0;
+
+ gpt_primary.crc32 = crc32(0, reinterpret_cast<uint8_t *>(&gpt_primary), sizeof gpt_primary);
+ if (crc == gpt_primary.crc32)
+ return 0; // nothing to do (no changes)
+
+ ALOGI("updating GPT\n");
+
+ lseek64(fd, block_size * gpt_primary.current_lba, SEEK_SET);
+ int ret = write(fd, &gpt_primary, sizeof gpt_primary);
+ if (ret < 0) {
+ ALOGE("failed to write gpt primary header %d\n", errno);
+ return -1;
+ }
+
+ lseek64(fd, block_size * gpt_primary.start_lba, SEEK_SET);
+ ret = write(fd, entry_array.data(), entry_array.size() * sizeof(gpt_entry));
+ if (ret < 0) {
+ ALOGE("failed to write gpt partition entries %d\n", errno);
+ return -1;
+ }
+
+ //update GPT backup entries and backup
+ lseek64(fd, block_size * gpt_backup.start_lba, SEEK_SET);
+ ret = write(fd, entry_array.data(), entry_array.size() * sizeof(gpt_entry));
+ if (ret < 0) {
+ ALOGE("failed to write gpt backup partition entries %d\n", errno);
+ return -1;
+ }
+
+ gpt_backup.entries_crc32 = gpt_primary.entries_crc32;
+ gpt_backup.crc32 = 0;
+ gpt_backup.crc32 = crc32(0, reinterpret_cast<uint8_t *>(&gpt_backup), sizeof gpt_backup);
+ lseek64(fd, block_size * gpt_primary.backup_lba, SEEK_SET);
+ ret = write(fd, &gpt_backup, sizeof gpt_backup);
+ if (ret < 0) {
+ ALOGE("failed to write gpt backup header %d\n", errno);
+ return -1;
+ }
+
+ fsync(fd);
+
+ return 0;
+}
+
+GptUtils::~GptUtils()
+{
+ if (fd) {
+ Sync();
+ close(fd);
+ }
+}
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.0/GptUtils.h b/interfaces/boot/1.0/GptUtils.h
new file mode 100644
index 00000000..d969d9d8
--- /dev/null
+++ b/interfaces/boot/1.0/GptUtils.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <string>
+#include <vector>
+#include <map>
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_0 {
+namespace implementation {
+
+#define GPT_SIGNATURE 0x5452415020494645UL
+
+typedef struct {
+ uint8_t type_guid[16];
+ uint8_t guid[16];
+ uint64_t first_lba;
+ uint64_t last_lba;
+ uint64_t attr;
+ uint16_t name[36];
+} __attribute__((packed)) gpt_entry;
+
+typedef struct {
+ uint64_t signature;
+ uint32_t revision;
+ uint32_t header_size;
+ uint32_t crc32;
+ uint32_t reserved;
+ uint64_t current_lba;
+ uint64_t backup_lba;
+ uint64_t first_usable_lba;
+ uint64_t last_usable_lba;
+ uint8_t disk_guid[16];
+ uint64_t start_lba;
+ uint32_t entry_count;
+ uint32_t entry_size;
+ uint32_t entries_crc32;
+} __attribute__((packed)) gpt_header;
+
+class GptUtils {
+ public:
+ GptUtils(const std::string dev_path);
+ int Load(void);
+ gpt_entry *GetPartitionEntry(std::string name);
+ int Sync(void);
+ ~GptUtils();
+
+ private:
+ std::string dev_path;
+ int fd;
+ uint32_t block_size;
+ gpt_header gpt_primary;
+ gpt_header gpt_backup;
+ std::vector<gpt_entry> entry_array;
+ std::map<std::string, gpt_entry *>entries;
+};
+
+} // namespace implementation
+} // namespace V1_0
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.0/android.hardware.boot@1.0-service-gs101.rc b/interfaces/boot/1.0/android.hardware.boot@1.0-service-gs101.rc
new file mode 100644
index 00000000..24a4b451
--- /dev/null
+++ b/interfaces/boot/1.0/android.hardware.boot@1.0-service-gs101.rc
@@ -0,0 +1,4 @@
+service vendor.boot-hal-1-0 /vendor/bin/hw/android.hardware.boot@1.0-service-gs101
+ class early_hal
+ user root
+ group root
diff --git a/interfaces/boot/1.0/service.cpp b/interfaces/boot/1.0/service.cpp
new file mode 100644
index 00000000..9dcd78cc
--- /dev/null
+++ b/interfaces/boot/1.0/service.cpp
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ */
+#define LOG_TAG "android.hardware.boot@1.0-service"
+
+#include <log/log.h>
+#include <hidl/HidlTransportSupport.h>
+#include <hidl/Status.h>
+#include <android/hardware/boot/1.0/IBootControl.h>
+#include "BootControl.h"
+
+using ::android::status_t;
+
+using ::android::hardware::boot::V1_0::IBootControl;
+
+using ::android::hardware::boot::V1_0::implementation::BootControl;
+
+int main (int /* argc */, char * /* argv */ []) {
+ // This function must be called before you join to ensure the proper
+ // number of threads are created. The threadpool will never exceed
+ // size one because of this call.
+ ::android::hardware::configureRpcThreadpool(1 /*threads*/, true /*willJoin*/);
+
+ ::android::sp bootctrl = new BootControl();
+ const status_t status = bootctrl->registerAsService();
+ if (status != ::android::OK) {
+ return 1; // or handle error
+ }
+
+ // Adds this thread to the threadpool, resulting in one total
+ // thread in the threadpool. We could also do other things, but
+ // would have to specify 'false' to willJoin in configureRpcThreadpool.
+ ::android::hardware::joinRpcThreadpool();
+ return 1; // joinRpcThreadpool should never return
+}
diff --git a/interfaces/boot/1.2/Android.bp b/interfaces/boot/1.2/Android.bp
new file mode 100644
index 00000000..982a543a
--- /dev/null
+++ b/interfaces/boot/1.2/Android.bp
@@ -0,0 +1,81 @@
+//
+// Copyright (C) 2020 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+cc_binary {
+ name: "android.hardware.boot@1.2-service-gs101",
+ defaults: ["hidl_defaults"],
+ relative_install_path: "hw",
+ vendor: true,
+ init_rc: ["android.hardware.boot@1.2-service-gs101.rc"],
+ srcs: [
+ "BootControl.cpp",
+ "GptUtils.cpp",
+ "service.cpp"
+ ],
+ shared_libs: [
+ "libbase",
+ "liblog",
+ "libhidlbase",
+ "libutils",
+ "libcutils",
+ "libz",
+ "android.hardware.boot@1.0",
+ "android.hardware.boot@1.1",
+ "android.hardware.boot@1.2",
+ ],
+ static_libs: [
+ "libboot_control",
+ "libbootloader_message_vendor",
+ "libfstab",
+ ],
+}
+
+cc_library {
+ name: "android.hardware.boot@1.2-impl-gs101",
+ stem: "android.hardware.boot@1.0-impl-1.2-impl-gs101",
+ recovery: true,
+ srcs: [
+ "BootControl.cpp",
+ "GptUtils.cpp",
+ ],
+ relative_install_path: "hw",
+ shared_libs: [
+ "libbase",
+ "liblog",
+ "libhidlbase",
+ "libutils",
+ "libcutils",
+ "libz",
+ "android.hardware.boot@1.0",
+ "android.hardware.boot@1.1",
+ "android.hardware.boot@1.2",
+ ],
+ static_libs: [
+ "libboot_control",
+ "libbootloader_message_vendor",
+ "libfstab",
+ ],
+}
diff --git a/interfaces/boot/1.2/BootControl.cpp b/interfaces/boot/1.2/BootControl.cpp
new file mode 100644
index 00000000..6c480bb6
--- /dev/null
+++ b/interfaces/boot/1.2/BootControl.cpp
@@ -0,0 +1,437 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+#define LOG_TAG "bootcontrolhal"
+
+#include "BootControl.h"
+
+#include <android-base/file.h>
+#include <android-base/unique_fd.h>
+#include <bootloader_message/bootloader_message.h>
+#include <cutils/properties.h>
+#include <libboot_control/libboot_control.h>
+#include <log/log.h>
+
+#include "DevInfo.h"
+#include "GptUtils.h"
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_2 {
+namespace implementation {
+
+using android::bootable::GetMiscVirtualAbMergeStatus;
+using android::bootable::InitMiscVirtualAbMessageIfNeeded;
+using android::bootable::SetMiscVirtualAbMergeStatus;
+using android::hardware::boot::V1_0::BoolResult;
+using android::hardware::boot::V1_0::CommandResult;
+using android::hardware::boot::V1_1::MergeStatus;
+
+namespace {
+
+// clang-format off
+
+#define BOOT_A_PATH "/dev/block/by-name/boot_a"
+#define BOOT_B_PATH "/dev/block/by-name/boot_b"
+#define DEVINFO_PATH "/dev/block/by-name/devinfo"
+
+#define BLOW_AR_PATH "/sys/kernel/boot_control/blow_ar"
+
+// slot flags
+#define AB_ATTR_PRIORITY_SHIFT 52
+#define AB_ATTR_PRIORITY_MASK (3UL << AB_ATTR_PRIORITY_SHIFT)
+#define AB_ATTR_ACTIVE_SHIFT 54
+#define AB_ATTR_ACTIVE (1UL << AB_ATTR_ACTIVE_SHIFT)
+#define AB_ATTR_RETRY_COUNT_SHIFT (55)
+#define AB_ATTR_RETRY_COUNT_MASK (7UL << AB_ATTR_RETRY_COUNT_SHIFT)
+#define AB_ATTR_SUCCESSFUL (1UL << 58)
+#define AB_ATTR_UNBOOTABLE (1UL << 59)
+
+#define AB_ATTR_MAX_PRIORITY 3UL
+#define AB_ATTR_MAX_RETRY_COUNT 3UL
+
+// clang-format on
+
+static std::string getDevPath(uint32_t slot) {
+ char real_path[PATH_MAX];
+
+ const char *path = slot == 0 ? BOOT_A_PATH : BOOT_B_PATH;
+
+ int ret = readlink(path, real_path, sizeof real_path);
+ if (ret < 0) {
+ ALOGE("readlink failed for boot device %s\n", strerror(errno));
+ return std::string();
+ }
+
+ std::string dp(real_path);
+ // extract /dev/sda.. part
+ return dp.substr(0, sizeof "/dev/block/sdX" - 1);
+}
+
+static bool isSlotFlagSet(uint32_t slot, uint64_t flag) {
+ std::string dev_path = getDevPath(slot);
+ if (dev_path.empty()) {
+ ALOGI("Could not get device path for slot %d\n", slot);
+ return false;
+ }
+
+ GptUtils gpt(dev_path);
+ if (gpt.Load()) {
+ ALOGI("failed to load gpt data\n");
+ return false;
+ }
+
+ gpt_entry *e = gpt.GetPartitionEntry(slot ? "boot_b" : "boot_a");
+ if (e == nullptr) {
+ ALOGI("failed to get gpt entry\n");
+ return false;
+ }
+
+ return !!(e->attr & flag);
+}
+
+static bool setSlotFlag(uint32_t slot, uint64_t flag) {
+ std::string dev_path = getDevPath(slot);
+ if (dev_path.empty()) {
+ ALOGI("Could not get device path for slot %d\n", slot);
+ return false;
+ }
+
+ GptUtils gpt(dev_path);
+ if (gpt.Load()) {
+ ALOGI("failed to load gpt data\n");
+ return false;
+ }
+
+ gpt_entry *e = gpt.GetPartitionEntry(slot ? "boot_b" : "boot_a");
+ if (e == nullptr) {
+ ALOGI("failed to get gpt entry\n");
+ return false;
+ }
+
+ e->attr |= flag;
+ gpt.Sync();
+
+ return true;
+}
+
+static bool is_devinfo_valid;
+static bool is_devinfo_initialized;
+static std::mutex devinfo_lock;
+static devinfo_t devinfo;
+
+static bool isDevInfoValid() {
+ const std::lock_guard<std::mutex> lock(devinfo_lock);
+
+ if (is_devinfo_initialized) {
+ return is_devinfo_valid;
+ }
+
+ is_devinfo_initialized = true;
+
+ android::base::unique_fd fd(open(DEVINFO_PATH, O_RDONLY));
+ android::base::ReadFully(fd, &devinfo, sizeof devinfo);
+
+ if (devinfo.magic != DEVINFO_MAGIC) {
+ return is_devinfo_valid;
+ }
+
+ uint32_t version = ((uint32_t)devinfo.ver_major << 16) | devinfo.ver_minor;
+ // only version 3.3+ supports A/B data
+ if (version >= 0x0003'0003) {
+ is_devinfo_valid = true;
+ }
+
+ return is_devinfo_valid;
+}
+
+static bool DevInfoSync() {
+ if (!isDevInfoValid()) {
+ return false;
+ }
+
+ android::base::unique_fd fd(open(DEVINFO_PATH, O_WRONLY | O_DSYNC));
+ return android::base::WriteFully(fd, &devinfo, sizeof devinfo);
+}
+
+static void DevInfoInitSlot(devinfo_ab_slot_data_t &slot_data) {
+ slot_data.retry_count = AB_ATTR_MAX_RETRY_COUNT;
+ slot_data.unbootable = 0;
+ slot_data.successful = 0;
+ slot_data.active = 1;
+ slot_data.fastboot_ok = 0;
+}
+
+static bool blowAR() {
+ android::base::unique_fd fd(open(BLOW_AR_PATH, O_WRONLY | O_DSYNC));
+ return android::base::WriteStringToFd("1", fd);
+}
+
+} // namespace
+
+// Methods from ::android::hardware::boot::V1_0::IBootControl follow.
+Return<uint32_t> BootControl::getNumberSlots() {
+ uint32_t slots = 0;
+
+ if (access(BOOT_A_PATH, F_OK) == 0)
+ slots++;
+
+ if (access(BOOT_B_PATH, F_OK) == 0)
+ slots++;
+
+ return slots;
+}
+
+Return<uint32_t> BootControl::getCurrentSlot() {
+ char suffix[PROPERTY_VALUE_MAX];
+ property_get("ro.boot.slot_suffix", suffix, "_a");
+ return std::string(suffix) == "_b" ? 1 : 0;
+}
+
+Return<void> BootControl::markBootSuccessful(markBootSuccessful_cb _hidl_cb) {
+ if (getNumberSlots() == 0) {
+ // no slots, just return true otherwise Android keeps trying
+ _hidl_cb({true, ""});
+ return Void();
+ }
+
+ bool ret;
+ if (isDevInfoValid()) {
+ auto const slot = getCurrentSlot();
+ devinfo.ab_data.slots[slot].successful = 1;
+ ret = DevInfoSync();
+ } else {
+ ret = setSlotFlag(getCurrentSlot(), AB_ATTR_SUCCESSFUL);
+ }
+
+ if (!ret) {
+ _hidl_cb({false, "Failed to set successful flag"});
+ return Void();
+ }
+
+ if (!blowAR()) {
+ ALOGE("Failed to blow anti-rollback counter");
+ // Ignore the error, since ABL will re-trigger it on reboot
+ }
+
+ _hidl_cb({true, ""});
+ return Void();
+}
+
+Return<void> BootControl::setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) {
+ if (slot >= 2) {
+ _hidl_cb({false, "Invalid slot"});
+ return Void();
+ }
+
+ if (isDevInfoValid()) {
+ auto &active_slot_data = devinfo.ab_data.slots[slot];
+ auto &inactive_slot_data = devinfo.ab_data.slots[!slot];
+
+ inactive_slot_data.active = 0;
+ DevInfoInitSlot(active_slot_data);
+
+ if (!DevInfoSync()) {
+ _hidl_cb({false, "Could not update DevInfo data"});
+ return Void();
+ }
+ } else {
+ std::string dev_path = getDevPath(slot);
+ if (dev_path.empty()) {
+ _hidl_cb({false, "Could not get device path for slot"});
+ return Void();
+ }
+
+ GptUtils gpt(dev_path);
+ if (gpt.Load()) {
+ _hidl_cb({false, "failed to load gpt data"});
+ return Void();
+ }
+
+ gpt_entry *active_entry = gpt.GetPartitionEntry(slot == 0 ? "boot_a" : "boot_b");
+ gpt_entry *inactive_entry = gpt.GetPartitionEntry(slot == 0 ? "boot_b" : "boot_a");
+ if (active_entry == nullptr || inactive_entry == nullptr) {
+ _hidl_cb({false, "failed to get entries for boot partitions"});
+ return Void();
+ }
+
+ ALOGV("slot active attributes %lx\n", active_entry->attr);
+ ALOGV("slot inactive attributes %lx\n", inactive_entry->attr);
+
+ // update attributes for active and inactive
+ inactive_entry->attr &= ~AB_ATTR_ACTIVE;
+ active_entry->attr = AB_ATTR_ACTIVE | (AB_ATTR_MAX_PRIORITY << AB_ATTR_PRIORITY_SHIFT) |
+ (AB_ATTR_MAX_RETRY_COUNT << AB_ATTR_RETRY_COUNT_SHIFT);
+ }
+
+ char boot_dev[PROPERTY_VALUE_MAX];
+ property_get("ro.boot.bootdevice", boot_dev, "");
+ if (boot_dev[0] == '\0') {
+ _hidl_cb({false, "invalid ro.boot.bootdevice prop"});
+ return Void();
+ }
+
+ std::string boot_lun_path =
+ std::string("/sys/devices/platform/") + boot_dev + "/pixel/boot_lun_enabled";
+ int fd = open(boot_lun_path.c_str(), O_RDWR | O_DSYNC);
+ if (fd < 0) {
+ // Try old path for kernels < 5.4
+ // TODO: remove once kernel 4.19 support is deprecated
+ std::string boot_lun_path =
+ std::string("/sys/devices/platform/") + boot_dev + "/attributes/boot_lun_enabled";
+ fd = open(boot_lun_path.c_str(), O_RDWR | O_DSYNC);
+ if (fd < 0) {
+ _hidl_cb({false, "failed to open ufs attr boot_lun_enabled"});
+ return Void();
+ }
+ }
+
+ //
+ // bBootLunEn
+ // 0x1 => Boot LU A = enabled, Boot LU B = disable
+ // 0x2 => Boot LU A = disable, Boot LU B = enabled
+ //
+ int ret = android::base::WriteStringToFd(slot == 0 ? "1" : "2", fd);
+ close(fd);
+ if (ret < 0) {
+ _hidl_cb({false, "faied to write boot_lun_enabled attribute"});
+ return Void();
+ }
+
+ _hidl_cb({true, ""});
+ return Void();
+}
+
+Return<void> BootControl::setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) {
+ if (slot >= 2) {
+ _hidl_cb({false, "Invalid slot"});
+ return Void();
+ }
+
+ if (isDevInfoValid()) {
+ auto &slot_data = devinfo.ab_data.slots[slot];
+ slot_data.unbootable = 1;
+ if (!DevInfoSync()) {
+ _hidl_cb({false, "Could not update DevInfo data"});
+ return Void();
+ }
+ } else {
+ std::string dev_path = getDevPath(slot);
+ if (dev_path.empty()) {
+ _hidl_cb({false, "Could not get device path for slot"});
+ return Void();
+ }
+
+ GptUtils gpt(dev_path);
+ gpt.Load();
+
+ gpt_entry *e = gpt.GetPartitionEntry(slot ? "boot_b" : "boot_a");
+ e->attr |= AB_ATTR_UNBOOTABLE;
+
+ gpt.Sync();
+ }
+
+ _hidl_cb({true, ""});
+ return Void();
+}
+
+Return<::android::hardware::boot::V1_0::BoolResult> BootControl::isSlotBootable(uint32_t slot) {
+ if (getNumberSlots() == 0)
+ return BoolResult::FALSE;
+ if (slot >= getNumberSlots())
+ return BoolResult::INVALID_SLOT;
+
+ bool unbootable;
+ if (isDevInfoValid()) {
+ auto &slot_data = devinfo.ab_data.slots[slot];
+ unbootable = !!slot_data.unbootable;
+ } else {
+ unbootable = isSlotFlagSet(slot, AB_ATTR_UNBOOTABLE);
+ }
+
+ return unbootable ? BoolResult::FALSE : BoolResult::TRUE;
+}
+
+Return<::android::hardware::boot::V1_0::BoolResult> BootControl::isSlotMarkedSuccessful(
+ uint32_t slot) {
+ if (getNumberSlots() == 0) {
+ // just return true so that we don't we another call trying to mark it as successful
+ // when there is no slots
+ return BoolResult::TRUE;
+ }
+ if (slot >= getNumberSlots())
+ return BoolResult::INVALID_SLOT;
+
+ bool successful;
+ if (isDevInfoValid()) {
+ auto &slot_data = devinfo.ab_data.slots[slot];
+ successful = !!slot_data.successful;
+ } else {
+ successful = isSlotFlagSet(slot, AB_ATTR_SUCCESSFUL);
+ }
+
+ return successful ? BoolResult::TRUE : BoolResult::FALSE;
+}
+
+Return<void> BootControl::getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) {
+ _hidl_cb(slot == 0 ? "_a" : slot == 1 ? "_b" : "");
+ return Void();
+}
+
+// Methods from ::android::hardware::boot::V1_1::IBootControl follow.
+bool BootControl::Init() {
+ return InitMiscVirtualAbMessageIfNeeded();
+}
+
+Return<bool> BootControl::setSnapshotMergeStatus(
+ ::android::hardware::boot::V1_1::MergeStatus status) {
+ return SetMiscVirtualAbMergeStatus(getCurrentSlot(), status);
+}
+
+Return<::android::hardware::boot::V1_1::MergeStatus> BootControl::getSnapshotMergeStatus() {
+ MergeStatus status;
+ if (!GetMiscVirtualAbMergeStatus(getCurrentSlot(), &status)) {
+ return MergeStatus::UNKNOWN;
+ }
+ return status;
+}
+
+// Methods from ::android::hardware::boot::V1_2::IBootControl follow.
+Return<uint32_t> BootControl::getActiveBootSlot() {
+ if (getNumberSlots() == 0)
+ return 0;
+
+ if (isDevInfoValid())
+ return devinfo.ab_data.slots[1].active ? 1 : 0;
+ return isSlotFlagSet(1, AB_ATTR_ACTIVE) ? 1 : 0;
+}
+
+// Methods from ::android::hidl::base::V1_0::IBase follow.
+
+IBootControl *HIDL_FETCH_IBootControl(const char * /* name */) {
+ auto module = new BootControl();
+
+ module->Init();
+
+ return module;
+}
+
+} // namespace implementation
+} // namespace V1_2
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.2/BootControl.h b/interfaces/boot/1.2/BootControl.h
new file mode 100644
index 00000000..17b5f0fb
--- /dev/null
+++ b/interfaces/boot/1.2/BootControl.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <android/hardware/boot/1.2/IBootControl.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_2 {
+namespace implementation {
+
+using ::android::sp;
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+
+struct BootControl : public IBootControl {
+ bool Init();
+
+ // Methods from ::android::hardware::boot::V1_0::IBootControl follow.
+ Return<uint32_t> getNumberSlots() override;
+ Return<uint32_t> getCurrentSlot() override;
+ Return<void> markBootSuccessful(markBootSuccessful_cb _hidl_cb) override;
+ Return<void> setActiveBootSlot(uint32_t slot, setActiveBootSlot_cb _hidl_cb) override;
+ Return<void> setSlotAsUnbootable(uint32_t slot, setSlotAsUnbootable_cb _hidl_cb) override;
+ Return<::android::hardware::boot::V1_0::BoolResult> isSlotBootable(uint32_t slot) override;
+ Return<::android::hardware::boot::V1_0::BoolResult> isSlotMarkedSuccessful(
+ uint32_t slot) override;
+ Return<void> getSuffix(uint32_t slot, getSuffix_cb _hidl_cb) override;
+
+ // Methods from ::android::hardware::boot::V1_1::IBootControl follow.
+ Return<bool> setSnapshotMergeStatus(
+ ::android::hardware::boot::V1_1::MergeStatus status) override;
+ Return<::android::hardware::boot::V1_1::MergeStatus> getSnapshotMergeStatus() override;
+
+ // Methods from ::android::hardware::boot::V1_2::IBootControl follow.
+ Return<uint32_t> getActiveBootSlot() override;
+
+ // Methods from ::android::hidl::base::V1_0::IBase follow.
+};
+
+// FIXME: most likely delete, this is only for passthrough implementations
+extern "C" IBootControl *HIDL_FETCH_IBootControl(const char *name);
+
+} // namespace implementation
+} // namespace V1_2
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.2/DevInfo.h b/interfaces/boot/1.2/DevInfo.h
new file mode 100644
index 00000000..a09a83a2
--- /dev/null
+++ b/interfaces/boot/1.2/DevInfo.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_2 {
+namespace implementation {
+
+//
+// definitions taken from ABL code
+//
+
+constexpr uint32_t DEVINFO_MAGIC = 0x49564544;
+constexpr size_t DEVINFO_AB_SLOT_COUNT = 2;
+
+struct devinfo_ab_slot_data_t {
+ uint8_t retry_count;
+ uint8_t unbootable : 1;
+ uint8_t successful : 1;
+ uint8_t active : 1;
+ uint8_t fastboot_ok : 1;
+ uint8_t : 4;
+ uint8_t unused[2];
+} __attribute__((packed));
+
+typedef struct {
+ devinfo_ab_slot_data_t slots[DEVINFO_AB_SLOT_COUNT];
+} __attribute__((packed)) devinfo_ab_data_t;
+
+struct devinfo_t {
+ uint32_t magic;
+ uint16_t ver_major;
+ uint16_t ver_minor;
+ uint8_t unused[40];
+ devinfo_ab_data_t ab_data;
+ uint8_t unused1[72]; // use remaining up to complete 128 bytes
+} __attribute__((packed));
+
+static_assert(sizeof(devinfo_t) == 128, "invalid devinfo struct size");
+
+} // namespace implementation
+} // namespace V1_2
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.2/GptUtils.cpp b/interfaces/boot/1.2/GptUtils.cpp
new file mode 100644
index 00000000..25088e79
--- /dev/null
+++ b/interfaces/boot/1.2/GptUtils.cpp
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2019 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.
+ */
+
+#define LOG_TAG "bootcontrolhal"
+
+#include "GptUtils.h"
+
+#include <android-base/file.h>
+#include <errno.h>
+#include <linux/fs.h>
+#include <log/log.h>
+#include <zlib.h>
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_2 {
+namespace implementation {
+
+namespace {
+
+static int ValidateGptHeader(gpt_header *gpt) {
+ if (gpt->signature != GPT_SIGNATURE) {
+ ALOGE("invalid gpt signature 0x%lx\n", gpt->signature);
+ return -1;
+ }
+
+ if (gpt->header_size != sizeof(gpt_header)) {
+ ALOGE("invalid gpt header size %u\n", gpt->header_size);
+ return -1;
+ }
+
+ if (gpt->entry_size != sizeof(gpt_entry)) {
+ ALOGE("invalid gpt entry size %u\n", gpt->entry_size);
+ return -1;
+ }
+
+ return 0;
+}
+
+} // namespace
+
+GptUtils::GptUtils(const std::string dev_path) : dev_path(dev_path), fd(0) {}
+
+int GptUtils::Load(void) {
+ fd = open(dev_path.c_str(), O_RDWR);
+ if (fd < 0) {
+ ALOGE("failed to open block dev %s, %d\n", dev_path.c_str(), errno);
+ return -1;
+ }
+
+ int ret = ioctl(fd, BLKSSZGET, &block_size);
+ if (ret < 0) {
+ ALOGE("failed to get block size %d\n", errno);
+ return -1;
+ }
+
+ // read primary header
+ lseek64(fd, block_size, SEEK_SET);
+ ret = read(fd, &gpt_primary, sizeof gpt_primary);
+ if (ret < 0) {
+ ALOGE("failed to read gpt primary header %d\n", errno);
+ return -1;
+ }
+
+ if (ValidateGptHeader(&gpt_primary)) {
+ ALOGE("error validating gpt header\n");
+ return -1;
+ }
+
+ // read partition entries
+ entry_array.resize(gpt_primary.entry_count);
+ uint32_t entries_size = gpt_primary.entry_size * gpt_primary.entry_count;
+ lseek64(fd, block_size * gpt_primary.start_lba, SEEK_SET);
+ ret = read(fd, entry_array.data(), entries_size);
+ if (ret < 0) {
+ ALOGE("failed to read gpt partition entries %d\n", errno);
+ return -1;
+ }
+
+ // read gpt back header
+ lseek64(fd, block_size * gpt_primary.backup_lba, SEEK_SET);
+ ret = read(fd, &gpt_backup, sizeof gpt_backup);
+ if (ret < 0) {
+ ALOGE("failed to read gpt backup header %d\n", errno);
+ return -1;
+ }
+
+ if (ValidateGptHeader(&gpt_backup)) {
+ ALOGW("error validating gpt backup\n"); // just warn about it, not fail
+ }
+
+ // Create map <partition name, gpt_entry pointer>
+ auto get_name = [](const uint16_t *efi_name) {
+ char name[37] = {};
+ for (int i = 0; efi_name[i] && i < sizeof name - 1; ++i) name[i] = efi_name[i];
+ return std::string(name);
+ };
+
+ for (auto const &e : entry_array) {
+ if (e.name[0] == 0)
+ break; // stop at the first partition with no name
+ std::string s = get_name(e.name);
+ entries[s] = const_cast<gpt_entry *>(&e);
+ }
+
+ return 0;
+}
+
+gpt_entry *GptUtils::GetPartitionEntry(std::string name) {
+ return entries.find(name) != entries.end() ? entries[name] : nullptr;
+}
+
+int GptUtils::Sync(void) {
+ if (!fd)
+ return -1;
+
+ // calculate crc and check if we need to update gpt
+ gpt_primary.entries_crc32 = crc32(0, reinterpret_cast<uint8_t *>(entry_array.data()),
+ entry_array.size() * sizeof(gpt_entry));
+
+ // save old crc
+ uint32_t crc = gpt_primary.crc32;
+ gpt_primary.crc32 = 0;
+
+ gpt_primary.crc32 = crc32(0, reinterpret_cast<uint8_t *>(&gpt_primary), sizeof gpt_primary);
+ if (crc == gpt_primary.crc32)
+ return 0; // nothing to do (no changes)
+
+ ALOGI("updating GPT\n");
+
+ lseek64(fd, block_size * gpt_primary.current_lba, SEEK_SET);
+ int ret = write(fd, &gpt_primary, sizeof gpt_primary);
+ if (ret < 0) {
+ ALOGE("failed to write gpt primary header %d\n", errno);
+ return -1;
+ }
+
+ lseek64(fd, block_size * gpt_primary.start_lba, SEEK_SET);
+ ret = write(fd, entry_array.data(), entry_array.size() * sizeof(gpt_entry));
+ if (ret < 0) {
+ ALOGE("failed to write gpt partition entries %d\n", errno);
+ return -1;
+ }
+
+ // update GPT backup entries and backup
+ lseek64(fd, block_size * gpt_backup.start_lba, SEEK_SET);
+ ret = write(fd, entry_array.data(), entry_array.size() * sizeof(gpt_entry));
+ if (ret < 0) {
+ ALOGE("failed to write gpt backup partition entries %d\n", errno);
+ return -1;
+ }
+
+ gpt_backup.entries_crc32 = gpt_primary.entries_crc32;
+ gpt_backup.crc32 = 0;
+ gpt_backup.crc32 = crc32(0, reinterpret_cast<uint8_t *>(&gpt_backup), sizeof gpt_backup);
+ lseek64(fd, block_size * gpt_primary.backup_lba, SEEK_SET);
+ ret = write(fd, &gpt_backup, sizeof gpt_backup);
+ if (ret < 0) {
+ ALOGE("failed to write gpt backup header %d\n", errno);
+ return -1;
+ }
+
+ fsync(fd);
+
+ return 0;
+}
+
+GptUtils::~GptUtils() {
+ if (fd) {
+ Sync();
+ close(fd);
+ }
+}
+
+} // namespace implementation
+} // namespace V1_2
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.2/GptUtils.h b/interfaces/boot/1.2/GptUtils.h
new file mode 100644
index 00000000..a2bed334
--- /dev/null
+++ b/interfaces/boot/1.2/GptUtils.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <map>
+#include <string>
+#include <vector>
+
+namespace android {
+namespace hardware {
+namespace boot {
+namespace V1_2 {
+namespace implementation {
+
+#define GPT_SIGNATURE 0x5452415020494645UL
+
+typedef struct {
+ uint8_t type_guid[16];
+ uint8_t guid[16];
+ uint64_t first_lba;
+ uint64_t last_lba;
+ uint64_t attr;
+ uint16_t name[36];
+} __attribute__((packed)) gpt_entry;
+
+typedef struct {
+ uint64_t signature;
+ uint32_t revision;
+ uint32_t header_size;
+ uint32_t crc32;
+ uint32_t reserved;
+ uint64_t current_lba;
+ uint64_t backup_lba;
+ uint64_t first_usable_lba;
+ uint64_t last_usable_lba;
+ uint8_t disk_guid[16];
+ uint64_t start_lba;
+ uint32_t entry_count;
+ uint32_t entry_size;
+ uint32_t entries_crc32;
+} __attribute__((packed)) gpt_header;
+
+class GptUtils {
+ public:
+ GptUtils(const std::string dev_path);
+ int Load(void);
+ gpt_entry *GetPartitionEntry(std::string name);
+ int Sync(void);
+ ~GptUtils();
+
+ private:
+ std::string dev_path;
+ int fd;
+ uint32_t block_size;
+ gpt_header gpt_primary;
+ gpt_header gpt_backup;
+ std::vector<gpt_entry> entry_array;
+ std::map<std::string, gpt_entry *> entries;
+};
+
+} // namespace implementation
+} // namespace V1_2
+} // namespace boot
+} // namespace hardware
+} // namespace android
diff --git a/interfaces/boot/1.2/android.hardware.boot@1.2-service-gs101.rc b/interfaces/boot/1.2/android.hardware.boot@1.2-service-gs101.rc
new file mode 100644
index 00000000..b0b14dc3
--- /dev/null
+++ b/interfaces/boot/1.2/android.hardware.boot@1.2-service-gs101.rc
@@ -0,0 +1,7 @@
+service vendor.boot-hal-1-2 /vendor/bin/hw/android.hardware.boot@1.2-service-gs101
+ interface android.hardware.boot@1.0::IBootControl default
+ interface android.hardware.boot@1.1::IBootControl default
+ interface android.hardware.boot@1.2::IBootControl default
+ class early_hal
+ user root
+ group root
diff --git a/interfaces/boot/1.2/service.cpp b/interfaces/boot/1.2/service.cpp
new file mode 100644
index 00000000..f07682e9
--- /dev/null
+++ b/interfaces/boot/1.2/service.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+#define LOG_TAG "android.hardware.boot@1.2-service"
+
+#include <android/hardware/boot/1.2/IBootControl.h>
+#include <hidl/HidlTransportSupport.h>
+#include <hidl/Status.h>
+#include <log/log.h>
+
+#include "BootControl.h"
+
+using ::android::status_t;
+
+using ::android::hardware::boot::V1_2::IBootControl;
+
+using ::android::hardware::boot::V1_2::implementation::BootControl;
+// using ::android::hardware::boot::implementation::BootControl;
+
+int main(int /* argc */, char * /* argv */[]) {
+ // This function must be called before you join to ensure the proper
+ // number of threads are created. The threadpool will never exceed
+ // size one because of this call.
+ ::android::hardware::configureRpcThreadpool(1 /*threads*/, true /*willJoin*/);
+
+ ::android::sp bootctrl = new BootControl();
+ const status_t status = bootctrl->registerAsService();
+ if (status != ::android::OK) {
+ return 1; // or handle error
+ }
+
+ // Adds this thread to the threadpool, resulting in one total
+ // thread in the threadpool. We could also do other things, but
+ // would have to specify 'false' to willJoin in configureRpcThreadpool.
+ ::android::hardware::joinRpcThreadpool();
+ return 1; // joinRpcThreadpool should never return
+}
diff --git a/manifest.xml b/manifest.xml
new file mode 100644
index 00000000..f968d10c
--- /dev/null
+++ b/manifest.xml
@@ -0,0 +1,163 @@
+<manifest version="1.0" type="device" target-level="6">
+ <hal format="hidl">
+ <name>android.hardware.audio</name>
+ <transport>hwbinder</transport>
+ <version>7.1</version>
+ <interface>
+ <name>IDevicesFactory</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.audio.effect</name>
+ <transport>hwbinder</transport>
+ <version>7.0</version>
+ <interface>
+ <name>IEffectsFactory</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.soundtrigger</name>
+ <transport>hwbinder</transport>
+ <version>2.3</version>
+ <interface>
+ <name>ISoundTriggerHw</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.media.omx</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IOmx</name>
+ <instance>default</instance>
+ </interface>
+ <interface>
+ <name>IOmxStore</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.graphics.mapper</name>
+ <transport arch="32+64">passthrough</transport>
+ <version>4.0</version>
+ <interface>
+ <name>IMapper</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.graphics.composer</name>
+ <transport>hwbinder</transport>
+ <version>2.4</version>
+ <interface>
+ <name>IComposer</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format = "hidl">
+ <name>android.hardware.dumpstate</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IDumpstateDevice</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.bluetooth</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IBluetoothHci</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.boot</name>
+ <transport>hwbinder</transport>
+ <fqname>@1.2::IBootControl/default</fqname>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.neuralnetworks</name>
+ <transport>hwbinder</transport>
+ <version>1.3</version>
+ <interface>
+ <name>IDevice</name>
+ <instance>google-armnn</instance>
+ </interface>
+ <fqname>@1.3::IDevice/google-armnn</fqname>
+ </hal>
+ <hal format="aidl">
+ <name>com.google.input</name>
+ <interface>
+ <name>ITouchContextService</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>hardware.google.bluetooth.bt_channel_avoidance</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IBTChannelAvoidance</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>hardware.google.bluetooth.ext</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IBluetoothExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>hardware.google.bluetooth.sar</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IBluetoothSar</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>hardware.google.bluetooth.ccc</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IBluetoothCcc</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>vendor.google.google_battery</name>
+ <version>2</version>
+ <interface>
+ <name>IGoogleBattery</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>vendor.google.whitechapel.audio.audioext</name>
+ <transport>hwbinder</transport>
+ <version>4.0</version>
+ <interface>
+ <name>IAudioExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>vendor.google.audiometricext</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IAudioMetricExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <kernel target-level="6"/>
+</manifest>
diff --git a/manifest_64.xml b/manifest_64.xml
new file mode 100644
index 00000000..b54fb506
--- /dev/null
+++ b/manifest_64.xml
@@ -0,0 +1,146 @@
+<manifest version="1.0" type="device" target-level="5">
+ <hal format="hidl">
+ <name>android.hardware.audio</name>
+ <transport>hwbinder</transport>
+ <version>7.1</version>
+ <interface>
+ <name>IDevicesFactory</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.audio.effect</name>
+ <transport>hwbinder</transport>
+ <version>7.0</version>
+ <interface>
+ <name>IEffectsFactory</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.soundtrigger</name>
+ <transport>hwbinder</transport>
+ <version>2.3</version>
+ <interface>
+ <name>ISoundTriggerHw</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.graphics.mapper</name>
+ <transport arch="32+64">passthrough</transport>
+ <version>4.0</version>
+ <interface>
+ <name>IMapper</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.graphics.composer</name>
+ <transport>hwbinder</transport>
+ <version>2.4</version>
+ <interface>
+ <name>IComposer</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format = "hidl">
+ <name>android.hardware.dumpstate</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IDumpstateDevice</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.bluetooth</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IBluetoothHci</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.boot</name>
+ <transport>hwbinder</transport>
+ <fqname>@1.2::IBootControl/default</fqname>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.neuralnetworks</name>
+ <transport>hwbinder</transport>
+ <version>1.3</version>
+ <interface>
+ <name>IDevice</name>
+ <instance>google-armnn</instance>
+ </interface>
+ <fqname>@1.3::IDevice/google-armnn</fqname>
+ </hal>
+ <hal format="hidl">
+ <name>android.hardware.neuralnetworks</name>
+ <transport>hwbinder</transport>
+ <fqname>@1.3::IDevice/google-edgetpu</fqname>
+ </hal>
+ <hal format="aidl">
+ <name>com.google.input</name>
+ <interface>
+ <name>ITouchContextService</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>hardware.google.bluetooth.bt_channel_avoidance</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IBTChannelAvoidance</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>hardware.google.bluetooth.sar</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IBluetoothSar</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>hardware.google.bluetooth.ccc</name>
+ <transport>hwbinder</transport>
+ <version>1.1</version>
+ <interface>
+ <name>IBluetoothCcc</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="aidl">
+ <name>vendor.google.google_battery</name>
+ <version>2</version>
+ <interface>
+ <name>IGoogleBattery</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>vendor.google.whitechapel.audio.audioext</name>
+ <transport>hwbinder</transport>
+ <version>4.0</version>
+ <interface>
+ <name>IAudioExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>vendor.google.audiometricext</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IAudioMetricExt</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <kernel target-level="6"/>
+</manifest>
diff --git a/manifest_media.xml b/manifest_media.xml
new file mode 100644
index 00000000..3ed9e247
--- /dev/null
+++ b/manifest_media.xml
@@ -0,0 +1,12 @@
+<manifest version="1.0" type="device">
+ <hal format="hidl">
+ <name>android.hardware.media.c2</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IComponentStore</name>
+ <instance>default</instance>
+ <instance>default1</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/manifest_media_aosp.xml b/manifest_media_aosp.xml
new file mode 100644
index 00000000..3bc347c9
--- /dev/null
+++ b/manifest_media_aosp.xml
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="device">
+ <hal format="hidl">
+ <name>android.hardware.media.c2</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>IComponentStore</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/media_codecs.xml b/media_codecs.xml
new file mode 100644
index 00000000..87a42ef5
--- /dev/null
+++ b/media_codecs.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- 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.
+-->
+
+<!--
+<!DOCTYPE MediaCodecs [
+<!ELEMENT Include EMPTY>
+<!ATTLIST Include href CDATA #REQUIRED>
+<!ELEMENT MediaCodecs (Decoders|Encoders|Include)*>
+<!ELEMENT Decoders (MediaCodec|Include)*>
+<!ELEMENT Encoders (MediaCodec|Include)*>
+<!ELEMENT MediaCodec (Type|Quirk|Include)*>
+<!ATTLIST MediaCodec name CDATA #REQUIRED>
+<!ATTLIST MediaCodec type CDATA>
+<!ELEMENT Type EMPTY>
+<!ATTLIST Type name CDATA #REQUIRED>
+<!ELEMENT Quirk EMPTY>
+<!ATTLIST Quirk name CDATA #REQUIRED>
+]>
+
+There's a simple and a complex syntax to declare the availability of a
+media codec:
+
+A codec that properly follows the OpenMax spec and therefore doesn't have any
+quirks and that only supports a single content type can be declared like so:
+
+ <MediaCodec name="OMX.foo.bar" type="something/interesting" />
+
+If a codec has quirks OR supports multiple content types, the following syntax
+can be used:
+
+ <MediaCodec name="OMX.foo.bar" >
+ <Type name="something/interesting" />
+ <Type name="something/else" />
+ ...
+ <Quirk name="requires-allocate-on-input-ports" />
+ <Quirk name="requires-allocate-on-output-ports" />
+ <Quirk name="output-buffers-are-unreadable" />
+ </MediaCodec>
+
+Only the three quirks included above are recognized at this point:
+
+"requires-allocate-on-input-ports"
+ must be advertised if the component does not properly support specification
+ of input buffers using the OMX_UseBuffer(...) API but instead requires
+ OMX_AllocateBuffer to be used.
+
+"requires-allocate-on-output-ports"
+ must be advertised if the component does not properly support specification
+ of output buffers using the OMX_UseBuffer(...) API but instead requires
+ OMX_AllocateBuffer to be used.
+
+"output-buffers-are-unreadable"
+ must be advertised if the emitted output buffers of a decoder component
+ are not readable, i.e. use a custom format even though abusing one of
+ the official OMX colorspace constants.
+ Clients of such decoders will not be able to access the decoded data,
+ naturally making the component much less useful. The only use for
+ a component with this quirk is to render the output to the screen.
+ Audio decoders MUST NOT advertise this quirk.
+ Video decoders that advertise this quirk must be accompanied by a
+ corresponding color space converter for thumbnail extraction,
+ matching surfaceflinger support that can render the custom format to
+ a texture and possibly other code, so just DON'T USE THIS QUIRK.
+
+-->
+
+<MediaCodecs>
+ <Include href="media_codecs_google_telephony.xml" />
+</MediaCodecs>
diff --git a/media_codecs_aosp_c2.xml b/media_codecs_aosp_c2.xml
new file mode 100644
index 00000000..31842ff8
--- /dev/null
+++ b/media_codecs_aosp_c2.xml
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright 2018 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.
+-->
+<MediaCodecs>
+ <Settings>
+ <Setting name="supports-multiple-secure-codecs" value="true" />
+ <Setting name="supports-secure-with-non-secure-codec" value="true" />
+ </Settings>
+ <Decoders>
+ <MediaCodec name="c2.exynos.h264.decoder" type="video/avc">
+ <Limit name="size" min="32x32" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-32400" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-120000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="adaptive-playback" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.h264.decoder.secure" type="video/avc">
+ <Limit name="size" min="32x32" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-32400" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-120000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="2" />
+ <Feature name="adaptive-playback" />
+ <Feature name="secure-playback" required="true" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.hevc.decoder" type="video/hevc" >
+ <Limit name="size" min="64x64" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-32400" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-120000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="adaptive-playback" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.hevc.decoder.secure" type="video/hevc" >
+ <Limit name="size" min="64x64" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-32400" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-120000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="2" />
+ <Feature name="adaptive-playback" />
+ <Feature name="secure-playback" required="true" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.mpeg4.decoder" type="video/mp4v-es">
+ <Limit name="size" min="32x32" max="2048x2048" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-16384" />
+ <Limit name="blocks-per-second" min="1" max="979200" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-1920x1080" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="adaptive-playback" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.h263.decoder" type="video/3gpp">
+ <Limit name="size" min="32x32" max="2048x1152" />
+ <Limit name="alignment" value="4x4" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-9216" />
+ <Limit name="blocks-per-second" min="1" max="979200" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-1920x1080" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="adaptive-playback" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp8.decoder" type="video/x-vnd.on2.vp8" >
+ <Limit name="size" min="32x32" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-32400" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="adaptive-playback" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp9.decoder" type="video/x-vnd.on2.vp9" >
+ <Limit name="size" min="64x64" max="3840x2176" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="64x64" />
+ <Limit name="block-count" range="1-2040" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="adaptive-playback" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp9.decoder.secure" type="video/x-vnd.on2.vp9" >
+ <Limit name="size" min="64x64" max="3840x2176" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="64x64" />
+ <Limit name="block-count" range="1-2040" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="2" />
+ <Feature name="adaptive-playback" />
+ <Feature name="secure-playback" required="true" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ </Decoders>
+
+ <Encoders>
+ <MediaCodec name="c2.exynos.h264.encoder" type="video/avc">
+ <Limit name="size" min="32x32" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-32400" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-120000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="can-swap-width-height" value="1" />
+ <Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
+ <Feature name="bitrate-modes" value="VBR,CBR,CBR-FD" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.hevc.encoder" type="video/hevc" >
+ <Limit name="size" min="64x64" max="3840x2176" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="32x32" />
+ <Limit name="block-count" range="1-8160" />
+ <Limit name="blocks-per-second" min="1" max="979200" />
+ <Limit name="bitrate" range="1-120000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="can-swap-width-height" value="1" />
+ <Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
+ <Feature name="bitrate-modes" value="VBR,CBR,CBR-FD" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.mpeg4.encoder" type="video/mp4v-es">
+ <Limit name="size" min="32x32" max="2048x2048" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-16384" />
+ <Limit name="blocks-per-second" min="1" max="979200" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-1920x1080" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="can-swap-width-height" value="1" />
+ <Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
+ <Feature name="bitrate-modes" value="VBR,CBR" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.h263.encoder" type="video/3gpp">
+ <Limit name="size" min="32x32" max="2048x1152" />
+ <Limit name="alignment" value="4x4" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-9216" />
+ <Limit name="blocks-per-second" min="1" max="979200" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-1920x1080" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
+ <Feature name="bitrate-modes" value="VBR,CBR" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp8.encoder" type="video/x-vnd.on2.vp8" >
+ <Limit name="size" min="32x32" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="1-32400" />
+ <Limit name="blocks-per-second" min="1" max="3888000" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="can-swap-width-height" value="1" />
+ <Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
+ <Feature name="bitrate-modes" value="VBR,CBR" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp9.encoder" type="video/x-vnd.on2.vp9" >
+ <Limit name="size" min="64x64" max="3840x2176" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="64x64" />
+ <Limit name="block-count" range="1-2040" />
+ <Limit name="blocks-per-second" min="1" max="243000" />
+ <Limit name="bitrate" range="1-80000000" />
+ <Limit name="performance-point-1280x720" range="240" />
+ <Limit name="performance-point-3840x2160" range="120" />
+ <Limit name="concurrent-instances" max="16" />
+ <Feature name="can-swap-width-height" value="1" />
+ <Feature name="vq-minimum-quality"/>
+ <Feature name="qp-bounds"/>
+ <Feature name="bitrate-modes" value="VBR,CBR" />
+ </MediaCodec>
+ </Encoders>
+</MediaCodecs>
diff --git a/media_codecs_bo_c2.xml b/media_codecs_bo_c2.xml
new file mode 100644
index 00000000..40c81ff1
--- /dev/null
+++ b/media_codecs_bo_c2.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright 2018 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.
+-->
+<MediaCodecs>
+ <Include href="media_codecs_aosp_c2.xml" />
+ <Include href="media_codecs_dolby_c2.xml" />
+ <Decoders>
+ <MediaCodec name="c2.google.av1.decoder" type="video/av01">
+ <Limit name="size" min="96x96" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="36-32400" />
+ <Limit name="blocks-per-second" min="24" max="1944000" />
+ <Limit name="bitrate" range="1-120000000" />
+ <Limit name="frame-rate" range="1-180" />
+ <Limit name="concurrent-instances" max="16" />
+ <Limit name="performance-point-1280x720" value="180" />
+ <Limit name="performance-point-1920x1080" value="120" />
+ <Limit name="performance-point-3840x2160" value="60" />
+ <Feature name="adaptive-playback" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ <MediaCodec name="c2.google.av1.decoder.secure" type="video/av01">
+ <Limit name="size" min="96x96" max="3840x2160" />
+ <Limit name="alignment" value="2x2" />
+ <Limit name="block-size" value="16x16" />
+ <Limit name="block-count" range="36-32400" />
+ <Limit name="blocks-per-second" min="24" max="1944000" />
+ <Limit name="bitrate" range="1-120000000" />
+ <Limit name="frame-rate" range="1-180" />
+ <Limit name="concurrent-instances" max="16" />
+ <Limit name="performance-point-1280x720" value="180" />
+ <Limit name="performance-point-1920x1080" value="120" />
+ <Limit name="performance-point-3840x2160" value="60" />
+ <Feature name="adaptive-playback" />
+ <Feature name="secure-playback" required="true" />
+ <Feature name="can-swap-width-height" value="1" />
+ </MediaCodec>
+ </Decoders>
+</MediaCodecs>
diff --git a/media_codecs_performance.xml b/media_codecs_performance.xml
new file mode 100644
index 00000000..9cb42101
--- /dev/null
+++ b/media_codecs_performance.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- 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.
+-->
+
+<MediaCodecs>
+</MediaCodecs>
diff --git a/media_codecs_performance_c2.xml b/media_codecs_performance_c2.xml
new file mode 100644
index 00000000..7000661b
--- /dev/null
+++ b/media_codecs_performance_c2.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- 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.
+-->
+
+<MediaCodecs>
+ <Decoders>
+ <MediaCodec name="c2.exynos.h264.decoder" type="video/avc" update="true">
+ <!-- measured 90%:528-534 med:528 N=2 -->
+ <Limit name="measured-frame-rate-320x240" range="528-531" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:550-560 med:551 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="550-555" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:540-561 med:541 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="540-551" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:409-413 med:410 N=2 -->
+ <Limit name="measured-frame-rate-1920x1088" range="409-411" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.h264.decoder.secure" type="video/avc" update="true">
+ <!-- measured 90%:528-534 med:528 N=2 -->
+ <Limit name="measured-frame-rate-320x240" range="528-531" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:550-560 med:551 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="550-555" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:540-561 med:541 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="540-551" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:409-413 med:410 N=2 -->
+ <Limit name="measured-frame-rate-1920x1088" range="409-411" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.hevc.decoder" type="video/hevc" update="true">
+ <!-- measured 90%:529-530 med:529 N=2 -->
+ <Limit name="measured-frame-rate-352x288" range="1150-1250" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:528-530 med:529 N=2 -->
+ <Limit name="measured-frame-rate-640x360" range="528-529" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:546-549 med:546 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="546-548" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:547-560 med:547 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="547-553" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:569-574 med:570 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="569-572" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:159-160 med:159 N=2 -->
+ <Limit name="measured-frame-rate-3840x2160" range="159-159" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.hevc.decoder.secure" type="video/hevc" update="true">
+ <!-- measured 90%:529-530 med:529 N=2 -->
+ <Limit name="measured-frame-rate-352x288" range="1150-1250" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:528-530 med:529 N=2 -->
+ <Limit name="measured-frame-rate-640x360" range="528-529" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:546-549 med:546 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="546-548" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:547-560 med:547 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="547-553" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:569-574 med:570 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="569-572" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:159-160 med:159 N=2 -->
+ <Limit name="measured-frame-rate-3840x2160" range="159-159" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.mpeg4.decoder" type="video/mp4v-es" update="true">
+ <!-- measured 90%:527-537 med:528 N=2 -->
+ <Limit name="measured-frame-rate-176x144" range="527-532" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:387-391 med:387 N=2 -->
+ <Limit name="measured-frame-rate-480x360" range="387-389" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.h263.decoder" type="video/3gpp" update="true">
+ <Limit name="measured-frame-rate-176x144" range="502-753" />
+ <Limit name="measured-frame-rate-352x288" range="420-631" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp8.decoder" type="video/x-vnd.on2.vp8" update="true">
+ <!-- measured 90%:451-555 med:452 SLOW N=2 -->
+ <Limit name="measured-frame-rate-320x180" range="451-500" /> <!-- v90%=1.1 -->
+ <!-- measured 90%:486-504 med:486 N=2 -->
+ <Limit name="measured-frame-rate-640x360" range="486-495" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:518-566 med:518 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="518-542" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:386-387 med:386 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="386-386" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp9.decoder" type="video/x-vnd.on2.vp9" update="true">
+ <!-- measured 90%:523-536 med:524 N=2 -->
+ <Limit name="measured-frame-rate-320x180" range="523-529" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:503-506 med:504 N=2 -->
+ <Limit name="measured-frame-rate-640x360" range="503-505" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:510-518 med:511 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="510-514" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:349-351 med:350 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="349-350" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:100-101 med:100 N=2 -->
+ <Limit name="measured-frame-rate-3840x2160" range="100-100" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp9.decoder.secure" type="video/x-vnd.on2.vp9" update="true">
+ <!-- measured 90%:523-536 med:524 N=2 -->
+ <Limit name="measured-frame-rate-320x180" range="523-529" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:503-506 med:504 N=2 -->
+ <Limit name="measured-frame-rate-640x360" range="503-505" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:510-518 med:511 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="510-514" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:349-351 med:350 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="349-350" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:100-101 med:100 N=2 -->
+ <Limit name="measured-frame-rate-3840x2160" range="100-100" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+
+ <MediaCodec name="c2.android.h263.decoder" type="video/3gpp" update="true">
+ <Limit name="measured-frame-rate-176x144" range="849-1283" /> <!-- v90%=1.2 -->
+ <Limit name="measured-frame-rate-352x288" range="766-822" /> <!-- v90%=1.1 -->
+ </MediaCodec>
+ <MediaCodec name="c2.android.avc.decoder" type="video/avc" update="true">
+ <!-- measured 90%:342-360 med:343 N=2 -->
+ <Limit name="measured-frame-rate-320x240" range="342-351" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:142-147 med:143 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="142-145" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:54-56 med:55 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="54-55" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:25-26 med:26 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="25-26" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.android.hevc.decoder" type="video/hevc" update="true">
+ <Limit name="measured-frame-rate-352x288" range="583-674" /> <!-- N=20 v90%=1.0 -->
+ <Limit name="measured-frame-rate-640x360" range="337-352" /> <!-- v90%=1.0 -->
+ <Limit name="measured-frame-rate-720x480" range="312-324" /> <!-- v90%=1.0 -->
+ <Limit name="measured-frame-rate-1280x720" range="104-108" /> <!-- v90%=1.0 -->
+ <Limit name="measured-frame-rate-1920x1080" range="54-56" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.android.mpeg4.decoder" type="video/mp4v-es" update="true">
+ <Limit name="measured-frame-rate-176x144" range="1215-1823" />
+ <Limit name="measured-frame-rate-480x360" range="830-1246" />
+ <Limit name="measured-frame-rate-1280x720" range="234-351" />
+ </MediaCodec>
+ <MediaCodec name="c2.android.vp8.decoder" type="video/x-vnd.on2.vp8" update="true">
+ <Limit name="measured-frame-rate-320x180" range="873-1013" /> <!-- v90%=1.1 -->
+ <Limit name="measured-frame-rate-640x360" range="394-455" /> <!-- N=20 v90%=1.0 -->
+ <Limit name="measured-frame-rate-1280x720" range="105-109" /> <!-- v90%=1.0 -->
+ <Limit name="measured-frame-rate-1920x1080" range="38-41" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.android.vp9.decoder" type="video/x-vnd.on2.vp9" update="true">
+ <!-- measured 90%:440-463 med:441 N=2 -->
+ <Limit name="measured-frame-rate-320x180" range="440-452" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:232-234 med:233 N=2 -->
+ <Limit name="measured-frame-rate-640x360" range="232-233" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:63-64 med:63 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="63-63" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:39-40 med:39 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="39-40" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.google.av1.decoder" type="video/av01" update="true">
+ <!-- measured 90%:295-301 med:296 N=2 -->
+ <Limit name="measured-frame-rate-352x288" range="295-298" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:196-207 med:196 N=2 -->
+ <Limit name="measured-frame-rate-640x360" range="196-201" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:177-180 med:178 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="177-178" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:81-82 med:82 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="81-82" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:45-47 med:46 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="45-46" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.google.av1.decoder.secure" type="video/av01" update="true">
+ <!-- measured 90%:295-301 med:296 N=2 -->
+ <Limit name="measured-frame-rate-352x288" range="295-298" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:196-207 med:196 N=2 -->
+ <Limit name="measured-frame-rate-640x360" range="196-201" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:177-180 med:178 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="177-178" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:81-82 med:82 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="81-82" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:45-47 med:46 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="45-46" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ </Decoders>
+
+ <Encoders>
+ <MediaCodec name="c2.exynos.h264.encoder" type="video/avc" update="true">
+ <Limit name="measured-frame-rate-320x240" range="371-554" />
+ <!-- measured 90%:301-313 med:302 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="301-307" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:181-201 med:181 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="181-190" /> <!-- v90%=1.1 -->
+ <!-- measured 90%:98-100 med:99 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="98-99" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.hevc.encoder" type="video/hevc" update="true">
+ <Limit name="measured-frame-rate-320x240" range="365-546" />
+ <!-- measured 90%:291-304 med:292 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="291-298" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:195-201 med:196 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="195-198" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:94-96 med:95 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="94-95" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.mpeg4.encoder" type="video/mp4v-es" update="true">
+ <Limit name="measured-frame-rate-176x144" range="280-451" /> <!-- v90%=1.1 -->
+ <Limit name="measured-frame-rate-352x288" range="214-396" /> <!-- v90%=1.1 -->
+ <Limit name="measured-frame-rate-640x480" range="121-159" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.h263.encoder" type="video/3gpp" update="true">
+ <Limit name="measured-frame-rate-176x144" range="273-405" /> <!-- v90%=1.0 -->
+ <Limit name="measured-frame-rate-352x288" range="250-320" /> <!-- v90%=1.0 -->
+ <Limit name="measured-frame-rate-704x576" range="120-176" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp8.encoder" type="video/x-vnd.on2.vp8" update="true">
+ <Limit name="measured-frame-rate-320x180" range="382-574" />
+ <Limit name="measured-frame-rate-640x360" range="182-274" />
+ <Limit name="measured-frame-rate-1280x720" range="89-134" />
+ <Limit name="measured-frame-rate-1920x1080" range="60-91" />
+ </MediaCodec>
+ <MediaCodec name="c2.exynos.vp9.encoder" type="video/x-vnd.on2.vp9" update="true">
+ <Limit name="measured-frame-rate-320x180" range="381-570" />
+ <Limit name="measured-frame-rate-640x360" range="184-276" />
+ <Limit name="measured-frame-rate-1280x720" range="91-136" />
+ <Limit name="measured-frame-rate-1920x1080" range="62-93" />
+ </MediaCodec>
+
+ <MediaCodec name="c2.android.h263.encoder" type="video/3gpp" update="true">
+ <Limit name="measured-frame-rate-176x144" range="841-1261" />
+ </MediaCodec>
+ <MediaCodec name="c2.android.avc.encoder" type="video/avc" update="true">
+ <!-- measured 90%:345-350 med:345 N=2 -->
+ <Limit name="measured-frame-rate-320x240" range="345-347" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:101-103 med:101 N=2 -->
+ <Limit name="measured-frame-rate-720x480" range="101-102" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:54-55 med:54 N=2 -->
+ <Limit name="measured-frame-rate-1280x720" range="54-54" /> <!-- v90%=1.0 -->
+ <!-- measured 90%:28-30 med:29 N=2 -->
+ <Limit name="measured-frame-rate-1920x1080" range="28-29" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.android.hevc.encoder" type="video/hevc" update="true">
+ <!-- measured 90%:61-65 med:62 N=8 -->
+ <Limit name="measured-frame-rate-320x240" range="62-63" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.android.mpeg4.encoder" type="video/mp4v-es" update="true">
+ <Limit name="measured-frame-rate-176x144" range="1129-1694" />
+ </MediaCodec>
+ <MediaCodec name="c2.android.vp8.encoder" type="video/x-vnd.on2.vp8" update="true">
+ <Limit name="measured-frame-rate-320x180" range="183-284" /> <!-- v90%=1.3 -->
+ <Limit name="measured-frame-rate-640x360" range="74-134" /> <!-- v90%=1.0 -->
+ <Limit name="measured-frame-rate-1280x720" range="34-38" /> <!-- v90%=1.0 -->
+ <Limit name="measured-frame-rate-1920x1080" range="29-31" /> <!-- v90%=1.0 -->
+ </MediaCodec>
+ <MediaCodec name="c2.android.vp9.encoder" type="video/x-vnd.on2.vp9" update="true">
+ <Limit name="measured-frame-rate-320x180" range="251-376" />
+ <Limit name="measured-frame-rate-640x360" range="64-97" />
+ <Limit name="measured-frame-rate-1280x720" range="16-24" />
+ </MediaCodec>
+ </Encoders>
+</MediaCodecs>
diff --git a/media_profiles.xml b/media_profiles.xml
new file mode 100644
index 00000000..cc6e3f4e
--- /dev/null
+++ b/media_profiles.xml
@@ -0,0 +1,895 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!DOCTYPE MediaSettings [
+<!ELEMENT MediaSettings (CamcorderProfiles,
+ EncoderOutputFileFormat+,
+ VideoEncoderCap+,
+ AudioEncoderCap+,
+ VideoDecoderCap,
+ AudioDecoderCap)>
+<!ELEMENT CamcorderProfiles (EncoderProfile+, ImageEncoding+, ImageDecoding, Camera)>
+<!ELEMENT EncoderProfile (Video, Audio)>
+<!ATTLIST EncoderProfile quality (high|low) #REQUIRED>
+<!ATTLIST EncoderProfile fileFormat (mp4|3gp) #REQUIRED>
+<!ATTLIST EncoderProfile duration (30|60) #REQUIRED>
+<!ELEMENT Video EMPTY>
+<!ATTLIST Video codec (h264|h263|m4v) #REQUIRED>
+<!ATTLIST Video bitRate CDATA #REQUIRED>
+<!ATTLIST Video width CDATA #REQUIRED>
+<!ATTLIST Video height CDATA #REQUIRED>
+<!ATTLIST Video frameRate CDATA #REQUIRED>
+<!ELEMENT Audio EMPTY>
+<!ATTLIST Audio codec (amrnb|amrwb|aac) #REQUIRED>
+<!ATTLIST Audio bitRate CDATA #REQUIRED>
+<!ATTLIST Audio sampleRate CDATA #REQUIRED>
+<!ATTLIST Audio channels (1|2) #REQUIRED>
+<!ELEMENT ImageEncoding EMPTY>
+<!ATTLIST ImageEncoding quality (90|80|70|60|50|40) #REQUIRED>
+<!ELEMENT ImageDecoding EMPTY>
+<!ATTLIST ImageDecoding memCap CDATA #REQUIRED>
+<!ELEMENT Camera EMPTY>
+<!ATTLIST Camera previewFrameRate CDATA #REQUIRED>
+<!ELEMENT EncoderOutputFileFormat EMPTY>
+<!ATTLIST EncoderOutputFileFormat name (mp4|3gp) #REQUIRED>
+<!ELEMENT VideoEncoderCap EMPTY>
+<!ATTLIST VideoEncoderCap name (h264|h263|m4v|wmv) #REQUIRED>
+<!ATTLIST VideoEncoderCap enabled (true|false) #REQUIRED>
+<!ATTLIST VideoEncoderCap minBitRate CDATA #REQUIRED>
+<!ATTLIST VideoEncoderCap maxBitRate CDATA #REQUIRED>
+<!ATTLIST VideoEncoderCap minFrameWidth CDATA #REQUIRED>
+<!ATTLIST VideoEncoderCap maxFrameWidth CDATA #REQUIRED>
+<!ATTLIST VideoEncoderCap minFrameHeight CDATA #REQUIRED>
+<!ATTLIST VideoEncoderCap maxFrameHeight CDATA #REQUIRED>
+<!ATTLIST VideoEncoderCap minFrameRate CDATA #REQUIRED>
+<!ATTLIST VideoEncoderCap maxFrameRate CDATA #REQUIRED>
+<!ELEMENT AudioEncoderCap EMPTY>
+<!ATTLIST AudioEncoderCap name (amrnb|amrwb|aac|wma) #REQUIRED>
+<!ATTLIST AudioEncoderCap enabled (true|false) #REQUIRED>
+<!ATTLIST AudioEncoderCap minBitRate CDATA #REQUIRED>
+<!ATTLIST AudioEncoderCap maxBitRate CDATA #REQUIRED>
+<!ATTLIST AudioEncoderCap minSampleRate CDATA #REQUIRED>
+<!ATTLIST AudioEncoderCap maxSampleRate CDATA #REQUIRED>
+<!ATTLIST AudioEncoderCap minChannels (1|2) #REQUIRED>
+<!ATTLIST AudioEncoderCap maxChannels (1|2) #REQUIRED>
+<!ELEMENT VideoDecoderCap EMPTY>
+<!ATTLIST VideoDecoderCap name (wmv) #REQUIRED>
+<!ATTLIST VideoDecoderCap enabled (true|false) #REQUIRED>
+<!ELEMENT AudioDecoderCap EMPTY>
+<!ATTLIST AudioDecoderCap name (wma) #REQUIRED>
+<!ATTLIST AudioDecoderCap enabled (true|false) #REQUIRED>
+]>
+<!--
+ This file is used to declare the multimedia profiles and capabilities
+ on an android-powered device.
+-->
+<MediaSettings>
+ <!-- Each camcorder profile defines a set of predefined configuration parameters -->
+ <CamcorderProfiles cameraId="0">
+
+ <EncoderProfile quality="2160p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="3840"
+ height="2160"
+ frameRate="60" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="60" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse2160p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="3840"
+ height="2160"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="highspeed1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="42000000"
+ width="1920"
+ height="1080"
+ frameRate="240" />
+
+ <!-- audio setting is ignored -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="48000"
+ channels="1" />
+ </EncoderProfile>
+
+ <ImageEncoding quality="90" />
+ <ImageEncoding quality="80" />
+ <ImageEncoding quality="70" />
+ <ImageDecoding memCap="20000000" />
+
+ </CamcorderProfiles>
+
+ <CamcorderProfiles cameraId="1">
+
+ <EncoderProfile quality="1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+ <EncoderProfile quality="480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <ImageEncoding quality="90" />
+ <ImageEncoding quality="80" />
+ <ImageEncoding quality="70" />
+ <ImageDecoding memCap="20000000" />
+
+ </CamcorderProfiles>
+
+ <CamcorderProfiles cameraId="2">
+
+ <EncoderProfile quality="2160p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="3840"
+ height="2160"
+ frameRate="60" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+ <EncoderProfile quality="480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="highspeed1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="42000000"
+ width="1920"
+ height="1080"
+ frameRate="240" />
+
+ <!-- audio setting is ignored -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="48000"
+ channels="1" />
+ </EncoderProfile>
+
+ <ImageEncoding quality="90" />
+ <ImageEncoding quality="80" />
+ <ImageEncoding quality="70" />
+ <ImageDecoding memCap="20000000" />
+
+ </CamcorderProfiles>
+
+ <CamcorderProfiles cameraId="3">
+
+ <EncoderProfile quality="1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+ <EncoderProfile quality="480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <ImageEncoding quality="90" />
+ <ImageEncoding quality="80" />
+ <ImageEncoding quality="70" />
+ <ImageDecoding memCap="20000000" />
+
+ </CamcorderProfiles>
+
+ <CamcorderProfiles cameraId="4">
+
+ <EncoderProfile quality="1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+ <EncoderProfile quality="480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <ImageEncoding quality="90" />
+ <ImageEncoding quality="80" />
+ <ImageEncoding quality="70" />
+ <ImageDecoding memCap="20000000" />
+
+ </CamcorderProfiles>
+
+ <CamcorderProfiles cameraId="5">
+
+ <EncoderProfile quality="2160p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="3840"
+ height="2160"
+ frameRate="60" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse2160p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="3840"
+ height="2160"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="highspeed1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="42000000"
+ width="1920"
+ height="1080"
+ frameRate="240" />
+
+ <!-- audio setting is ignored -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="48000"
+ channels="1" />
+ </EncoderProfile>
+
+ <ImageEncoding quality="90" />
+ <ImageEncoding quality="80" />
+ <ImageEncoding quality="70" />
+ <ImageDecoding memCap="20000000" />
+
+ </CamcorderProfiles>
+
+ <CamcorderProfiles cameraId="6">
+
+ <EncoderProfile quality="1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+ <EncoderProfile quality="480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="12000000"
+ width="1920"
+ height="1080"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="8000000"
+ width="1280"
+ height="720"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="60">
+ <Video codec="h264"
+ bitRate="3000000"
+ width="720"
+ height="480"
+ frameRate="30" />
+
+ <!-- Audio settings are not used for timealpse video recording -->
+ <Audio codec="aac"
+ bitRate="96000"
+ sampleRate="16000"
+ channels="1" />
+ </EncoderProfile>
+
+ <ImageEncoding quality="90" />
+ <ImageEncoding quality="80" />
+ <ImageEncoding quality="70" />
+ <ImageDecoding memCap="20000000" />
+
+ </CamcorderProfiles>
+
+
+
+ <EncoderOutputFileFormat name="3gp" />
+ <EncoderOutputFileFormat name="mp4" />
+
+ <!--
+ If a codec is not enabled, it is invisible to the applications
+ In other words, the applications won't be able to use the codec
+ or query the capabilities of the codec at all if it is disabled
+ -->
+
+ <!--
+ FIXME : we only check Mpeg4 encorder cap and other codec doesn't check
+ codec cap
+ -->
+ <VideoEncoderCap name="h264" enabled="true"
+ minBitRate="64000" maxBitRate="12000000"
+ minFrameWidth="128" maxFrameWidth="3840"
+ minFrameHeight="96" maxFrameHeight="2160"
+ minFrameRate="15" maxFrameRate="30" />
+
+ <VideoEncoderCap name="h263" enabled="true"
+ minBitRate="64000" maxBitRate="1000000"
+ minFrameWidth="128" maxFrameWidth="1920"
+ minFrameHeight="96" maxFrameHeight="1080"
+ minFrameRate="15" maxFrameRate="30" />
+
+ <VideoEncoderCap name="m4v" enabled="true"
+ minBitRate="64000" maxBitRate="2000000"
+ minFrameWidth="128" maxFrameWidth="1920"
+ minFrameHeight="96" maxFrameHeight="1080"
+ minFrameRate="15" maxFrameRate="30" />
+
+ <AudioEncoderCap name="aac" enabled="true"
+ minBitRate="758" maxBitRate="288000"
+ minSampleRate="8000" maxSampleRate="48000"
+ minChannels="1" maxChannels="1" />
+
+ <AudioEncoderCap name="heaac" enabled="true"
+ minBitRate="8000" maxBitRate="64000"
+ minSampleRate="16000" maxSampleRate="48000"
+ minChannels="1" maxChannels="1" />
+
+ <AudioEncoderCap name="aaceld" enabled="true"
+ minBitRate="16000" maxBitRate="192000"
+ minSampleRate="16000" maxSampleRate="48000"
+ minChannels="1" maxChannels="1" />
+
+ <AudioEncoderCap name="amrwb" enabled="true"
+ minBitRate="6600" maxBitRate="23050"
+ minSampleRate="16000" maxSampleRate="16000"
+ minChannels="1" maxChannels="1" />
+
+ <AudioEncoderCap name="amrnb" enabled="true"
+ minBitRate="5525" maxBitRate="12200"
+ minSampleRate="8000" maxSampleRate="8000"
+ minChannels="1" maxChannels="1" />
+
+ <!--
+ FIXME:
+ We do not check decoder capabilities at present
+ At present, we only check whether windows media is visible
+ for TEST applications. For other applications, we do
+ not perform any checks at all.
+ -->
+ <VideoDecoderCap name="wmv" enabled="false"/>
+ <AudioDecoderCap name="wma" enabled="false"/>
+</MediaSettings>
diff --git a/modem/user.mk b/modem/user.mk
new file mode 100644
index 00000000..fb01f2cc
--- /dev/null
+++ b/modem/user.mk
@@ -0,0 +1,4 @@
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+ PRODUCT_PACKAGES += dmd
+endif
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/modem/user
diff --git a/modem/userdebug.mk b/modem/userdebug.mk
new file mode 100644
index 00000000..4fcab646
--- /dev/null
+++ b/modem/userdebug.mk
@@ -0,0 +1,4 @@
+ifneq ($(BOARD_WITHOUT_RADIO),true)
+ PRODUCT_PACKAGES += vcd
+endif
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/modem/userdebug/
diff --git a/neuralnetwork/neuralnetwork.mk b/neuralnetwork/neuralnetwork.mk
new file mode 100644
index 00000000..1533d2a6
--- /dev/null
+++ b/neuralnetwork/neuralnetwork.mk
@@ -0,0 +1,2 @@
+PRODUCT_PACKAGES += android.hardware.neuralnetworks@1.3-service-armnn
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/neuralnetworks/
diff --git a/overlay-factory/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay-factory/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
new file mode 100644
index 00000000..3f3258f5
--- /dev/null
+++ b/overlay-factory/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Don't enable BT until user wants it -->
+ <bool name="def_bluetooth_on">false</bool>
+</resources>
+
diff --git a/overlay-factory/vendor/google/apps/PixelLogger/res/values/arrays.xml b/overlay-factory/vendor/google/apps/PixelLogger/res/values/arrays.xml
new file mode 100644
index 00000000..20a83653
--- /dev/null
+++ b/overlay-factory/vendor/google/apps/PixelLogger/res/values/arrays.xml
@@ -0,0 +1,7 @@
+<resources>
+ <string-array name="logger_entries">
+ <item>shannondm</item>
+ <item>cnss_diag</item>
+ <item>brcm_gps</item>
+ </string-array>
+</resources>
diff --git a/overlay-factory/vendor/google/apps/PixelLogger/res/values/config.xml b/overlay-factory/vendor/google/apps/PixelLogger/res/values/config.xml
new file mode 100644
index 00000000..ee2e1e81
--- /dev/null
+++ b/overlay-factory/vendor/google/apps/PixelLogger/res/values/config.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="config_logger_default_value" translatable="false">shannondm</string>
+ <string name="config_cfg_default_value" translatable="false">Built-in Mask #1</string>
+
+ <!-- default config file for cnss_diag logger -->
+ <string name="config_cfg_default_value_cnss_diag" translatable="false">cnss_diag.conf</string>
+ <!-- config file to enable brcm gps logger -->
+ <bool name="config_brcm_gps_enabled" translatable="false">true</bool>
+</resources>
diff --git a/overlay-factory/vendor/google/apps/PixelLogger/res/values/configmessages.xml b/overlay-factory/vendor/google/apps/PixelLogger/res/values/configmessages.xml
new file mode 100644
index 00000000..578cfc57
--- /dev/null
+++ b/overlay-factory/vendor/google/apps/PixelLogger/res/values/configmessages.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string-array name="config_message_no_message">
+ <item></item>
+ </string-array>
+ <string-array name="config_message_audio_warning">
+ <item>This will collect audio from your voice calls. Would you like to proceed?</item>
+ </string-array>
+ <string-array name="config_message_possible_audio_warning">
+ <item>This may collect audio from your voice calls. Would you like to proceed?</item>
+ <item>Pixel_Default.nprf</item>
+ <item>Built-in Mask #0</item>
+ <item>Built-in Mask #1</item>
+ <item>Built-in Mask #2</item>
+ <item>Built-in Mask #3</item>
+ </string-array>
+ <string name="config_privacy_warning_title">Privacy Warning</string>
+ <string name="default_config_selection_message">You are loading a user defined logging config. This may collect audio from your voice calls. Would you like to proceed?</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/ModemService/res/values/config.xml b/overlay-vendor/vendor/google/apps/ModemService/res/values/config.xml
new file mode 100644
index 00000000..7266f917
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/ModemService/res/values/config.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!-- Antenna tuning by USB status -->
+ <bool name="config_tuner_by_usb">false</bool>
+ <integer name="config_proximity_values_usb_connected">1</integer>
+ <integer name="config_proximity_values_usb_disconnected">0</integer>
+
+ <!-- SAR cutback -->
+ <integer name="config_sar_comp_key">0</integer>
+ <integer name="config_sar_state_default">3</integer>
+
+ <!-- SAR cutback by USB device -->
+ <bool name="config_sar_by_usb_device">false</bool>
+ <string-array name="config_sar_usb_devices">
+ <!--
+ <item>6353,20521,Google,USB-C to 3.5mm-Headphone Adapter</item>
+ -->
+ </string-array>
+ <integer name="config_sar_state_usb_connected">3</integer>
+ <integer name="config_sar_state_usb_device_matched">4</integer>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/PixelLogger/res/values/arrays.xml b/overlay-vendor/vendor/google/apps/PixelLogger/res/values/arrays.xml
new file mode 100644
index 00000000..79f0587f
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/PixelLogger/res/values/arrays.xml
@@ -0,0 +1,6 @@
+<resources>
+ <string-array name="logger_entries">
+ <item>qxdm</item>
+ <item>cnss_diag</item>
+ </string-array>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/PixelLogger/res/values/config.xml b/overlay-vendor/vendor/google/apps/PixelLogger/res/values/config.xml
new file mode 100644
index 00000000..80c0abe6
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/PixelLogger/res/values/config.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+<!-- default config file for cnss_diag logger -->
+ <string name="config_cfg_default_value_cnss_diag" translatable="false">cnss_diag.conf</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable-ldrtl/deferred_setup_closing_img.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable-ldrtl/deferred_setup_closing_img.xml
new file mode 100644
index 00000000..983fc647
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable-ldrtl/deferred_setup_closing_img.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="280dp"
+ android:height="280dp"
+ android:viewportWidth="228.0"
+ android:viewportHeight="228.0">
+ <path android:fillColor="#F7F8F9"
+ android:pathData="M114,114m-113,0a113,113 0,1 1,226 0a113,113 0,1 1,-226 0" />
+ <path android:fillColor="#78909C"
+ android:pathData="M204.11,178.51l-5.83,0.32l0.34,11.57c-0.71,0.18 -1.93,0.47 -2.13,0.65c-0.29,0.26 3.6,-0.02 3.6,-0.02l-0.09,-0.41l0.88,-9.58l1.91,9.19c-0.6,0.17 -2.17,0.51 -2.41,0.73c-0.29,0.26 3.6,-0.02 3.6,-0.02l0,-0.02l0.05,0L204.11,178.51z" />
+ <path android:fillColor="#A1887F"
+ android:pathData="M193.37,165.38c0,0 -0.45,-1.24 0,-1.35c0.45,-0.11 0.8,0.82 0.8,0.82L193.37,165.38z" />
+ <path android:fillColor="#A1887F"
+ android:pathData="M195.65,172.07c0,0 -0.9,-0.96 -0.53,-1.24s1.06,0.43 1.06,0.43L195.65,172.07z" />
+ <path android:fillColor="#F4B400"
+ android:pathData="M204.03,171.44c-0.76,-2.5 -3.63,-2.86 -3.63,-2.86l-4.58,-0.33l-1.65,-3.4l-1.19,0.79l1.35,3.49c0.23,0.6 0.76,1.02 1.39,1.12l3.69,0.55c-0.2,0.59 -0.39,1.26 -0.51,2c-0.04,0.26 -0.08,0.5 -0.11,0.74l-2.62,-2.27l-0.78,1.2l2.61,2.68c0.16,0.16 0.35,0.28 0.56,0.37c-0.12,1.16 -0.21,2.23 -0.39,3.45l6.29,0.44C204.47,179.4 204.79,173.93 204.03,171.44z" />
+ <path android:fillColor="#A1887F"
+ android:pathData="M200.78,168.91c0,0 0.54,-0.91 0.66,-1.36c0.12,-0.45 0.87,0.21 0.87,0.21s0.12,1.61 0,1.61S200.66,171.47 200.78,168.91z" />
+ <path android:fillColor="#8D6E63"
+ android:pathData="M202.28,167.73c-0.13,-0.11 -0.73,-0.58 -0.84,-0.18c-0.07,0.26 -0.28,0.68 -0.45,0.98C201.46,168.52 201.95,168.22 202.28,167.73z" />
+ <path android:fillColor="#A1887F"
+ android:pathData="M202.37,167.49c-0.45,0.79 -1.3,1.16 -1.91,0.82c0,0 -0.73,-1.26 -0.28,-2.05c0.45,-0.79 1.3,-1.16 1.91,-0.82C202.7,165.78 202.82,166.7 202.37,167.49z" />
+ <path android:fillColor="#231F20"
+ android:pathData="M200.52,165.78c0,0 -0.18,0.33 0.87,0.27c1.04,-0.06 0.82,1.05 0.82,1.05s-0.06,0.51 -0.02,0.68s0.54,-0.11 0.61,-1.05C202.87,165.79 201.93,164.53 200.52,165.78z" />
+ <path android:fillColor="#03A9F4"
+ android:pathData="M201.66,152.98c0,-4.92 -4,-8.91 -8.91,-8.91c-4.92,0 -8.91,3.99 -8.91,8.91c0,4.66 4.25,8.44 8.91,8.44l0,0v3.28C198.15,161.96 201.66,157.54 201.66,152.98z" />
+ <path android:fillColor="#EEEEEE"
+ android:pathData="M192.75,148.06c-1.55,0 -2.81,1.26 -2.81,2.81h1.41c0,-0.78 0.63,-1.41 1.41,-1.41c0.78,0 1.41,0.63 1.41,1.41c0,0.39 -0.16,0.74 -0.41,0.99l-0.87,0.89c-0.44,0.44 -0.87,1.09 -0.87,1.87h1.5c0,-0.43 0.32,-1.05 0.78,-1.5c0.27,-0.27 0.63,-0.67 0.63,-0.67c0.41,-0.4 0.66,-0.97 0.66,-1.58C195.56,149.32 194.3,148.06 192.75,148.06z" />
+ <path android:fillColor="#EEEEEE"
+ android:pathData="M192.75,156.5m-0.94,0a0.94,0.94 0,1 1,1.88 0a0.94,0.94 0,1 1,-1.88 0" />
+ <path android:fillColor="#E8EAED"
+ android:pathData="M147.87,200.12H79.03c-5.32,0 -9.64,-4.31 -9.64,-9.64V28.35c0,-5.32 4.31,-9.64 9.64,-9.64h68.84c5.32,0 9.64,4.31 9.64,9.64v162.14C157.51,195.81 153.19,200.12 147.87,200.12z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M147.87,19.85c4.69,0 8.5,3.81 8.5,8.5v162.14c0,4.69 -3.81,8.5 -8.5,8.5H79.03c-4.69,0 -8.5,-3.81 -8.5,-8.5V28.35c0,-4.69 3.81,-8.5 8.5,-8.5H147.87M147.87,18.71H79.03c-5.32,0 -9.64,4.31 -9.64,9.64v162.14c0,5.32 4.31,9.64 9.64,9.64h68.84c5.32,0 9.64,-4.31 9.64,-9.64V28.35C157.51,23.03 153.19,18.71 147.87,18.71L147.87,18.71z" />
+ <path android:fillColor="#FFFFFF"
+ android:pathData="M149.82,185.29H77.08c-1.68,0 -3.04,-1.36 -3.04,-3.04V36.58c0,-1.68 1.36,-3.04 3.04,-3.04h72.75c1.68,0 3.04,1.36 3.04,3.04v145.67C152.86,183.93 151.5,185.29 149.82,185.29z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M128.7,192.99H98.2c-0.46,0 -0.83,-0.37 -0.83,-0.83v-0.06c0,-0.46 0.37,-0.83 0.83,-0.83h30.5c0.46,0 0.83,0.37 0.83,0.83v0.06C129.53,192.62 129.16,192.99 128.7,192.99z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M128.7,27.55H98.2c-0.46,0 -0.83,-0.37 -0.83,-0.83v-0.06c0,-0.46 0.37,-0.83 0.83,-0.83h30.5c0.46,0 0.83,0.37 0.83,0.83v0.06C129.53,27.18 129.16,27.55 128.7,27.55z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M157.85,73.95h-0.35V62.33h0.35c0.42,0 0.75,0.34 0.75,0.75V73.2C158.61,73.61 158.27,73.95 157.85,73.95z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M157.55,110.43h-0.04V87.5h0.04c0.58,0 1.06,0.47 1.06,1.06v20.82C158.61,109.96 158.13,110.43 157.55,110.43z" />
+ <path android:fillColor="#2196F3"
+ android:pathData="M117.61,54.05c0.03,-0.21 0.04,-0.41 0.04,-0.63c0,-0.22 -0.02,-0.42 -0.04,-0.63l1.36,-1.06c0.12,-0.1 0.15,-0.27 0.08,-0.41l-1.28,-2.22c-0.08,-0.14 -0.25,-0.19 -0.39,-0.14l-1.6,0.64c-0.33,-0.26 -0.69,-0.47 -1.09,-0.63l-0.24,-1.7c-0.02,-0.15 -0.15,-0.27 -0.31,-0.27h-2.57c-0.16,0 -0.3,0.12 -0.31,0.27l-0.24,1.7c-0.39,0.16 -0.75,0.38 -1.09,0.63l-1.6,-0.64c-0.15,-0.06 -0.31,0 -0.39,0.14l-1.28,2.22c-0.08,0.14 -0.04,0.31 0.08,0.41l1.36,1.06c-0.03,0.21 -0.04,0.42 -0.04,0.63c0,0.21 0.02,0.42 0.04,0.63l-1.36,1.06c-0.12,0.1 -0.15,0.27 -0.08,0.41l1.28,2.22c0.08,0.14 0.25,0.19 0.39,0.14l1.6,-0.64c0.33,0.26 0.69,0.47 1.09,0.63l0.24,1.7c0.02,0.15 0.15,0.27 0.31,0.27h2.57c0.16,0 0.3,-0.12 0.31,-0.27l0.24,-1.7c0.39,-0.16 0.75,-0.38 1.09,-0.63l1.6,0.64c0.15,0.06 0.31,0 0.39,-0.14l1.28,-2.22c0.08,-0.14 0.04,-0.31 -0.08,-0.41L117.61,54.05zM112.83,55.67c-1.24,0 -2.25,-1.01 -2.25,-2.25c0,-1.24 1.01,-2.25 2.25,-2.25s2.25,1.01 2.25,2.25C115.08,54.66 114.07,55.67 112.83,55.67z" />
+ <path android:fillColor="#BDBDBD"
+ android:pathData="M29.76,167.09c0.02,0 0.04,0 0.04,0c0.03,0 -0.52,-0.32 -0.88,-0.53c4.08,-5.52 0.33,-13.14 0.33,-13.14l-0.5,0.6l0.2,-0.56l-1.25,-0.93l-2.17,1.38c0,0 0.85,9.51 -0.93,11.3c-0.11,0.02 -0.24,0.05 -0.38,0.08c-0.3,0.07 -0.53,0.32 -0.57,0.62l-0.26,1.74c0.02,0.02 0.03,0.05 0.05,0.06c0.14,0.02 0.31,-0.37 0.41,-0.89c0,0.02 0,0.03 0,0.03c-0.01,0.04 1.12,-0.92 1.35,-1.2c0,0 2.86,-4.5 2.99,-8.09c0.46,0.66 0.85,1.67 0.84,3.19c-0.02,3.13 -0.77,4.55 -1,4.9c-0.01,0 -0.02,-0.01 -0.03,-0.01c-0.18,0.08 0,0.84 0.4,1.78h2.26c0.02,-0.02 0.05,-0.04 0.05,-0.06C30.7,167.23 30.29,167.11 29.76,167.09zM23.92,166.2c0,-0.01 0,-0.03 0,-0.04l0,0C23.93,166.17 23.93,166.18 23.92,166.2zM29.09,167.1L29.09,167.1c0.01,0 0.03,0 0.04,0C29.12,167.1 29.11,167.1 29.09,167.1z" />
+ <path android:fillColor="#FFE1BD"
+ android:pathData="M28.64,150.06c0.99,1.9 2.51,3.87 4.53,4.7c0.42,0.17 0.6,-0.51 0.19,-0.68c-1.84,-0.75 -3.22,-2.66 -4.11,-4.38C29.04,149.31 28.43,149.66 28.64,150.06L28.64,150.06z" />
+ <path android:fillColor="#FFE1BD"
+ android:pathData="M29.08,145.76c-0.3,-0.84 -1.06,-1.34 -1.71,-1.12c-0.64,0.23 -0.92,1.1 -0.62,1.94c0.06,0.17 0.15,0.33 0.24,0.47c-0.08,0.44 -0.33,1.82 -0.26,1.82c0.08,0 1.29,0.53 1.09,-0.28c-0.1,-0.42 -0.08,-0.71 -0.04,-0.91c0.22,0.07 0.45,0.09 0.67,0.01C28.46,147.7 29.38,146.6 29.08,145.76z" />
+ <path android:fillColor="#DB4437"
+ android:pathData="M29.58,153.9c0,0 -0.99,-1.93 -1.19,-2.48c-0.12,-0.31 0.02,-0.69 0.17,-0.95l0.16,0.2c0,0 1.02,-0.92 0.69,-1.32c-0.33,-0.4 -1.56,-0.62 -1.56,-0.62l-0.02,0.14c-0.18,0.26 -1.44,-0.02 -1.44,-0.02c-0.79,0.13 -0.84,2.64 -0.73,2.94s-0.36,2.85 -0.43,2.88C25.15,154.7 29.58,153.9 29.58,153.9z" />
+ <path android:fillColor="#1565C0"
+ android:pathData="M36.91,156.12c0.09,-0.14 0.18,-0.29 0.25,-0.45c0.08,-0.16 0.13,-0.32 0.19,-0.48l1.38,-0.31c0.12,-0.03 0.21,-0.15 0.2,-0.28l-0.17,-2.1c-0.01,-0.13 -0.12,-0.23 -0.24,-0.24l-1.41,-0.09c-0.16,-0.31 -0.35,-0.59 -0.58,-0.85l0.42,-1.35c0.04,-0.12 -0.02,-0.25 -0.14,-0.31l-1.91,-0.9c-0.12,-0.06 -0.26,-0.02 -0.33,0.09l-0.78,1.18c-0.35,-0.02 -0.69,0.02 -1.03,0.08l-0.96,-1.04c-0.09,-0.09 -0.23,-0.11 -0.34,-0.03l-1.74,1.2c-0.11,0.08 -0.14,0.22 -0.09,0.33l0.63,1.26c-0.09,0.14 -0.18,0.29 -0.25,0.45c-0.07,0.16 -0.13,0.32 -0.19,0.48l-1.38,0.31c-0.12,0.03 -0.21,0.15 -0.2,0.28l0.17,2.1c0.01,0.13 0.12,0.23 0.24,0.24l1.41,0.09c0.16,0.31 0.35,0.59 0.58,0.85l-0.42,1.35c-0.04,0.12 0.02,0.25 0.14,0.31l1.91,0.9c0.12,0.06 0.26,0.02 0.33,-0.09l0.78,-1.18c0.35,0.02 0.69,-0.02 1.03,-0.08l0.96,1.04c0.09,0.09 0.23,0.11 0.34,0.03l1.74,-1.2c0.11,-0.08 0.14,-0.22 0.09,-0.33L36.91,156.12zM32.8,155.64c-0.92,-0.44 -1.31,-1.54 -0.88,-2.46c0.44,-0.92 1.54,-1.31 2.46,-0.88c0.92,0.44 1.31,1.54 0.88,2.46C34.82,155.68 33.72,156.08 32.8,155.64z" />
+ <path android:fillColor="#FFE1BD"
+ android:pathData="M25.35,150.61c0.36,1.86 1.15,3.95 2.65,5.17c0.35,0.28 0.85,-0.21 0.5,-0.5c-1.41,-1.15 -2.13,-3.11 -2.47,-4.86C25.95,149.98 25.27,150.17 25.35,150.61L25.35,150.61z" />
+ <path android:fillColor="#DB4437"
+ android:pathData="M25.14,150.83l1.45,-0.37l-0.36,-1.6C26.23,148.86 24.71,149.21 25.14,150.83z" />
+ <path android:fillColor="#263238"
+ android:pathData="M27.61,144.32c-0.41,0.17 -0.7,0.43 -0.79,0.51c-0.48,-0.08 -0.32,0.48 -1.52,2.25c-1.53,2.26 0.17,3.89 0.27,3.13c0.1,-0.76 1.41,-1.02 1.73,-2.46c0.26,-1.14 0.1,-2.73 0.47,-2.49l-0.09,-0.06l0.02,0.01c0,0 0.41,-0.46 0.88,-0.15C29.05,145.36 28.1,144.12 27.61,144.32z" />
+ <path android:fillColor="#8D6E63"
+ android:pathData="M168.92,195.59m-0.74,0a0.74,0.74 0,1 1,1.48 0a0.74,0.74 0,1 1,-1.48 0" />
+ <path android:fillColor="#FFCCBC"
+ android:pathData="M162.78,205.28c0,0 -1.22,0.5 -1.38,0.07c-0.15,-0.43 1.08,-0.91 1.08,-0.91L162.78,205.28z" />
+ <path android:fillColor="#0F9D58"
+ android:pathData="M166.17,199.51L166.17,199.51c-0.52,0.49 -0.83,1.17 -0.85,1.89l-0.03,1.15l-2.8,1.89l0.38,1.08l3.99,-1.24l1.37,-3.64L166.17,199.51z" />
+ <path android:fillColor="#FFCCBC"
+ android:pathData="M166.78,198a1.54,1.17 114.37,1 0,1.27 -2.81a1.54,1.17 114.37,1 0,-1.27 2.81z" />
+ <path android:fillColor="#FFCCBC"
+ android:pathData="M168.12,197.58c-0.03,-0.08 -0.4,0.96 -0.09,1.42c0.31,0.46 -1.15,-0.07 -1.15,-0.07s0.31,-0.97 0.15,-1.27C166.87,197.37 168.12,197.58 168.12,197.58z" />
+ <path android:fillColor="#8D6E63"
+ android:pathData="M167,195.29c0,0 0.8,-0.64 1.42,-0.06s0.81,2.02 -0.3,2.43c0,0 0.14,-0.9 0,-1.27S166.43,195.59 167,195.29z" />
+ <path android:fillColor="#BDBDBD"
+ android:pathData="M172.08,218.74l-2.1,-5.75l-0.6,-7.8l-2.29,-0.13l-1.15,-1.1c-3.18,5.85 -1.47,11.7 -0.77,13.58c-0.26,0.06 -0.92,0.24 -1.39,0.44c-0.38,0.16 -0.55,0.36 -0.55,0.36s3.04,0.03 3.6,-0.36l-0.66,-5.28c0.33,-1.03 0.61,-2.08 0.84,-3.03c0.22,1.18 0.44,2.29 0.75,3.21c0.94,2.84 1.96,4.68 2.51,5.56c-0.59,0.28 -1.36,0.67 -1.32,0.67c0.07,0 1.61,0.12 1.66,0.05c0.03,-0.04 0.41,-0.17 0.78,-0.27L172.08,218.74z" />
+ <path android:fillColor="#9AA0A6"
+ android:pathData="M159.53,197.06c-2.25,0.64 -3.54,2.98 -2.9,5.23c0.64,2.25 2.98,3.54 5.23,2.9s3.54,-2.98 2.9,-5.23C164.12,197.71 161.78,196.41 159.53,197.06zM159.88,198.28c0.67,-0.19 1.38,0.2 1.57,0.87c0.19,0.67 -0.2,1.38 -0.87,1.57c-0.67,0.19 -1.38,-0.2 -1.57,-0.87C158.82,199.17 159.21,198.47 159.88,198.28zM161.53,204.05c-1.02,0.29 -2.06,0.03 -2.81,-0.61c-0.22,-0.81 1.27,-1.72 2.08,-1.95c0.81,-0.23 2.55,-0.25 2.8,0.55C163.3,202.98 162.55,203.76 161.53,204.05z" />
+ <path android:fillColor="#FFCCBC"
+ android:pathData="M163.22,204.25c0,0 -1.29,-0.27 -1.17,-0.71c0.12,-0.44 1.41,-0.11 1.41,-0.11L163.22,204.25z" />
+ <path android:fillColor="#0F9D58"
+ android:pathData="M169.51,203.19c0.23,-1.42 0.92,-1.91 -0.51,-3.75l0,0l-0.48,-0.28c-0.13,-0.08 -0.28,-0.13 -0.44,-0.15l-0.79,-0.11c-0.51,-0.07 -0.99,0.23 -1.15,0.72c-0.26,0.76 -0.58,1.95 -0.63,3.12c-0.01,0.19 -0.03,0.38 -0.05,0.57l-1.98,0.11l-0.48,1.3l2.14,0.1c-0.18,0.65 -0.35,1.22 -0.38,1.61l4.98,0.76l-0.34,-3.63C169.44,203.44 169.49,203.32 169.51,203.19z" />
+ <path android:fillColor="#E7E9EC"
+ android:pathData="M127.22,77.77H84.45c-1.27,0 -2.31,-1.04 -2.31,-2.31V75.3c0,-1.27 1.04,-2.31 2.31,-2.31h42.77c1.27,0 2.31,1.04 2.31,2.31v0.16C129.53,76.73 128.49,77.77 127.22,77.77z" />
+ <path android:fillColor="#E7E9EC"
+ android:pathData="M127.22,115.23H84.45c-1.27,0 -2.31,-1.04 -2.31,-2.31v-0.16c0,-1.27 1.04,-2.31 2.31,-2.31h42.77c1.27,0 2.31,1.04 2.31,2.31v0.16C129.53,114.19 128.49,115.23 127.22,115.23z" />
+ <path android:fillColor="#E7E9EC"
+ android:pathData="M127.22,96.5H84.45c-1.27,0 -2.31,-1.04 -2.31,-2.31v-0.16c0,-1.27 1.04,-2.31 2.31,-2.31h42.77c1.27,0 2.31,1.04 2.31,2.31v0.16C129.53,95.46 128.49,96.5 127.22,96.5z" />
+ <path android:fillColor="#E7E9EC"
+ android:pathData="M127.22,133.96H84.45c-1.27,0 -2.31,-1.04 -2.31,-2.31v-0.16c0,-1.27 1.04,-2.31 2.31,-2.31h42.77c1.27,0 2.31,1.04 2.31,2.31v0.16C129.53,132.92 128.49,133.96 127.22,133.96z" />
+ <path android:fillColor="#999FA5"
+ android:pathData="M127.22,152.7H84.45c-1.27,0 -2.31,-1.04 -2.31,-2.31v-0.16c0,-1.27 1.04,-2.31 2.31,-2.31h42.77c1.27,0 2.31,1.04 2.31,2.31v0.16C129.53,151.66 128.49,152.7 127.22,152.7z" />
+ <path android:fillColor="#E7E9EC"
+ android:pathData="M137.67,75.38m-4.54,0a4.54,4.54 0,1 1,9.08 0a4.54,4.54 0,1 1,-9.08 0" />
+ <path android:fillColor="#E7E9EC"
+ android:pathData="M137.67,112.84m-4.54,0a4.54,4.54 0,1 1,9.08 0a4.54,4.54 0,1 1,-9.08 0" />
+ <path android:fillColor="#E7E9EC"
+ android:pathData="M137.67,131.57m-4.54,0a4.54,4.54 0,1 1,9.08 0a4.54,4.54 0,1 1,-9.08 0" />
+ <path android:fillColor="#E7E9EC"
+ android:pathData="M137.67,94.11m-4.54,0a4.54,4.54 0,1 1,9.08 0a4.54,4.54 0,1 1,-9.08 0" />
+ <path android:fillColor="#F4B400"
+ android:pathData="M137.67,145.31c-2.76,0 -5,2.24 -5,5c0,2.76 2.24,5 5,5c2.76,0 5,-2.24 5,-5C142.67,147.55 140.43,145.31 137.67,145.31zM137.67,153.71c-0.36,0 -0.65,-0.29 -0.65,-0.65s0.29,-0.65 0.65,-0.65s0.65,0.29 0.65,0.65S138.03,153.71 137.67,153.71zM138.21,151.4c-0.04,0.26 -0.29,0.44 -0.57,0.4c-0.28,-0.04 -0.47,-0.33 -0.41,-0.62c0.26,-1.3 1.33,-1.42 1.43,-2.25c0.06,-0.48 -0.21,-0.93 -0.67,-1.08c-0.52,-0.17 -1.1,0.08 -1.28,0.68c-0.06,0.23 -0.26,0.37 -0.49,0.37c-0.33,0 -0.56,-0.31 -0.48,-0.63c0.32,-1.12 1.46,-1.69 2.53,-1.37c0.85,0.25 1.42,1.08 1.39,1.97C139.63,150.09 138.42,150.18 138.21,151.4z" />
+</vector>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable-nodpi/placeholder.png b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable-nodpi/placeholder.png
new file mode 100644
index 00000000..ec4f14d1
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable-nodpi/placeholder.png
Binary files differ
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/deferred_setup_closing_img.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/deferred_setup_closing_img.xml
new file mode 100644
index 00000000..284de8ae
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/deferred_setup_closing_img.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<!-- exit image for deferred setup.
+ (go/android-suw-assets-deferred-closing-img) -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="280dp"
+ android:height="280dp"
+ android:viewportHeight="228.0"
+ android:viewportWidth="228.0">
+ <path android:fillColor="#f7f8f9"
+ android:pathData="M114,114m-113,0a113,113 0,1 1,226 0a113,113 0,1 1,-226 0" />
+ <path android:fillColor="#78909c"
+ android:pathData="M204.11,178.51l-5.83,0.32 0.34,11.57a10.64,10.64 0,0 0,-2.13 0.65c-0.29,0.26 3.6,0 3.6,0l-0.09,-0.41 0.88,-9.58 1.91,9.19a14,14 0,0 0,-2.41 0.73c-0.29,0.26 3.6,0 3.6,0v0h0Z" />
+ <path android:fillColor="#a1887f"
+ android:pathData="M193.37,165.38s-0.45,-1.24 0,-1.35 0.8,0.82 0.8,0.82Z" />
+ <path android:fillColor="#a1887f"
+ android:pathData="M195.65,172.07s-0.9,-1 -0.53,-1.24 1.06,0.43 1.06,0.43Z" />
+ <path android:fillColor="#f4b400"
+ android:pathData="M204,171.44c-0.76,-2.5 -3.63,-2.86 -3.63,-2.86l-4.58,-0.33 -1.65,-3.4 -1.19,0.79 1.35,3.49a1.77,1.77 0,0 0,1.39 1.12l3.69,0.55a12.16,12.16 0,0 0,-0.51 2c0,0.26 -0.08,0.5 -0.11,0.74l-2.62,-2.27 -0.78,1.2 2.61,2.68a1.75,1.75 0,0 0,0.56 0.37c-0.12,1.16 -0.21,2.23 -0.39,3.45l6.29,0.44S204.79,173.93 204,171.44Z" />
+ <path android:fillColor="#a1887f"
+ android:pathData="M200.78,168.91a8.38,8.38 0,0 0,0.66 -1.36c0.12,-0.45 0.87,0.21 0.87,0.21a7,7 0,0 1,0 1.61C202.19,169.37 200.66,171.47 200.78,168.91Z" />
+ <path android:fillColor="#8d6e63"
+ android:pathData="M202.28,167.73c-0.13,-0.11 -0.73,-0.58 -0.84,-0.18a5.72,5.72 0,0 1,-0.45 1A1.68,1.68 0,0 0,202.28 167.73Z" />
+ <path android:fillColor="#a1887f"
+ android:pathData="M202.37,167.49a1.49,1.49 0,0 1,-1.91 0.82,2.54 2.54,0 0,1 -0.28,-2.05A1.3,1.3 0,1 1,202.37 167.49Z" />
+ <path android:fillColor="#231f20"
+ android:pathData="M200.52,165.78s-0.18,0.33 0.87,0.27a0.8,0.8 0,0 1,0.82 1.05,3.21 3.21,0 0,0 0,0.68c0,0.18 0.54,-0.11 0.61,-1.05S201.93,164.53 200.52,165.78Z" />
+ <path android:fillColor="#03a9f4"
+ android:pathData="M201.66,153a8.91,8.91 0,0 0,-17.82 0c0,4.66 4.25,8.44 8.91,8.44h0v3.28C198.15,162 201.66,157.54 201.66,153Z" />
+ <path android:fillColor="#eee"
+ android:pathData="M192.75,148.06a2.82,2.82 0,0 0,-2.81 2.81h1.41a1.41,1.41 0,1 1,2.4 1l-0.87,0.89a2.72,2.72 0,0 0,-0.87 1.87h1.5a2.49,2.49 0,0 1,0.78 -1.5c0.27,-0.27 0.63,-0.67 0.63,-0.67a2.22,2.22 0,0 0,0.66 -1.58A2.82,2.82 0,0 0,192.75 148.06Z" />
+ <path android:fillColor="#eee"
+ android:pathData="M192.75,156.5m-0.94,0a0.94,0.94 0,1 1,1.88 0a0.94,0.94 0,1 1,-1.88 0" />
+ <path android:fillColor="#e8eaed"
+ android:pathData="M79.03,18.71L147.86,18.71A9.64,9.64 0,0 1,157.5 28.35L157.5,190.48A9.64,9.64 0,0 1,147.86 200.12L79.03,200.12A9.64,9.64 0,0 1,69.39 190.48L69.39,28.35A9.64,9.64 0,0 1,79.03 18.71z" />
+ <path android:fillColor="#bdc1c6"
+ android:pathData="M147.87,19.85a8.51,8.51 0,0 1,8.5 8.5V190.49a8.51,8.51 0,0 1,-8.5 8.5H79a8.51,8.51 0,0 1,-8.5 -8.5V28.35a8.51,8.51 0,0 1,8.5 -8.5h68.84m0,-1.14H79a9.64,9.64 0,0 0,-9.64 9.64V190.49A9.64,9.64 0,0 0,79 200.12h68.84a9.64,9.64 0,0 0,9.64 -9.64V28.35a9.64,9.64 0,0 0,-9.64 -9.64h0Z" />
+ <path android:fillColor="#fff"
+ android:pathData="M77.08,33.54L149.83,33.54A3.04,3.04 0,0 1,152.87 36.58L152.87,182.25A3.04,3.04 0,0 1,149.83 185.29L77.08,185.29A3.04,3.04 0,0 1,74.04 182.25L74.04,36.58A3.04,3.04 0,0 1,77.08 33.54z" />
+ <path android:fillColor="#bdc1c6"
+ android:pathData="M98.2,191.29L128.69,191.29A0.83,0.83 0,0 1,129.52 192.12L129.52,192.17A0.83,0.83 0,0 1,128.69 193L98.2,193A0.83,0.83 0,0 1,97.37 192.17L97.37,192.12A0.83,0.83 0,0 1,98.2 191.29z" />
+ <path android:fillColor="#bdc1c6"
+ android:pathData="M98.2,25.84L128.69,25.84A0.83,0.83 0,0 1,129.52 26.67L129.52,26.72A0.83,0.83 0,0 1,128.69 27.55L98.2,27.55A0.83,0.83 0,0 1,97.37 26.72L97.37,26.67A0.83,0.83 0,0 1,98.2 25.84z" />
+ <path android:fillColor="#bdc1c6"
+ android:pathData="M157.51,62.33h0.35a0.75,0.75 0,0 1,0.75 0.75V73.2a0.75,0.75 0,0 1,-0.75 0.75h-0.35a0,0 0,0 1,0 0V62.33a0,0 0,0 1,0 0Z" />
+ <path android:fillColor="#bdc1c6"
+ android:pathData="M157.51,87.5h0a1.06,1.06 0,0 1,1.06 1.06v20.82a1.06,1.06 0,0 1,-1.06 1.06h0a0,0 0,0 1,0 0V87.5A0,0 0,0 1,157.51 87.5Z" />
+ <path android:fillColor="#2196f3"
+ android:pathData="M117.61,54.05a4.43,4.43 0,0 0,0 -1.26L119,51.73a0.32,0.32 0,0 0,0.08 -0.41l-1.28,-2.22a0.32,0.32 0,0 0,-0.39 -0.14l-1.6,0.64a4.69,4.69 0,0 0,-1.09 -0.63l-0.24,-1.7a0.31,0.31 0,0 0,-0.31 -0.27h-2.57a0.31,0.31 0,0 0,-0.31 0.27L111,49a4.94,4.94 0,0 0,-1.09 0.63L108.3,49a0.31,0.31 0,0 0,-0.39 0.14l-1.28,2.22a0.32,0.32 0,0 0,0.08 0.41l1.36,1.06a4.43,4.43 0,0 0,0 1.26l-1.36,1.06a0.32,0.32 0,0 0,-0.08 0.41l1.28,2.22a0.32,0.32 0,0 0,0.39 0.14l1.6,-0.64a4.69,4.69 0,0 0,1.09 0.63l0.24,1.7a0.31,0.31 0,0 0,0.31 0.27h2.57a0.31,0.31 0,0 0,0.31 -0.27l0.24,-1.7a4.94,4.94 0,0 0,1.09 -0.63l1.6,0.64a0.31,0.31 0,0 0,0.39 -0.14L119,55.52a0.32,0.32 0,0 0,-0.08 -0.41ZM112.84,55.67a2.25,2.25 0,1 1,2.25 -2.25A2.25,2.25 0,0 1,112.83 55.67Z" />
+ <path android:fillColor="#e7e9ec"
+ android:pathData="M86.92,75.72m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" />
+ <path android:fillColor="#e7e9ec"
+ android:pathData="M97.28,73.35L139.67,73.35A2.29,2.29 0,0 1,141.96 75.64L141.96,75.8A2.29,2.29 0,0 1,139.67 78.09L97.28,78.09A2.29,2.29 0,0 1,94.99 75.8L94.99,75.64A2.29,2.29 0,0 1,97.28 73.35z" />
+ <path android:fillColor="#e7e9ec"
+ android:pathData="M86.92,112.85m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" />
+ <path android:fillColor="#e7e9ec"
+ android:pathData="M86.92,131.42m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" />
+ <path android:fillColor="#e7e9ec"
+ android:pathData="M97.28,110.48L139.67,110.48A2.29,2.29 0,0 1,141.96 112.77L141.96,112.93A2.29,2.29 0,0 1,139.67 115.22L97.28,115.22A2.29,2.29 0,0 1,94.99 112.93L94.99,112.77A2.29,2.29 0,0 1,97.28 110.48z" />
+ <path android:fillColor="#e7e9ec"
+ android:pathData="M86.92,94.28m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" />
+ <path android:fillColor="#e7e9ec"
+ android:pathData="M97.28,91.92L139.67,91.92A2.29,2.29 0,0 1,141.96 94.21L141.96,94.37A2.29,2.29 0,0 1,139.67 96.66L97.28,96.66A2.29,2.29 0,0 1,94.99 94.37L94.99,94.21A2.29,2.29 0,0 1,97.28 91.92z" />
+ <path android:fillColor="#e7e9ec"
+ android:pathData="M97.28,129.05L139.67,129.05A2.29,2.29 0,0 1,141.96 131.34L141.96,131.5A2.29,2.29 0,0 1,139.67 133.79L97.28,133.79A2.29,2.29 0,0 1,94.99 131.5L94.99,131.34A2.29,2.29 0,0 1,97.28 129.05z" />
+ <path android:fillColor="#999fa5"
+ android:pathData="M97.28,147.62L139.67,147.62A2.29,2.29 0,0 1,141.96 149.91L141.96,150.07A2.29,2.29 0,0 1,139.67 152.36L97.28,152.36A2.29,2.29 0,0 1,94.99 150.07L94.99,149.91A2.29,2.29 0,0 1,97.28 147.62z" />
+ <path android:fillColor="#f4b400"
+ android:pathData="M86.92,145a5,5 0,1 0,5 5A5,5 0,0 0,86.92 145ZM86.92,153.33a0.64,0.64 0,1 1,0.64 -0.64A0.64,0.64 0,0 1,86.92 153.36ZM87.45,151.04a0.49,0.49 0,0 1,-0.56 0.39,0.51 0.51,0 0,1 -0.41,-0.61c0.26,-1.29 1.32,-1.41 1.42,-2.23a1,1 0,0 0,-0.66 -1.08,1 1,0 0,0 -1.26,0.68 0.5,0.5 0,1 1,-1 -0.26,2 2,0 0,1 3.88,0.6C88.86,149.78 87.66,149.86 87.45,151.07Z" />
+ <path android:fillColor="#bdbdbd"
+ android:pathData="M29.76,167.09h0s-0.52,-0.32 -0.88,-0.53c4.08,-5.52 0.33,-13.14 0.33,-13.14l-0.5,0.6 0.2,-0.56 -1.25,-0.93 -2.17,1.38s0.85,9.51 -0.93,11.3l-0.38,0.08a0.76,0.76 0,0 0,-0.57 0.62l-0.26,1.74a0.14,0.14 0,0 0,0.05 0.06,1.14 1.14,0 0,0 0.41,-0.89v0a12.14,12.14 0,0 0,1.35 -1.2s2.86,-4.5 3,-8.09a5.36,5.36 0,0 1,0.84 3.19c0,3.13 -0.77,4.55 -1,4.9h0c-0.18,0.08 0,0.84 0.4,1.78h2.26a0.14,0.14 0,0 0,0 -0.06A1.14,1.14 0,0 0,29.76 167.09ZM23.93,166.2v0h0v0ZM29.1,167.1h0Z" />
+ <path android:fillColor="#ffe1bd"
+ android:pathData="M28.64,150.06a9.82,9.82 0,0 0,4.53 4.7c0.42,0.17 0.6,-0.51 0.19,-0.68 -1.84,-0.75 -3.22,-2.66 -4.11,-4.38a0.35,0.35 0,0 0,-0.61 0.35h0Z" />
+ <path android:fillColor="#ffe1bd"
+ android:pathData="M29.08,145.76a1.47,1.47 0,0 0,-1.71 -1.12,1.47 1.47,0 0,0 -0.62,1.94 2.06,2.06 0,0 0,0.24 0.47,12.38 12.38,0 0,0 -0.26,1.82c0.08,0 1.29,0.53 1.09,-0.28a2,2 0,0 1,0 -0.91,1 1,0 0,0 0.67,0A2.49,2.49 0,0 0,29.08 145.76Z" />
+ <path android:fillColor="#db4437"
+ android:pathData="M29.58,153.9s-1,-1.93 -1.19,-2.48a1.23,1.23 0,0 1,0.17 -1l0.16,0.2s1,-0.92 0.69,-1.32a3.62,3.62 0,0 0,-1.56 -0.62l0,0.14a2.62,2.62 0,0 1,-1.44 0c-0.79,0.13 -0.84,2.64 -0.73,2.94a12.58,12.58 0,0 1,-0.43 2.88C25.15,154.7 29.58,153.9 29.58,153.9Z" />
+ <path android:fillColor="#1565c0"
+ android:pathData="M36.91,156.12a3.64,3.64 0,0 0,0.44 -0.93l1.38,-0.31a0.27,0.27 0,0 0,0.2 -0.28l-0.17,-2.1a0.27,0.27 0,0 0,-0.24 -0.24l-1.41,-0.09a3.85,3.85 0,0 0,-0.58 -0.85L36.95,150a0.26,0.26 0,0 0,-0.14 -0.31l-1.91,-0.9a0.26,0.26 0,0 0,-0.33 0.09L33.79,150a4.05,4.05 0,0 0,-1 0.08l-1,-1a0.26,0.26 0,0 0,-0.34 0l-1.74,1.2a0.26,0.26 0,0 0,-0.09 0.33l0.63,1.26a3.64,3.64 0,0 0,-0.44 0.93l-1.38,0.31a0.27,0.27 0,0 0,-0.2 0.28l0.17,2.1a0.27,0.27 0,0 0,0.24 0.24l1.41,0.09a3.85,3.85 0,0 0,0.58 0.85L30.24,158a0.26,0.26 0,0 0,0.14 0.31l1.91,0.9a0.26,0.26 0,0 0,0.33 -0.09l0.78,-1.18a4.05,4.05 0,0 0,1 -0.08l1,1a0.26,0.26 0,0 0,0.34 0l1.74,-1.2a0.27,0.27 0,0 0,0.09 -0.33ZM32.8,155.64a1.85,1.85 0,1 1,2.46 -0.88A1.85,1.85 0,0 1,32.8 155.64Z" />
+ <path android:fillColor="#ffe1bd"
+ android:pathData="M25.35,150.61A8.85,8.85 0,0 0,28 155.78c0.35,0.28 0.85,-0.21 0.5,-0.5A8.26,8.26 0,0 1,26 150.43c-0.09,-0.44 -0.76,-0.26 -0.68,0.19h0Z" />
+ <path android:fillColor="#db4437"
+ android:pathData="M25.14,150.83l1.45,-0.37 -0.36,-1.6A1.52,1.52 0,0 0,25.14 150.83Z" />
+ <path android:fillColor="#263238"
+ android:pathData="M27.61,144.32a2.56,2.56 0,0 0,-0.79 0.51c-0.48,-0.08 -0.32,0.48 -1.52,2.25 -1.53,2.26 0.17,3.89 0.27,3.13s1.41,-1 1.73,-2.46c0.26,-1.14 0.1,-2.73 0.47,-2.49l-0.09,-0.06h0a0.7,0.7 0,0 1,0.88 -0.15C29.05,145.36 28.1,144.12 27.61,144.32Z" />
+ <path android:fillColor="#8d6e63"
+ android:pathData="M168.92,195.59m-0.74,0a0.74,0.74 0,1 1,1.48 0a0.74,0.74 0,1 1,-1.48 0" />
+ <path android:fillColor="#ffccbc"
+ android:pathData="M162.78,205.28s-1.22,0.5 -1.38,0.07 1.08,-0.91 1.08,-0.91Z" />
+ <path android:fillColor="#0f9d58"
+ android:pathData="M166.17,199.51h0a2.7,2.7 0,0 0,-0.85 1.89l0,1.15 -2.8,1.89 0.38,1.08 4,-1.24 1.37,-3.64Z" />
+ <path android:fillColor="#ffccbc"
+ android:pathData="M166.78,198.01a1.54,1.17 114.37,1 0,1.27 -2.81a1.54,1.17 114.37,1 0,-1.27 2.81z" />
+ <path android:fillColor="#ffccbc"
+ android:pathData="M168.12,197.58A1.76,1.76 0,0 0,168 199c0.31,0.46 -1.15,-0.07 -1.15,-0.07a2.85,2.85 0,0 0,0.15 -1.27C166.87,197.37 168.12,197.58 168.12,197.58Z" />
+ <path android:fillColor="#8d6e63"
+ android:pathData="M167,195.29a1.14,1.14 0,0 1,1.42 -0.06,1.48 1.48,0 0,1 -0.3,2.43 3.63,3.63 0,0 0,0 -1.27C168,196 166.43,195.59 167,195.29Z" />
+ <path android:fillColor="#bdbdbd"
+ android:pathData="M172.08,218.74L170,213l-0.6,-7.8 -2.29,-0.13 -1.15,-1.1a16.74,16.74 0,0 0,-0.77 13.58,10.59 10.59,0 0,0 -1.39,0.44 1.55,1.55 0,0 0,-0.55 0.36s3,0 3.6,-0.36l-0.66,-5.28c0.33,-1 0.61,-2.08 0.84,-3a25.33,25.33 0,0 0,0.75 3.21,26.53 26.53,0 0,0 2.51,5.56c-0.59,0.28 -1.36,0.67 -1.32,0.67a13.25,13.25 0,0 0,1.66 0,4.52 4.52,0 0,1 0.78,-0.27Z" />
+ <path android:fillColor="#9aa0a6"
+ android:pathData="M159.53,197.06a4.23,4.23 0,1 0,5.23 2.9A4.23,4.23 0,0 0,159.53 197.06ZM159.88,198.28a1.27,1.27 0,1 1,-0.87 1.57A1.27,1.27 0,0 1,159.88 198.28ZM161.53,204.05a3,3 0,0 1,-2.81 -0.61c-0.22,-0.81 1.27,-1.72 2.08,-1.95s2.55,-0.25 2.8,0.55A3,3 0,0 1,161.53 204Z" />
+ <path android:fillColor="#ffccbc"
+ android:pathData="M163.22,204.25s-1.29,-0.27 -1.17,-0.71 1.41,-0.11 1.41,-0.11Z" />
+ <path android:fillColor="#0f9d58"
+ android:pathData="M169.51,203.19c0.23,-1.42 0.92,-1.91 -0.51,-3.75h0l-0.48,-0.28a1.19,1.19 0,0 0,-0.44 -0.15l-0.79,-0.11a1.06,1.06 0,0 0,-1.15 0.72,11.85 11.85,0 0,0 -0.63,3.12c0,0.19 0,0.38 -0.05,0.57l-2,0.11 -0.48,1.3 2.14,0.1a10,10 0,0 0,-0.38 1.61l5,0.76 -0.34,-3.63A1.28,1.28 0,0 0,169.51 203.19Z" />
+</vector>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/deferred_setup_welcome_img.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/deferred_setup_welcome_img.xml
new file mode 100644
index 00000000..c2b0ba13
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/deferred_setup_welcome_img.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="284dp"
+ android:height="284dp"
+ android:viewportWidth="284.0"
+ android:viewportHeight="284.0">
+ <path android:fillColor="#F7F8F9"
+ android:pathData="M142,142m-142,0a142,142 0,1 1,284 0a142,142 0,1 1,-284 0" />
+ <path android:fillColor="#F2CE8F"
+ android:pathData="M230.21,236.51c0,0 -0.73,-2.02 0,-2.2c0.73,-0.17 1.3,1.33 1.3,1.33L230.21,236.51z" />
+ <path android:fillColor="#F44336"
+ android:pathData="M241.67,241.72l-7.46,-0.53l-2.69,-5.54l-1.94,1.29l2.19,5.69c0.37,0.97 1.24,1.67 2.27,1.82l7.67,1.14c0,0 0.99,-0.46 0.97,-1.98C242.67,242.09 241.67,241.72 241.67,241.72z" />
+ <path android:fillColor="#8D6E63"
+ android:pathData="M238.79,278.14l-0.58,-19.71l9.5,-0.52l-0.16,20.23l-1.81,-0.14l-3.31,-15.95l-1.48,16.09z" />
+ <path android:fillColor="#F44336"
+ android:pathData="M247.58,246.38c-1.24,-4.07 -5.91,-4.66 -5.91,-4.66s-1.8,2.92 -2.43,6.87c-0.63,3.94 -0.69,6.64 -1.19,10.05l10.26,0.72C248.3,259.36 248.83,250.45 247.58,246.38z" />
+ <path android:fillColor="#E2BE83"
+ android:pathData="M242.29,242.27c0,0 0.88,-1.48 1.08,-2.22c0.2,-0.74 1.41,0.34 1.41,0.34s0.2,2.63 0,2.63S242.09,246.44 242.29,242.27z" />
+ <path android:fillColor="#D8B37D"
+ android:pathData="M244.74,240.34c-0.22,-0.18 -1.19,-0.95 -1.37,-0.3c-0.12,0.43 -0.46,1.11 -0.73,1.6C243.39,241.63 244.19,241.15 244.74,240.34z" />
+ <path android:fillColor="#F2CE8F"
+ android:pathData="M244.89,239.95c-0.73,1.29 -2.12,1.89 -3.11,1.33c0,0 -1.19,-2.06 -0.45,-3.35s2.12,-1.89 3.11,-1.33C245.42,237.16 245.62,238.66 244.89,239.95z" />
+ <path android:fillColor="#231F20"
+ android:pathData="M241.87,237.17c0,0 -0.29,0.54 1.41,0.44c1.7,-0.1 1.33,1.72 1.33,1.72s-0.1,0.83 -0.03,1.11c0.07,0.29 0.88,-0.19 0.99,-1.72S244.16,235.13 241.87,237.17z" />
+ <path android:fillColor="#8D6E63"
+ android:pathData="M239.61,277.02c-0.1,0.15 -3.86,0.9 -4.33,1.33c-0.47,0.43 5.86,-0.04 5.86,-0.04l-0.38,-1.68C240.77,276.64 239.7,276.89 239.61,277.02z" />
+ <path android:fillColor="#8D6E63"
+ android:pathData="M245.95,276.88c-0.1,0.15 -3.86,0.9 -4.33,1.33c-0.47,0.43 5.86,-0.04 5.86,-0.04l-0.38,-1.68C247.1,276.49 246.03,276.75 245.95,276.88z" />
+ <path android:fillColor="#767C80"
+ android:pathData="M223.64,227.57c-3.95,1.88 -5.63,6.61 -3.75,10.56c2.55,5.37 13.47,9.89 13.47,9.89s3.39,-11.32 0.84,-16.69C232.31,227.37 227.59,225.69 223.64,227.57zM228.25,237.28c-1.41,0.67 -3.1,0.07 -3.77,-1.34c-0.67,-1.41 -0.07,-3.1 1.34,-3.77c1.41,-0.67 3.1,-0.07 3.77,1.34C230.26,234.92 229.66,236.61 228.25,237.28z" />
+ <path android:fillColor="#E8EAED"
+ android:pathData="M184.41,255.58h-86.2c-6.66,0 -12.07,-5.4 -12.07,-12.07V40.48c0,-6.66 5.4,-12.07 12.07,-12.07h86.2c6.66,0 12.07,5.4 12.07,12.07v203.04C196.48,250.18 191.08,255.58 184.41,255.58z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M184.41,29.84c5.87,0 10.64,4.77 10.64,10.64v203.04c0,5.87 -4.77,10.64 -10.64,10.64h-86.2c-5.87,0 -10.64,-4.77 -10.64,-10.64V40.48c0,-5.87 4.77,-10.64 10.64,-10.64H184.41M184.41,28.41h-86.2c-6.66,0 -12.07,5.4 -12.07,12.07v203.04c0,6.66 5.4,12.07 12.07,12.07h86.2c6.66,0 12.07,-5.4 12.07,-12.07V40.48C196.48,33.82 191.08,28.41 184.41,28.41L184.41,28.41z" />
+ <path android:fillColor="#FFFFFF"
+ android:pathData="M186.86,237.01h-91.1c-2.1,0 -3.81,-1.7 -3.81,-3.81V50.79c0,-2.1 1.7,-3.81 3.81,-3.81h91.1c2.1,0 3.81,1.7 3.81,3.81v182.41C190.67,235.31 188.96,237.01 186.86,237.01z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M160.41,246.66h-38.2c-0.57,0 -1.03,-0.46 -1.03,-1.03v-0.07c0,-0.57 0.46,-1.03 1.03,-1.03h38.2c0.57,0 1.03,0.46 1.03,1.03v0.07C161.44,246.19 160.98,246.66 160.41,246.66z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M160.41,39.48h-38.2c-0.57,0 -1.03,-0.46 -1.03,-1.03v-0.07c0,-0.57 0.46,-1.03 1.03,-1.03h38.2c0.57,0 1.03,0.46 1.03,1.03v0.07C161.44,39.02 160.98,39.48 160.41,39.48z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M196.91,97.58h-0.43V83.03h0.43c0.52,0 0.94,0.42 0.94,0.94v12.67C197.86,97.16 197.43,97.58 196.91,97.58z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M196.53,143.27h-0.05v-28.72h0.05c0.73,0 1.32,0.59 1.32,1.32v26.07C197.86,142.68 197.26,143.27 196.53,143.27z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M128.28,89.34l2.37,2.37c5.89,-5.89 15.44,-5.89 21.32,0l2.37,-2.37C147.15,82.14 135.48,82.14 128.28,89.34zM137.76,98.81l3.55,3.55l3.55,-3.55C142.91,96.85 139.72,96.85 137.76,98.81zM133.02,94.08l2.37,2.37c3.27,-3.27 8.58,-3.27 11.85,0l2.37,-2.37C145.03,89.5 137.6,89.5 133.02,94.08z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M149.6,180.45h-1.18v-2.37h-2.37v2.37h-9.48v-2.37h-2.37v2.37h-1.18c-1.31,0 -2.36,1.06 -2.36,2.37l-0.01,16.58c0,1.31 1.06,2.37 2.37,2.37h16.58c1.31,0 2.37,-1.06 2.37,-2.37v-16.58C151.97,181.51 150.91,180.45 149.6,180.45zM149.6,199.4h-16.58v-13.03h16.58V199.4zM135.39,188.74h5.92v5.92h-5.92V188.74z" />
+ <path android:fillColor="#BDC1C6"
+ android:pathData="M151.97,150.29v-16.58c0,-1.31 -1.06,-2.37 -2.37,-2.37h-16.58c-1.31,0 -2.37,1.06 -2.37,2.37v16.58c0,1.31 1.06,2.37 2.37,2.37h16.58C150.91,152.66 151.97,151.6 151.97,150.29zM137.17,143.78l2.96,3.56l4.15,-5.34l5.33,7.11h-16.58L137.17,143.78z" />
+ <path android:fillColor="#EF6C51"
+ android:pathData="M51.67,203.92l-2.16,0l1.16,-5.15l1,0z" />
+ <path android:fillColor="#F4B400"
+ android:pathData="M56.59,203.04l10.17,7.23l-0.54,1.54l-11.09,-4.46l0.46,-4.93z" />
+ <path android:fillColor="#EF6C51"
+ android:pathData="M49.27,199.03a2.52,1.92 72.71,1 0,3.67 -1.14a2.52,1.92 72.71,1 0,-3.67 1.14z" />
+ <path android:fillColor="#FF000000"
+ android:pathData="M50.84,216.94c0,0 -1.12,6.31 -2.32,12.57l-4.19,6.89l1.01,0.58c0,0 8.25,-5.33 11.21,-19.42L50.84,216.94z" />
+ <path android:fillColor="#FF000000"
+ android:pathData="M53.42,219.21c0,0 0.99,3.03 3.43,8.92l1.19,9.16l0.94,0.46c0,0 3.58,-7.67 -1.69,-21.07L53.42,219.21z" />
+ <path android:fillColor="#F4B400"
+ android:pathData="M48.45,203.11l2.92,-0.92l3.03,-0.03l1.2,0.26c0,0 2.55,12.77 3.04,16.09l-8.7,1.92L48.45,203.11z" />
+ <path android:fillColor="#F4B400"
+ android:pathData="M48.45,203.11l0.65,6.1l0.28,2.08l4.17,2.87l-0.37,1.32l-0.33,0.9l-3.67,-1.9l-0.76,-0.3c-1.46,-0.58 -2.41,-2.01 -2.36,-3.58C46.13,208.3 45.9,205.32 48.45,203.11z" />
+ <path android:fillColor="#EF6C51"
+ android:pathData="M49.74,202.76c0,0 1.7,3.3 1.78,3.3c0.07,0 1.2,-3.82 1.12,-3.82s-1.72,-1 -1.72,-1l-1.11,1.47" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M46.67,240.71c-0.02,0 -0.04,0 -0.06,0c-0.31,-0.03 -0.53,-0.25 -0.5,-0.5L68.69,69.21c0.03,-0.25 0.34,-0.44 0.61,-0.4c0.31,0.03 0.53,0.25 0.5,0.5L47.22,240.31C47.19,240.54 46.95,240.71 46.67,240.71z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M64.48,240.71c-0.02,0 -0.04,0 -0.06,0c-0.31,-0.03 -0.53,-0.25 -0.5,-0.5L86.51,69.21c0.03,-0.25 0.32,-0.44 0.61,-0.4c0.31,0.03 0.53,0.25 0.5,0.5L65.03,240.31C65,240.54 64.76,240.71 64.48,240.71z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M86.35,75.11H68.54c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S86.66,75.11 86.35,75.11z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M85.34,82.73H67.53c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S85.65,82.73 85.34,82.73z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M84.34,90.36H66.52c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S84.64,90.36 84.34,90.36z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M83.33,97.99H65.52c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S83.64,97.99 83.33,97.99z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M82.32,105.62H64.51c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S82.63,105.62 82.32,105.62z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M81.31,113.25H63.5c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S81.62,113.25 81.31,113.25z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M80.31,120.88H62.49c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S80.61,120.88 80.31,120.88z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M79.3,128.51H61.49c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45H79.3c0.31,0 0.56,0.2 0.56,0.45S79.61,128.51 79.3,128.51z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M78.29,136.14H60.48c-0.31,0 -0.56,-0.2 -0.56,-0.45c0,-0.25 0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45C78.85,135.94 78.6,136.14 78.29,136.14z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M77.28,143.77H59.47c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S77.59,143.77 77.28,143.77z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M76.28,151.4H58.47c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S76.59,151.4 76.28,151.4z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M75.27,159.03H57.46c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S75.58,159.03 75.27,159.03z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M74.26,166.65H56.45c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S74.57,166.65 74.26,166.65z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M73.26,174.28H55.44c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S73.56,174.28 73.26,174.28z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M72.25,181.91H54.44c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S72.56,181.91 72.25,181.91z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M71.24,189.54H53.43c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S71.55,189.54 71.24,189.54z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M70.23,197.17H52.42c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S70.54,197.17 70.23,197.17z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M69.23,204.8H51.42c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S69.54,204.8 69.23,204.8z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M68.22,212.43H50.41c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S68.53,212.43 68.22,212.43z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M67.21,220.06H49.4c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S67.52,220.06 67.21,220.06z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M66.21,227.69H48.39c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45h17.81c0.31,0 0.56,0.2 0.56,0.45S66.51,227.69 66.21,227.69z" />
+ <path android:fillColor="#DFE1E5"
+ android:pathData="M65.2,235.32H47.39c-0.31,0 -0.56,-0.2 -0.56,-0.45s0.25,-0.45 0.56,-0.45H65.2c0.31,0 0.56,0.2 0.56,0.45S65.51,235.32 65.2,235.32z" />
+ <path android:fillColor="#EF6C51"
+ android:pathData="M66.37,211.2a0.69,1.62 0,1 0,1.38 0a0.69,1.62 0,1 0,-1.38 0z" />
+ <path android:fillColor="#424242"
+ android:pathData="M83.58,71.96l-7.39,15.76l0.99,0.35c0,0 5.23,-3.42 9.43,-13.01L83.58,71.96z" />
+ <path android:fillColor="#0F9D58"
+ android:pathData="M82.98,65.24l1.76,-0.54l2.85,-0.11l1.82,0.51c0,0 -1.72,5.43 -1.86,7.86l-3.97,-1L82.98,65.24z" />
+ <path android:fillColor="#424242"
+ android:pathData="M83.58,71.96c0,0 3.8,0.75 3.94,0.75c0.14,0 -0.8,2.01 -0.8,2.01s-1.41,0.65 -1.87,0.84C84.38,75.76 83.58,71.96 83.58,71.96z" />
+ <path android:fillColor="#424242"
+ android:pathData="M85.06,92.32c0,0 2.22,0.54 3.2,1.76s-3.61,-0.61 -3.61,-0.61S84.31,92.51 85.06,92.32z" />
+ <path android:fillColor="#424242"
+ android:pathData="M77.37,88.02c0,0 -1.79,4.04 -2.53,3.53c-1.64,-1.11 1.67,-3.96 1.67,-3.96L77.37,88.02z" />
+ <path android:fillColor="#BA7542"
+ android:pathData="M84.49,61.53c0.32,0.73 0.92,1.22 1.61,1.22c1.03,0 1.87,-1.1 1.88,-2.46c0,-0.49 -0.11,-0.94 -0.3,-1.33C86.73,60.7 85.42,61.32 84.49,61.53z" />
+ <path android:fillColor="#0F9D58"
+ android:pathData="M89.41,65.1c0,0 4.47,2.9 5.11,3.26c0,0 -0.12,1.35 -0.22,1.37c-0.1,0.02 -5.4,-1.99 -5.6,-2.41C88.49,66.89 88.31,64.94 89.41,65.1z" />
+ <path android:fillColor="#BA7542"
+ android:pathData="M94.38,68.38c-0.06,-0.02 2.88,-1.23 3.72,-0.34c0.6,0.64 -3.88,1.67 -3.88,1.67L94.38,68.38z" />
+ <path android:fillColor="#BA7542"
+ android:pathData="M79.69,71.21l0.86,-0.07l0.32,1.04c0,0 -1.66,2.82 -1.7,2.88c-0.48,0.68 -1.14,0.77 -0.95,-0.02C78.74,72.82 79.69,71.21 79.69,71.21z" />
+ <path android:fillColor="#0F9D58"
+ android:pathData="M82.98,65.24c0,0 -1.31,1.16 -3.29,5.97l1.18,0.97l3.08,-4.6L82.98,65.24z" />
+ <path android:fillColor="#FF000000"
+ android:pathData="M83.25,57.88a1.65,1.28 64.72,1 0,2.31 -1.09a1.65,1.28 64.72,1 0,-2.31 1.09z" />
+ <path android:fillColor="#FF000000"
+ android:pathData="M87.68,58.97c-0.33,-0.68 -0.91,-1.14 -1.57,-1.14c-1.03,0 -2.34,1.58 -2.34,2.94c0,0.45 0.8,0.9 0.96,1.27C85.66,61.82 86.73,60.7 87.68,58.97z" />
+ <path android:fillColor="#BA7542"
+ android:pathData="M84.94,62.03c0,0 0.29,2.19 -0.24,2.75c-0.58,0.62 2.53,0.22 2.47,0.2c-0.06,-0.02 -1.08,-1.89 -0.5,-2.89C87.25,61.09 84.94,62.03 84.94,62.03z" />
+ <path android:fillColor="#767C80"
+ android:pathData="M106,54.79c-4.84,-1.66 -10.11,0.91 -11.78,5.75c-1.66,4.84 0.91,10.11 5.75,11.78c4.84,1.66 10.11,-0.91 11.78,-5.75C113.42,61.73 110.84,56.46 106,54.79zM105.09,57.42c1.45,0.5 2.22,2.08 1.73,3.53c-0.5,1.46 -2.08,2.22 -3.53,1.73c-1.45,-0.5 -2.23,-2.08 -1.73,-3.53C102.06,57.7 103.64,56.92 105.09,57.42zM100.82,69.87c-2.2,-0.75 -3.74,-2.54 -4.29,-4.63c0.62,-1.73 4.44,-1.49 6.19,-0.89s4.9,2.76 4.33,4.51C105.33,70.17 103.01,70.62 100.82,69.87z" />
+ <path android:fillColor="#424242"
+ android:pathData="M84.38,75.76c0,0 0.2,2.93 1.25,8.55l-0.64,8.27l0.74,0.58c0,0 5.62,-10.7 1.78,-20.45L84.38,75.76z" />
+ <path android:fillColor="#F2CE8F"
+ android:pathData="M233.93,247.41c0,0 -1.47,-1.57 -0.87,-2.02c0.6,-0.45 1.72,0.71 1.72,0.71L233.93,247.41z" />
+ <path android:fillColor="#F44336"
+ android:pathData="M243.31,245.44l-3.86,4.69l-4.66,-4.03l-1.27,1.95l4.26,4.36c0.73,0.75 1.8,1.04 2.81,0.78l4.3,-4.22c0,0 0.73,-0.82 0.11,-2.2S243.31,245.44 243.31,245.44z" />
+</vector>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_deferred_setup_icon.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_deferred_setup_icon.xml
new file mode 100644
index 00000000..990ed484
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_deferred_setup_icon.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2016 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/glif_icon_size"
+ android:height="@dimen/glif_icon_size"
+ android:viewportHeight="48.0"
+ android:viewportWidth="48.0">
+ <path
+ android:fillColor="#4285F4"
+ android:pathData="M45.12,24.5c0,-1.56 -0.14,-3.06 -0.4,-4.5H24v8.51h11.84c-0.51,2.75 -2.06,5.08 -4.39,6.64v5.52h7.11c4.16,-3.83 6.56,-9.47 6.56,-16.17z" />
+ <path
+ android:fillColor="#34A853"
+ android:pathData="M24,46c5.94,0 10.92,-1.97 14.56,-5.33l-7.11,-5.52c-1.97,1.32 -4.49,2.1 -7.45,2.1 -5.73,0 -10.58,-3.87 -12.31,-9.07H4.34v5.7C7.96,41.07 15.4,46 24,46z" />
+ <path
+ android:fillColor="#FBBC05"
+ android:pathData="M11.69,28.18C11.25,26.86 11,25.45 11,24s0.25,-2.86 0.69,-4.18v-5.7H4.34C2.85,17.09 2,20.45 2,24c0,3.55 0.85,6.91 2.34,9.88l7.35,-5.7z" />
+ <path
+ android:fillColor="#EA4335"
+ android:pathData="M24,10.75c3.23,0 6.13,1.11 8.41,3.29l6.31,-6.31C34.91,4.18 29.93,2 24,2 15.4,2 7.96,6.93 4.34,14.12l7.35,5.7c1.73,-5.2 6.58,-9.07 12.31,-9.07z" />
+</vector>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_language.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_language.xml
new file mode 100644
index 00000000..6cc9a729
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_language.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2016 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/ic_welcome_bottom_button_intrinsic_size"
+ android:height="@dimen/ic_welcome_bottom_button_intrinsic_size"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="?android:attr/colorControlNormal"
+ android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z" />
+</vector>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_logo_googleg.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_logo_googleg.xml
new file mode 100644
index 00000000..36454fa7
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_logo_googleg.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2016 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportHeight="48.0"
+ android:viewportWidth="48.0">
+ <path
+ android:fillColor="#4285F4"
+ android:pathData="M45.12,24.5c0,-1.56 -0.14,-3.06 -0.4,-4.5H24v8.51h11.84c-0.51,2.75 -2.06,5.08 -4.39,6.64v5.52h7.11c4.16,-3.83 6.56,-9.47 6.56,-16.17z" />
+ <path
+ android:fillColor="#34A853"
+ android:pathData="M24,46c5.94,0 10.92,-1.97 14.56,-5.33l-7.11,-5.52c-1.97,1.32 -4.49,2.1 -7.45,2.1 -5.73,0 -10.58,-3.87 -12.31,-9.07H4.34v5.7C7.96,41.07 15.4,46 24,46z" />
+ <path
+ android:fillColor="#FBBC05"
+ android:pathData="M11.69,28.18C11.25,26.86 11,25.45 11,24s0.25,-2.86 0.69,-4.18v-5.7H4.34C2.85,17.09 2,20.45 2,24c0,3.55 0.85,6.91 2.34,9.88l7.35,-5.7z" />
+ <path
+ android:fillColor="#EA4335"
+ android:pathData="M24,10.75c3.23,0 6.13,1.11 8.41,3.29l6.31,-6.31C34.91,4.18 29.93,2 24,2 15.4,2 7.96,6.93 4.34,14.12l7.35,5.7c1.73,-5.2 6.58,-9.07 12.31,-9.07z" />
+</vector>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_network_signal.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_network_signal.xml
new file mode 100644
index 00000000..73bbac11
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/drawable/ic_network_signal.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="32"
+ android:viewportHeight="32">
+
+ <path
+ android:pathData="M 0 0 H 32 V 32 H 0 V 0 Z" />
+ <path
+ android:fillColor="?android:attr/colorPrimary"
+ android:pathData="M24,5.33h1.33c0.74,0,1.33,0.6,1.33,1.33v18.67c0,0.74-0.6,1.33-1.33,1.33H24c-0.74,0-1.33-0.6-1.33-1.33
+V6.67C22.67,5.93,23.26,5.33,24,5.33z" />
+ <path
+ android:fillColor="?android:attr/colorPrimary"
+ android:pathData="M8,18.67h1.33c0.74,0,1.33,0.6,1.33,1.33v5.33c0,0.74-0.6,1.33-1.33,1.33H8c-0.74,0-1.33-0.6-1.33-1.33V20
+C6.67,19.26,7.26,18.67,8,18.67z" />
+ <path
+ android:fillColor="?android:attr/colorPrimary"
+ android:pathData="M16,12h1.33c0.74,0,1.33,0.6,1.33,1.33v12c0,0.74-0.6,1.33-1.33,1.33H16c-0.74,0-1.33-0.6-1.33-1.33v-12
+C14.67,12.6,15.26,12,16,12z" />
+</vector>
+
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/esim_intro_activity.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/esim_intro_activity.xml
new file mode 100644
index 00000000..f35062b3
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/esim_intro_activity.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<com.android.setupwizardlib.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/setup_wizard_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:icon="@drawable/ic_sim_card"
+ app:suwFooter="@layout/footer_next_only"
+ app:suwHeaderText="@string/esim_warning_title">
+
+ <LinearLayout
+ style="@style/SuwContentFrame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/esim_intro_description"
+ style="@style/SuwDescription.Glif"
+ android:text="@string/esim_warning_txt"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <com.android.setupwizardlib.view.FillContentLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1">
+
+ <com.android.setupwizardlib.view.IllustrationVideoView
+ android:id="@+id/background"
+ style="@style/SuwContentIllustration"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:suwVideo="@raw/esim_illustration" />
+ </com.android.setupwizardlib.view.FillContentLayout>
+ </LinearLayout>
+
+</com.android.setupwizardlib.GlifLayout>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/items_esim.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/items_esim.xml
new file mode 100644
index 00000000..1d60d9d1
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/items_esim.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ style="@style/SuwItemContainer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:baselineAligned="false"
+ android:paddingStart="0dp"
+ android:orientation="horizontal">
+
+ <FrameLayout
+ android:id="@+id/suw_items_icon_container"
+ android:layout_width="46dp"
+ android:paddingStart="4dp"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:gravity="start">
+
+ <ImageView
+ android:id="@+id/suw_items_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:maxHeight="24dp"
+ android:maxWidth="24dp"
+ android:adjustViewBounds="true"
+ tools:ignore="ContentDescription" />
+
+ </FrameLayout>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+
+ <com.android.setupwizardlib.view.RichTextView
+ android:id="@+id/suw_items_title"
+ style="@style/SuwItemTitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="start"
+ android:textAlignment="viewStart"
+ tools:ignore="UnusedAttribute" />
+
+ <com.android.setupwizardlib.view.RichTextView
+ android:id="@+id/suw_items_summary"
+ style="@style/SuwItemSummary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/suw_items_padding_bottom_extra"
+ android:gravity="start"
+ android:textAlignment="viewStart"
+ android:visibility="gone"
+ tools:ignore="UnusedAttribute" />
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/sim_missing_activity.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/sim_missing_activity.xml
new file mode 100644
index 00000000..18d74477
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/sim_missing_activity.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<com.android.setupwizardlib.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/setup_wizard_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:icon="@drawable/ic_network_signal"
+ app:suwFooter="@layout/footer_skip_only">
+
+ <LinearLayout
+ style="@style/SuwContentFrame"
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <!-- String will be set at runtime because it needs to first process the ICU syntax -->
+ <TextView
+ android:id="@+id/sim_missing_description"
+ style="@style/SuwDescription.Glif"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <com.android.setupwizardlib.view.FillContentLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:maxHeight="264dp"
+ android:maxWidth="264dp"
+ android:layout_weight="1">
+
+ <com.android.setupwizardlib.view.IllustrationVideoView
+ android:id="@+id/background"
+ style="@style/SuwContentIllustration"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:contentDescription="@string/sim_missing_content_description"
+ app:suwVideo="@raw/sim_illustration" />
+
+ </com.android.setupwizardlib.view.FillContentLayout>
+
+ <LinearLayout
+ android:id="@+id/esim_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:background="?android:attr/selectableItemBackground">
+
+ <View
+ android:background="?android:attr/listDivider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp" />
+
+ <include layout="@layout/items_esim" />
+
+ <View
+ android:background="?android:attr/listDivider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp" />
+ </LinearLayout>
+
+ </LinearLayout>
+
+</com.android.setupwizardlib.GlifLayout>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/welcome_activity.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/welcome_activity.xml
new file mode 100644
index 00000000..060b38f8
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/welcome_activity.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) 2016 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerInside"
+ android:src="@drawable/placeholder" />
+
+ <com.google.android.setupwizard.view.WelcomeVideoView
+ android:id="@+id/background"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ app:suwVideo="@raw/welcome_bg"
+ app:loopStartMs="4300" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:weightSum="1"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/welcome_title"
+ style="@style/WelcomeTitle"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight=".226"
+ android:gravity="center"
+ android:paddingBottom="8dp"
+ android:text="@string/welcome_message"
+ android:textColor="?android:attr/textColorPrimary" />
+
+ <!-- Placeholder view to align rest of the view with the circle in video -->
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight=".361" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight=".412"
+ android:clipChildren="false"
+ android:gravity="center_horizontal"
+ android:orientation="vertical">
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <com.google.android.setupwizard.util.LanguagePicker
+ android:id="@+id/language_picker"
+ style="@style/WelcomeBottomButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/welcome_language_picker_margin_bottom"
+ android:drawableStart="@drawable/ic_language" />
+
+ <com.google.android.setupwizard.util.BlinkButton
+ android:id="@+id/welcome_accessibility"
+ style="@style/WelcomeBottomButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:drawableStart="@drawable/ic_accessibility"
+ android:text="@string/welcome_accessibility_button" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1.3" />
+
+ <com.android.setupwizardlib.view.ButtonBarLayout
+ style="@style/SuwGlifButtonBar.Stackable"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/welcome_emergency_dial"
+ style="@style/SuwGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/emergency_dial" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <Button
+ android:id="@+id/start"
+ style="@style/SuwGlifButton.Primary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/welcome_start_button_label" />
+
+ </com.android.setupwizardlib.view.ButtonBarLayout>
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/welcome_activity_pre_transition.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/welcome_activity_pre_transition.xml
new file mode 100644
index 00000000..8a6c7582
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/layout/welcome_activity_pre_transition.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) 2016 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.
+-->
+
+<ImageView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerInside"
+ android:src="@drawable/placeholder" />
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/esim_illustration.mp4 b/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/esim_illustration.mp4
new file mode 100644
index 00000000..5c0eb9b5
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/esim_illustration.mp4
Binary files differ
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/sim_illustration.mp4 b/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/sim_illustration.mp4
new file mode 100644
index 00000000..df50ecdd
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/sim_illustration.mp4
Binary files differ
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/welcome_bg.mp4 b/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/welcome_bg.mp4
new file mode 100644
index 00000000..96b30b29
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/raw/welcome_bg.mp4
Binary files differ
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/transition/welcome_enter.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/transition/welcome_enter.xml
new file mode 100644
index 00000000..a25c93bf
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/transition/welcome_enter.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 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.
+-->
+
+<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
+ <fade
+ android:duration="1267"
+ android:startDelay="3400">
+ <targets>
+ <target android:targetClass="android.widget.Button" />
+ <target android:targetId="@id/welcome_title" />
+ </targets>
+ </fade>
+</transitionSet>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-af/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-af/strings.xml
new file mode 100644
index 00000000..74da8e08
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-af/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Die SIM-kaartlaai is links onder aan die kant van jou foon.\n\nGebruik die SIM-uithaalnutsding wat jy saam met jou foon gekry het om die laai uit te haal en \'n nano-SIM-kaart in te sit.\n\nNadat jy jou SIM-kaart ingesit het, kan dit \'n paar sekondes neem om dit te aktiveer."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-am/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-am/strings.xml
new file mode 100644
index 00000000..bb5a21da
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-am/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"የሲም ካርዱ መያዣ በስልክዎ የታችኛው ግራ ጠርዝ ላይ ነው የሚገኘው።\n\nመያዣውን ለማስወጣት እና ናኖ ሲም ካርድ ለማስገባት ከስልክዎ ጋር የሚመጣውን የሲም ማስወጫ መሣሪያ ይጠቀሙ።\n\nአንዴ ሲም ካርድዎን ካስገቡ በኋላ ገቢር እስኪሆን ድረስ ጥቂት ሰከንዶች ሊወስድ ይችላል።"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ar/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ar/strings.xml
new file mode 100644
index 00000000..e3a83c33
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ar/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"‏حاوية شريحة SIM موجودة على الحافة العلوية اليسرى من الهاتف.\n\nاستخدم أداة إخراج شريحة SIM المرفقة مع هاتفك لإخراج الحاوية وإدخال شريحة SIM صغيرة جدًا.\n\nبعد إدخال شريحة SIM، يمكن أن يستغرق تنشيطها بضع ثوانٍ."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-as/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-as/strings.xml
new file mode 100644
index 00000000..8b384ac6
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-as/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"ছিম কাৰ্ডৰ ট্ৰে আপোনাৰ ফ\'নৰ একেবাৰে তলৰ বাওঁ চুকত অৱস্থিত।\n\nকোনো নেন\' ছিম কাৰ্ড ভৰাবলৈ আপোনাৰ ফ\'নৰ লগতে অহা ছিম উলিয়াও সঁজুলি ব্য়ৱহাৰ কৰি ছিমৰ ট্ৰে বাহিৰলৈ উলিয়াওক।\n\nআপোনাৰ ছিম কাৰ্ডখন ভৰোৱাৰ পিছত সেইখন সক্ৰিয় হ\'বলৈ কিছু সময় লাগিব পাৰে।"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-az/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-az/strings.xml
new file mode 100644
index 00000000..6bf5f65f
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-az/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM kart yeri telefonunuzun aşağı sol hissəsində yerləşir.\n\nKart yerini çıxarmaq və nano SIM kartı daxil etmək üçün telefonla birlikdə əldə etdiyiniz SIM çıxarma alətindən istifadə edin.\n\nSIM kartı daxil etdikdən sonra, aktivləşmə bir neçə saniyə çəkəcək."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-b+sr+Latn/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 00000000..926704fe
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Držač za SIM karticu se nalazi u gornjem levom uglu telefona.\n\nPomoću alatke za izbacivanje SIM kartice koju dobijate uz telefon izbacite držač i umetnite nano SIM karticu.\n\nKada umetnete SIM karticu, potrebno je nekoliko sekundi da se aktivira."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-be/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-be/strings.xml
new file mode 100644
index 00000000..f93e99e4
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-be/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Латок для SIM-карты размяшчаецца ў ніжняй частцы вашага тэлефона злева.\n\nВыцягніце SIM-карту з дапамогай спецыяльнага інструмента, які пастаўляецца ў камплекце з тэлефонам, і ўстаўце Nano-SIM-карту.\n\nПасля ўстаўкі для актывацыі SIM-карты можа спатрэбіцца некалькі секунд."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bg/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bg/strings.xml
new file mode 100644
index 00000000..e0b6b3e9
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bg/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Поставката за SIM карта се намира в долната лява част на телефона ви.\n\nИзвадете поставката посредством съответния инструмент, който сте получили с телефона си, и поставете нано SIM карта.\n\nСлед като поставите SIM картата, активирането й може да отнеме няколко секунди."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bn/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bn/strings.xml
new file mode 100644
index 00000000..f924fb83
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bn/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"সিম কার্ডের ট্রে আপনার ফোনের নিচের বাঁদিকের প্রান্তে রয়েছে।\n\nট্রে বের করে ন্যানো সিম কার্ড ঢোকানোর জন্য, আপনার ফোনের সাথে যে সিম বের করে নেওয়ার সরঞ্জামটি দেওয়া হয়েছে সেটি ব্যবহার করুন।\n\nআপনার সিম কার্ডটি ঢোকানোর পর, সেটি চালু হতে কয়েক সেকেন্ড সময় লাগতে পারে।"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bs/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bs/strings.xml
new file mode 100644
index 00000000..194aba68
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-bs/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Ležište za SIM karticu se nalazi u donjem lijevom uglu telefona.\n\nPomoću alata za izbacivanje SIM-a koji ste dobili uz telefon izbacite ležište i ubacite nano SIM karticu.\n\nKada ubacite SIM karticu, može proći nekoliko sekundi dok se ne aktivira."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ca/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ca/strings.xml
new file mode 100644
index 00000000..05a0ef41
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ca/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"La safata de la targeta SIM es troba al lateral inferior esquerre del telèfon.\n\nUtilitza l\'eina per extreure la targeta SIM que es proporciona amb el telèfon per expulsar la safata i inserir-hi una targeta nano-SIM.\n\nUn cop introdueixis la targeta SIM, pot tardar uns quants segons a activar-se."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-cs/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-cs/strings.xml
new file mode 100644
index 00000000..f0de3fc7
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-cs/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Držák SIM karty se nachází na levém dolním okraji telefonu.\n\nVložte nástroj na vysunutí SIM karty, který jste s telefonem obdrželi, vyjměte držák a vložte nano SIM kartu.\n\nPo vložení SIM karty může její aktivace několik sekund trvat."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-da/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-da/strings.xml
new file mode 100644
index 00000000..a6a6e01a
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-da/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM-kortbakken er placeret nederst på telefonens venstre kant.\n\nBrug værktøjet til udskubning af SIM-kort, som fulgte med telefonen, til at åbne bakken, og indsæt et nano-SIM-kort.\n\nNår du har indsat dit SIM-kort, kan der gå et par sekunder, før det aktiveres."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-de/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-de/strings.xml
new file mode 100644
index 00000000..1865321e
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-de/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Das SIM-Kartenfach befindet sich links unten an deinem Smartphone.\n\nNutze den im Lieferumfang des Smartphones enthaltenen SIM-Auswurfschlüssel, um das Kartenfach herauszunehmen, und lege eine Nano-SIM-Karte ein.\n\nNachdem du die SIM-Karte eingelegt hast, kann es einige Sekunden dauern, bis sie aktiviert wird."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-el/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-el/strings.xml
new file mode 100644
index 00000000..4de95006
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-el/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Η υποδοχή της κάρτας SIM βρίσκεται στο κάτω αριστερό άκρο του τηλεφώνου σας.\n\nΧρησιμοποιήστε το εργαλείο εξαγωγής κάρτας SIM που συνοδεύει το τηλέφωνό σας, για να αφαιρέσετε την υποδοχή και να τοποθετήσετε την κάρτα nano SIM.\n\nΑφού τοποθετήσετε την κάρτα SIM, μπορεί να χρειαστούν λίγα δευτερόλεπτα για να ενεργοποιηθεί."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rAU/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rAU/strings.xml
new file mode 100644
index 00000000..baea219e
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rAU/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"The SIM card tray is located on the bottom-left edge of your phone.\n\nUse the SIM ejection tool that comes with your phone to eject the tray and insert a nano SIM card.\n\nOnce you insert your SIM card, it may take a few seconds to activate."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rCA/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rCA/strings.xml
new file mode 100644
index 00000000..baea219e
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rCA/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"The SIM card tray is located on the bottom-left edge of your phone.\n\nUse the SIM ejection tool that comes with your phone to eject the tray and insert a nano SIM card.\n\nOnce you insert your SIM card, it may take a few seconds to activate."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rGB/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000..baea219e
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rGB/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"The SIM card tray is located on the bottom-left edge of your phone.\n\nUse the SIM ejection tool that comes with your phone to eject the tray and insert a nano SIM card.\n\nOnce you insert your SIM card, it may take a few seconds to activate."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rIN/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rIN/strings.xml
new file mode 100644
index 00000000..baea219e
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rIN/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"The SIM card tray is located on the bottom-left edge of your phone.\n\nUse the SIM ejection tool that comes with your phone to eject the tray and insert a nano SIM card.\n\nOnce you insert your SIM card, it may take a few seconds to activate."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rXC/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rXC/strings.xml
new file mode 100644
index 00000000..92a91d38
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-en-rXC/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎Sprint‎‏‎‎‏‎"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎The SIM card tray is located on the bottom left edge of your phone.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Use the SIM ejection tool that comes with your phone to eject the tray and insert a nano SIM card.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Once you insert your SIM card, it may take a few seconds to activate.‎‏‎‎‏‎"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-es-rUS/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-es-rUS/strings.xml
new file mode 100644
index 00000000..da8ae144
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-es-rUS/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"La bandeja de la tarjeta SIM se encuentra en el lado inferior izquierdo del teléfono.\n\nUsa la herramienta de extracción de la tarjeta SIM que se incluye con el teléfono para extraer la bandeja y colocar una tarjeta SIM nano.\n\nUna vez que insertes la tarjeta SIM, es posible que tarde unos segundos en activarse."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-es/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-es/strings.xml
new file mode 100644
index 00000000..5aa3d288
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-es/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"La bandeja de la tarjeta SIM está situada en el borde inferior izquierdo del teléfono.\n\nUsa la herramienta incluida con el teléfono para extraer la bandeja e insertar una tarjeta nano SIM.\n\nEs posible que la tarjeta SIM tarde unos segundos en activarse después de insertarla."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-et/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-et/strings.xml
new file mode 100644
index 00000000..e0162123
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-et/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM-kaardi salv asub telefoni vasakus ülaservas.\n\nSalve väljutamiseks ja nano-SIM-kaardi sisestamiseks kasutage telefoniga kaasasolevat SIM-kaardi väljutamistööriista.\n\nKui SIM-kaardi sisestate, võib selle aktiveerimiseks kuluda mõni sekund."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-eu/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-eu/strings.xml
new file mode 100644
index 00000000..7cc688ac
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-eu/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM txartelaren erretilua telefonoaren behealdeko ezkerreko ertzean dago. \n\nErabili telefonoarekin zetorren tresna SIM txartela ateratzeko eta sartu nano SIM txartel bat.\n\nOndoren, segundo batzuk beharko dira txartela aktiba dadin."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fa/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fa/strings.xml
new file mode 100644
index 00000000..0b3d26a2
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fa/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"سینی سیم‌کارت در بالای لبه چپ تلفنتان قرار دارد.\n\nبرای بیرون کشیدن سینی سیم‌کارت و قرار دادن سیم‌کارت نانو، از ابزار بیرون کشیدن عرضه‌شده همراه تلفن استفاده کنید.\n\nبعد از جاگذاری سیم‌کارت، ممکن است چند ثانیه طول بکشد تا فعال شود."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fi/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fi/strings.xml
new file mode 100644
index 00000000..ced4a3db
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fi/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM-korttikelkka sijaitsee puhelimen vasemmassa alareunassa.\n\nOta kelkka esiin puhelimen mukana tulleen työkalun avulla ja aseta nano-SIM-kortti kelkkaan.\n\nKun olet asettanut SIM-kortin puhelimeen, sen aktivointi voi kestää muutaman sekunnin."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fr-rCA/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fr-rCA/strings.xml
new file mode 100644
index 00000000..c7eee1be
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fr-rCA/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Le porte-carte SIM se situe sur le bord inférieur gauche de votre téléphone.\n\nUtilisez l\'outil d\'éjection de la carte SIM fourni avec le téléphone pour éjecter le plateau et insérer une carte nano SIM.\n\nUne fois votre carte SIM insérée, l\'activation peut prendre quelques secondes."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fr/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fr/strings.xml
new file mode 100644
index 00000000..15b303d2
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-fr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Le tiroir de la carte SIM se situe sur le côté de votre téléphone, en bas à gauche.\n\nUtilisez l\'outil d\'éjection de la carte SIM fourni avec le téléphone pour ouvrir le tiroir et insérer une carte nano SIM.\n\nUne fois celle-ci insérée, l\'activation peut prendre quelques secondes."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-gl/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-gl/strings.xml
new file mode 100644
index 00000000..3b866817
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-gl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"A bandexa da tarxeta SIM localízase no bordo inferior esquerdo do teléfono.\n\nUtiliza a ferramenta de expulsión da SIM que se inclúe no teléfono para expulsar a bandexa e inserir unha tarxeta nano SIM.\n\nUnha vez inserida, pode tardar uns segundos en activarse."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-gu/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-gu/strings.xml
new file mode 100644
index 00000000..f1238c15
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-gu/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"સ્પ્રિન્ટ"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM કાર્ડ ટ્રે તમારા ફોનની ડાબી કિનારી પર સ્થિત છે.\n\nટ્રે બહાર કાઢવા અને નેનો SIM કાર્ડ દાખલ કરવા તમારા ફોન સાથે આવેલ SIM બહાર કાઢવાના સાધનનો ઉપયોગ કરો.\n\nએકવાર તમે તમારા SIM કાર્ડને દાખલ કરી દો તે પછી, તેને સક્રિય થવામાં થોડો સમય લાગી શકે છે."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hi/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hi/strings.xml
new file mode 100644
index 00000000..49b4eb4a
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hi/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"सिम कार्ड ट्रे, आपके फ़ोन के निचले बाएं किनारे पर मौजूद है.\n\nअपने फ़ोन के साथ मिले सिम निकालने वाले टूल का इस्तेमाल करके ट्रे निकालें और उसमें नैनो सिम कार्ड लगाएं.\n\nकार्ड लगाने के बाद, उसे चालू होने में कुछ सेकंड लग सकते हैं."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hr/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hr/strings.xml
new file mode 100644
index 00000000..cffd7093
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Ladica za SIM karticu nalazi se na donjem lijevom rubu telefona.\n\nPomoću alata za izbacivanje SIM-a koji ste dobili uz telefon izbacite ladicu i umetnite nano SIM karticu.\n\nAktiviranje SIM kartice nakon umetanja može trajati nekoliko sekundi."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hu/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hu/strings.xml
new file mode 100644
index 00000000..c5c62261
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hu/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"A SIM-kártya tálcája a telefon bal alsó élén található.\n\nA telefonhoz tartozó SIM-eltávolító eszközzel vegye ki a tálcát, és helyezzen be nano-SIM-kártyát.\n\nA SIM-kártya behelyezését követően néhány másodpercet vehet igénybe az aktiválás."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hy/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hy/strings.xml
new file mode 100644
index 00000000..6405c94b
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-hy/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM քարտի պնակը գտնվում է հեռախոսի ներքևի ձախ անկյունում:\n\nՀեռախոսի SIM քարտը հանելու գործիքի միջոցով բացեք պնակը և տեղադրեք նանո SIM քարտը:\n\nSIM քարտը տեղադրելուց հետո դրա ակտիվացման համար կարող է մի քանի վայրկյան պահանջվել:"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-in/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-in/strings.xml
new file mode 100644
index 00000000..0fc42d95
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-in/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Slot kartu SIM terdapat di tepi kiri bawah ponsel.\n\nGunakan alat untuk mengeluarkan SIM yang disertakan dengan ponsel, untuk mengeluarkan slot dan memasukkan kartu SIM nano.\n\nSetelah kartu SIM dimasukkan, mungkin perlu waktu beberapa detik untuk diaktifkan."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-is/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-is/strings.xml
new file mode 100644
index 00000000..edc092b6
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-is/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM-kortabakkinn er efst á vinstri brún símans.\n\nNotaðu verkfærið sem fylgdi með símanum til þess að ná bakkanum út og setja nanó-SIM-kort í hann.\n\nÞað gæti tekið SIM-kortið nokkrar sekúndur að virka eftir að því er stungið inn."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-it/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-it/strings.xml
new file mode 100644
index 00000000..f2bacdc4
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-it/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Lo slot per la scheda SIM si trova nella parte in basso a sinistra del telefono.\n\nUtilizza lo strumento di espulsione della SIM fornito con il telefono per aprire lo slot e inserire una nano SIM.\n\nDopo aver inserito la scheda SIM, potrebbero essere necessari alcuni secondi per l\'attivazione."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-iw/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-iw/strings.xml
new file mode 100644
index 00000000..98b1ac63
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-iw/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"‏מגש כרטיס ה-SIM ממוקם בפינה השמאלית-תחתונה של הטלפון.\n\nיש להשתמש בכלי הוצאת ה-SIM שצורף לטלפון כדי להוציא את המגש ולהכניס כרטיס ננו SIM.\n\nלאחר הכנסת כרטיס ה-SIM, הפעלתו עשויה להימשך מספר שניות."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ja/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ja/strings.xml
new file mode 100644
index 00000000..7e47a831
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ja/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM カード トレイはスマートフォン下部の左端にあります。\n\nスマートフォンに付属の SIM 取り出しツールを使ってトレイを取り出し、nano SIM カードを挿入します。\n\nSIM カードを挿入してから有効になるまで数秒かかることがあります。"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ka/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ka/strings.xml
new file mode 100644
index 00000000..8987f929
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ka/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM ბარათის სათავსო მდებარეობს თქვენი ტელეფონის ქვედა მარცხენა კიდეში.\n\nსათავსოს ამოსაღებად და nano-SIM ბარათის ჩასადებად გამოიყენეთ SIM ბარათის ამოსაღები ხელსაწყო, რომელიც თქვენს ტელეფონს მოჰყვა.\n\nSIM ბარათის ჩადების შემდეგ მის გააქტიურებას შეიძლება რამდენიმე წამი დასჭირდეს."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-kk/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-kk/strings.xml
new file mode 100644
index 00000000..2ce09862
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-kk/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM картасының науасы телефонның төменгі сол жақ шетінде орналасқан.\n\nТелефонмен бірге берілетін SIM картасын шығару құралымен науаны шығарып, Nano-SIM картасын енгізіңіз.\n\nSIM картасы салынған соң, ол бірнеше секундтан кейін іске қосылады."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-km/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-km/strings.xml
new file mode 100644
index 00000000..4d1d6722
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-km/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"ជើង​ស៊ីម​កាត​ស្ថិត​នៅ​ជ្រុង​ខាង​ឆ្វេង​ផ្នែក​ខាងក្រោម​នៃ​ទូរសព្ទ​របស់អ្នក។\n\nប្រើ​ឧបករណ៍​ដោះ​ស៊ីម​ដែល​ភ្ជាប់​មក​ជាមួយ​ទូរសព្ទ​របស់អ្នក​ដើម្បី​ដោះជើង​ស៊ីម​ចេញ រួច​ស៊ក​ស៊ីមកាត​ណាណូ​ចូល។\n\nបន្ទាប់​ពី​ស៊ក​ស៊ីមកាត​របស់អ្នក​រួច​ហើយ វា​អាច​នឹង​ចំណាយ​ពេល​ពីរ​បី​វិនាទី​ដើម្បី​បើក​ដំណើរ​ការ។"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-kn/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-kn/strings.xml
new file mode 100644
index 00000000..23563fdb
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-kn/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"ಸಿಮ್ ಕಾರ್ಡ್ ಟ್ರೇ ನಿಮ್ಮ ಫೋನ್‌ನ ಕೆಳಗಿನ ಎಡಭಾಗದ ತುದಿಯಲ್ಲಿದೆ.\n\nಟ್ರೇ ಅನ್ನು ಎಜೆಕ್ಟ್ ಮಾಡಲು ಮತ್ತು ನ್ಯಾನೊ ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಲು ನಿಮ್ಮ ಫೋನಿನ ಜೊತೆಗೆ ಬಂದಿರುವ ಸಿಮ್ ಎಜೆಕ್ಟ್ ಮಾಡುವ ಉಪಕರಣವನ್ನು ಬಳಸಿ.\n\nನೀವು ಒಮ್ಮೆ ನಿಮ್ಮ ಸಿಮ್ ಕಾರ್ಡ್‌ ಅನ್ನು ಸೇರಿಸಿದರೆ, ಅದು ಸಕ್ರಿಯಗೊಳ್ಳಲು ಕೆಲವು ಸೆಕೆಂಡುಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ko/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ko/strings.xml
new file mode 100644
index 00000000..070271f3
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ko/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM 카드 트레이는 스마트폰의 왼쪽 하단에 있습니다.\n\n스마트폰과 함께 제공되는 SIM 제거 도구를 사용하여 트레이를 꺼내고 나노 SIM 카드를 넣으세요.\n\nSIM 카드를 삽입하면 몇 초안에 활성화됩니다."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ky/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ky/strings.xml
new file mode 100644
index 00000000..b59d35b2
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ky/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM карта салгыч телефонуңуздун төмөнкү сол четинде жайгашкан.\n\nСалгычты чыгарып, ага Nano-SIM\'ди салуу үчүн, телефонуңуз менен чогуу келген SIM картаны чыгаргыч куралды колдонуңуз.\n\nSIM картаңызды салгандан кийин бир нече секунд өткөндө иштей баштайт."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lo/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lo/strings.xml
new file mode 100644
index 00000000..1dcf7f44
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lo/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"ຖາດໃສ່ຊິມກາດແມ່ນຢູ່ຂອບຊ້າຍລຸ່ມຂອງໂທລະສັບທ່ານ.\n\nໃຫ້ໃຊ້ເຄື່ອງມືຖອດຖາດຊິມທີ່ມາພ້ອມກັບໂທລະສັບຂອງທ່ານເພື່ອດຶງຖາດອອກມາ ແລ້ວໃສ່ຊິມກາດແບບນາໂນເຂົ້າໄປ.\n\nເມື່ອທ່ານໃສ່ຊິມກາດຂອງທ່ານແລ້ວ, ມັນຈະໃຊ້ເວລາເລັກນ້ອຍໃນການເປີດໃຊ້."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lt/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lt/strings.xml
new file mode 100644
index 00000000..ef2e1ca6
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lt/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM kortelės dėklas yra apatiniame kairiajame telefono krašte.\n\nKad pašalintumėte SIM kortelės dėklą ir įdėtumėte SIM nanokortelę, naudokite telefone esantį SIM pašalinimo įrankį.\n\nĮdėjus SIM kortelę, gali praeiti kelios sekundės, kol ji bus suaktyvinta."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lv/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lv/strings.xml
new file mode 100644
index 00000000..9f810823
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-lv/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM kartes paliktnis atrodas tālruņa apakšējā kreisajā malā.\n\nIzmantojiet tālruņa komplektācijā iekļauto SIM kartes izņemšanas rīku, lai izņemtu paliktni un ievietotu nano SIM karti.\n\nPēc SIM kartes ievietošanas var būt nepieciešamas dažas sekundes, lai to aktivizētu."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc204-mnc04/config.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc204-mnc04/config.xml
new file mode 100644
index 00000000..ba5f3b8d
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc204-mnc04/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<resources>
+
+ <!-- Whether to show the always on display opt-in -->
+ <bool name="show_always_on_display_opt_in">true</bool>
+
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc310-mnc004/config.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc310-mnc004/config.xml
new file mode 100644
index 00000000..ba5f3b8d
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc310-mnc004/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<resources>
+
+ <!-- Whether to show the always on display opt-in -->
+ <bool name="show_always_on_display_opt_in">true</bool>
+
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc311-mnc480/config.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc311-mnc480/config.xml
new file mode 100644
index 00000000..ba5f3b8d
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mcc311-mnc480/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<resources>
+
+ <!-- Whether to show the always on display opt-in -->
+ <bool name="show_always_on_display_opt_in">true</bool>
+
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mk/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mk/strings.xml
new file mode 100644
index 00000000..a32d0f34
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mk/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Фиоката за SIM-картичка се наоѓа на долниот лев раб на телефонот.\n\nУпотребете ја алатката за отстранување на SIM-картичката што доаѓа заедно со телефонот за да ја извадите фиоката и да ја вметнете нано SIM-картичката.\n\nОткако ќе ја вметнете SIM-картичката, можеби ќе поминат неколку секунди пред таа да се активира."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ml/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ml/strings.xml
new file mode 100644
index 00000000..bae06ffe
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ml/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"സ്പ്രിന്റ്"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"നിങ്ങളുടെ ഫോണിന്റെ താഴെ ഇടത് ഭാഗത്താണ് സിം കാർഡ് ട്രേ ഉള്ളത്.\n\nട്രേ ഇജക്റ്റ് ചെയ്യുന്നതിനും നാനോ സിം കാർഡ് ഇടുന്നതിനും, ഫോണിനൊപ്പം നിങ്ങൾക്ക് ലഭിച്ചിട്ടുള്ള സിം ഇജക്ഷൻ ടൂൾ ഉപയോഗിക്കുക.\n\nസിം കാർഡ് ഇട്ടുകഴിഞ്ഞാൽ, സജീവമാകുന്നതിന് കുറച്ച് സെക്കൻഡുകൾ എടുത്തേക്കാം."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mn/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mn/strings.xml
new file mode 100644
index 00000000..c1df098f
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mn/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"СИМ картны оролт таны утасны зүүн доод буланд байдаг.\n\nОролтыг салгаж нано СИМ картыг оруулахын тулд таны утсанд дагалдаж ирэх СИМ салгах хэрэгслийг ашиглана уу.\n\nТа СИМ картаа оруулсны дараа идэвхжих хүртэл нь хэдэн хором хүлээх шаардлагатай."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mr/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mr/strings.xml
new file mode 100644
index 00000000..a441c326
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-mr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"सिम कार्ड ट्रे तुमच्या फोनच्या खाली डाव्या किनारीवर असते.\n\nट्रे बाहेर काढण्यासाठी आणि लहान सिम कार्ड घालण्यासाठी तुमच्या फोनसह येणारे सिम बाहेर काढण्याचे टूल वापरा.\n\nतुम्ही एकदा तुमचे सिम कार्ड घातले की, ते अ‍ॅक्टिव्हेट होण्यासाठी काही सेकंद लागू शकतात."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ms/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ms/strings.xml
new file mode 100644
index 00000000..f7e9055f
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ms/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Dulang kad SIM terletak di tepi sebelah kiri bahagian atas telefon anda.\n\nGunakan alat pengeluaran SIM yang disertakan dengan telefon anda untuk mengeluarkan dulang itu, kemudian masukkan kad SIM nano.\n\nSetelah anda memasukkan kad SIM, kad itu mungkin mengambil masa beberapa saat untuk diaktifkan."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-my/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-my/strings.xml
new file mode 100644
index 00000000..f825f08e
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-my/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM ကဒ်ဗန်းသည် သင့်ဖုန်း၏ဘယ်ဘက်ဘောင် အောက်ခြေတွင် ရှိပါသည်။\n\nသင့်ဖုန်းနှင့်ပါသည့် ဆင်းမ်ကဒ်ထုတ်ကိရိယာဖြင့် ၎င်းဗန်းကိုထုတ်ပြီး နာနိုဆင်းမ်ကဒ် ထည့်သွင်းပါ။\n\nသင့်ဆင်းမ်ကဒ်ကို ထည့်သွင်းပြီးသည်နှင့် စတင်အသုံးပြုနိုင်ရန် စက္ကန့်အနည်းငယ်ကြာပါသည်။"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-nb/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-nb/strings.xml
new file mode 100644
index 00000000..7372d3a9
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-nb/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM-kortskuffen er plassert ved kanten nederst til venstre på telefonen din.\n\nBruk SIM-utløserverktøyet som følger med telefonen, for å løse ut skuffen. Deretter setter du inn et nano-SIM-kort.\n\nNår du har satt inn SIM-kortet, tar det noen sekunder før det blir aktivert."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ne/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ne/strings.xml
new file mode 100644
index 00000000..6b91e95a
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ne/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM कार्ड ट्रे तपाईंको फोनको तल्लो भागको बायाँ किनारामा छ।\n\nट्रेलाई बाहिर निकालेर त्यसमा न्यानो SIM कार्ड हाल्नका लागि आफ्नो फोनसँगै आउने SIM निकाल्ने उपकरणको प्रयोग गर्नुहोस्।\n\nएकपटक तपाईंले आफ्नो SIM कार्ड हालेपछि त्यो सक्रिय हुन केही सेकेन्ड लाग्न सक्छ।"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-nl/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-nl/strings.xml
new file mode 100644
index 00000000..e6a2ce3a
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-nl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"De simkaartlade bevindt zich in de linkeronderrand van je telefoon.\n\nGebruik het hulpmiddel voor het verwijderen van de simkaart dat bij je telefoon is geleverd om de lade naar buiten te trekken en plaats een nano-simkaart.\n\nNadat je de simkaart hebt geplaatst, kan het enkele seconden duren voordat deze wordt geactiveerd."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-or/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-or/strings.xml
new file mode 100644
index 00000000..d203704d
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-or/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM କାର୍ଡ ଟ୍ରେ ଆପଣଙ୍କ ଫୋନ୍‍ର ନିମ୍ନ ବାମପଟ ଧାରରେ ଉପସ୍ଥିତ ଅଛି। \n\n ଆପଣଙ୍କ ଫୋନ୍ ସହିତ ମିଳିଥିବା SIM ଇଜେକ୍ସନ୍ ଟୂଲ୍ ସାହାଯ୍ୟରେ ଟ୍ରେକୁ କାଢ଼ନ୍ତୁ ଏବଂ ଗୋଟିଏ ନାନୋ SIM କାର୍ଡକୁ ଇନସର୍ଟ କରନ୍ତୁ। \n\n ଥରେ ଆପଣଙ୍କର SIM କାର୍ଡ ଇନସର୍ଟ ହେବାପରେ ଆକ୍ଟିଭେଟ୍ ହେବା ପାଇଁ ଏହା କିଛି ସେକେଣ୍ଡ ସମୟ ନେଇପାରେ।"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pa/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pa/strings.xml
new file mode 100644
index 00000000..70a039e0
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pa/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"ਸਪ੍ਰਿੰਟ"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"ਸਿਮ ਕਾਰਡ ਟ੍ਰੇਅ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੇ ਹੇਠਲੇ ਖੱਬੇ ਕਿਨਾਰੇ \'ਤੇ ਸਥਿਤ ਹੁੰਦੀ ਹੈ।\n\nਟ੍ਰੇਅ ਨੂੰ ਬਾਹਰ ਕੱਢਣ ਅਤੇ ਇੱਕ ਨੈਨੋ ਸਿਮ ਕਾਰਡ ਦਾਖਲ ਕਰਨ ਲਈ ਆਪਣੇ ਫ਼ੋਨ ਨਾਲ ਮਿਲੇ ਸਿਮ ਕੱਢਣ ਵਾਲੇ ਟੂਲ ਦੀ ਵਰਤੋਂ ਕਰੋ।\n\nਤੁਹਾਡੇ ਵੱਲੋਂ ਸਿਮ ਕਾਰਡ ਦਾਖਲ ਕਰਨ ਦੇ ਬਾਅਦ, ਇਸ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਹੋਣ ਵਿੱਚ ਕੁਝ ਸਕਿੰਟਾਂ ਦਾ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ।"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pl/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pl/strings.xml
new file mode 100644
index 00000000..ed26de8e
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Gniazdo karty SIM znajduje się z boku telefonu, w jego dolnej lewej części.\n\nAby je wysunąć i włożyć kartę nano SIM, użyj narzędzia do wysuwania karty SIM dostarczonego z telefonem.\n\nAktywowanie włożonej karty SIM może potrwać kilka sekund."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt-rBR/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt-rBR/strings.xml
new file mode 100644
index 00000000..74d59125
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt-rBR/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"A bandeja do cartão SIM está localizada no canto inferior esquerdo do seu smartphone.\n\nUse a ferramenta de ejeção de SIM que acompanha o smartphone para ejetar a bandeja e inserir um cartão nano SIM.\n\nDepois que o cartão SIM for inserido, pode demorar alguns segundos para que ele seja ativado."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt-rPT/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000..b979a3ad
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt-rPT/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"O Tabuleiro para cartão SIM está localizado no canto inferior esquerdo do telemóvel.\n\nUtilize a ferramenta de ejeção do SIM fornecida com o telemóvel para ejetar o tabuleiro e inserir um cartão nano-SIM.\n\nDepois de o introduzir, a ativação do mesmo pode demorar alguns segundos."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt/strings.xml
new file mode 100644
index 00000000..74d59125
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-pt/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"A bandeja do cartão SIM está localizada no canto inferior esquerdo do seu smartphone.\n\nUse a ferramenta de ejeção de SIM que acompanha o smartphone para ejetar a bandeja e inserir um cartão nano SIM.\n\nDepois que o cartão SIM for inserido, pode demorar alguns segundos para que ele seja ativado."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ro/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ro/strings.xml
new file mode 100644
index 00000000..ddda5f63
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ro/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Suportul pentru cardul SIM se află pe marginea din stânga jos a telefonului.\n\nFolosiți instrumentul pentru scoaterea cardului SIM pe care l-ați primit împreună cu telefonul pentru a scoate suportul și a introduce un card nano SIM.\n\nDupă ce introduceți cardul SIM, poate dura câteva secunde până se va activa."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ru/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ru/strings.xml
new file mode 100644
index 00000000..e99722e5
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ru/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Лоток для SIM-карты расположен внизу слева на боковой поверхности телефона.\n\nЧтобы извлечь лоток и вставить Nano-SIM, используйте специальный инструмент, поставляемый в комплекте с телефоном.\n\nSIM-карта активируется через несколько секунд после установки."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-si/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-si/strings.xml
new file mode 100644
index 00000000..d8bd0f15
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-si/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM කාඩ්පත් තැටිය ඔබේ දුරකථනයේ ඉහළ වම් කෙළවරේ පිහිටා ඇත.\n\nතැටිය පිටතට ගෙන නැනෝ SIM කාඩ්පතක් ඇතුළු කිරීමට ඔබේ දුරකථනය සමග එන SIM පිටතට ගැනීමේ මෙවලම භාවිත කරන්න.\n\nඔබ ඔබේ SIM කාඩ්පත ඇතුළු කළ පසුව, එය සක්‍රිය වීමට තත්පර කිහිපයක් ගත හැකිය."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sk/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sk/strings.xml
new file mode 100644
index 00000000..1321c7b7
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sk/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Priehradka na SIM kartu sa nachádza na ľavom hornom okraji telefónu.\n\nNástrojom na vysunutie SIM karty, ktorý ste dostali s telefónom, vytiahnite priehradku a vložte nano SIM kartu.\n\nAktivácia SIM karty po vložení môže trvať niekoľko sekúnd."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sl/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sl/strings.xml
new file mode 100644
index 00000000..23836a4c
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Nosilec za kartico SIM je na spodnjem levem robu telefona.\n\nIztaknite nosilec z orodjem za izmet kartice SIM, ki je priloženo telefonu, in vstavite kartico nano-SIM.\n\nKo vstavite kartico SIM, lahko aktivacija traja nekaj sekund."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sq/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sq/strings.xml
new file mode 100644
index 00000000..69239c29
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sq/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Tabakaja e kartës SIM ndodhet në skajin lart majtas të telefonit.\n\nPërdor veglën e nxjerrjes së kartës SIM që shoqëron telefonin për të nxjerrë tabakanë dhe fut një kartë SIM nano.\n\nPasi të fusësh kartën SIM, mund të duhen disa sekonda për ta aktivizuar."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sr/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sr/strings.xml
new file mode 100644
index 00000000..e038d52d
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Држач за SIM картицу се налази у горњем левом углу телефона.\n\nПомоћу алатке за избацивање SIM картице коју добијате уз телефон избаците држач и уметните нано SIM картицу.\n\nКада уметнете SIM картицу, потребно је неколико секунди да се активира."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sv/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sv/strings.xml
new file mode 100644
index 00000000..e7cf2849
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sv/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Facket för SIM-kort finns på mobilens nedre vänstra kant.\n\nAnvänd SIM-utmatningsverktyget som följde med mobilen för att mata ut facket och sätt i ett nano-SIM-kort.\n\nDet kan ta några sekunder innan SIM-kortet aktiveras när du har satt i det."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sw/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sw/strings.xml
new file mode 100644
index 00000000..5a30bd5b
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-sw/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Trei ya SIM kadi inapatikana kwenye pembe ya juu kushoto katika simu yako. \n\nTumia zana ya kutoa SIM inayokuja na simu yako ili ufungue trei na uweke kadi ndogo ya SIM.\n\nUkishaweka SIM kadi yako, huenda ikachukua sekunde chache kabla ianze kutumika."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ta/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ta/strings.xml
new file mode 100644
index 00000000..8450df10
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ta/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"மொபைலின் கீழ் இடது முனையில் சிம் கார்டு செருகுமிடம் உள்ளது.\n\nமொபைலுடன் கொடுக்கப்பட்ட, SIMஐ வெளியேற்றும் கருவியைப் பயன்படுத்தி, சிம் கார்டு செருகுமிடத்தை எடுத்து, அதில் நானோ SIM கார்டைச் செருகவும்.\n\nகார்டைச் செருகிய பின்பு, அது இயங்குவதற்குச் சில வினாடிகள் ஆகலாம்."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-te/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-te/strings.xml
new file mode 100644
index 00000000..4cc3661b
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-te/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"సిమ్ కార్డ్ ట్రే మీ ఫోన్‌కు దిగువ ఎడమ అంచులో ఉంది.\n\nమీ ఫోన్‌తో పాటు అందించే సిమ్ తొలగింపు సాధనాన్ని ఉపయోగించి ట్రేని బయటికి తీసి, అందులో నానో సిమ్ కార్డ్ పెట్టండి.\n\nమీరు మీ సిమ్ కార్డ్‌ను పెట్టిన తర్వాత, అది యాక్టివేట్ కావడానికి కొన్ని క్షణాలు పట్టవచ్చు."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-th/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-th/strings.xml
new file mode 100644
index 00000000..3b3f54b4
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-th/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"ถาดซิมการ์ดอยู่ที่ขอบด้านล่างซ้ายของโทรศัพท์\n\nใช้เครื่องมือถอดซิมที่มาพร้อมกับโทรศัพท์เพื่อดึงถาดออกมาแล้วใส่ซิมการ์ดนาโน\n\nเมื่อใส่ซิมการ์ดแล้ว อาจใช้เวลาในการเปิดใช้งาน 2-3 วินาที"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-tl/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-tl/strings.xml
new file mode 100644
index 00000000..d7674071
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-tl/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Mahahanap ang tray ng SIM card sa kaliwang gilid sa ibaba ng iyong telepono.\n\nGamitin ang tool sa pag-eject ng SIM na kasama ng iyong telepono para i-eject ang tray at maglagay ng nano SIM card.\n\nKapag nailagay mo ang iyong SIM card, maaaring tumagal nang ilang segundo bago ito mag-activate."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-tr/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-tr/strings.xml
new file mode 100644
index 00000000..ef75abb7
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-tr/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM kartı tepsisi, telefonunuzun sol alt kenarındadır.\n\nTepsiyi çıkarmak ve nano SIM kart takmak için telefonunuzla birlikte gelen SIM çıkartma aracını kullanın.\n\nSIM kartınızı taktıktan sonra etkinleşmesi için birkaç saniye geçmesi gerekebilir."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-uk/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-uk/strings.xml
new file mode 100644
index 00000000..cd0bb056
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-uk/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Лоток для SIM-карти розташовано внизу ліворуч.\n\nЩоб вставити Nano SIM-карту, відкрийте лоток за допомогою інструмента, який входить у комплект телефона.\n\nАктивація SIM-карти може тривати кілька секунд."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ur/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ur/strings.xml
new file mode 100644
index 00000000..d7180372
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-ur/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"‏SIM کارڈ ٹرے آپ کے فون کے نچلے کنارے میں بائیں طرف موجود ہوتا ہے۔\n\nٹرے خارج کرنے کیلئے SIM اخراج ٹول استعمال کریں جو فون کے ساتھ ہوتا ہے اور نینو SIM کارڈ داخل کریں۔\n\nآپ کے SIM کارڈ داخل کرنے کے بعد اسے فعال ہونے میں چند سیکنڈ لگ سکتے ہیں۔"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-uz/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-uz/strings.xml
new file mode 100644
index 00000000..324157fd
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-uz/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM karta uyasi telefonning yuqori o‘ng burchagida joylashgan.\n\nTelefon bilan keladigan maxsus moslamadan foydalanib SIM karta tarnovini chiqaring va unga nano SIM karta soling.\n\nSIM karta solinganidan keyin uning faollashishi uchun bir necha soniya ketishi mumkin."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-vi/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-vi/strings.xml
new file mode 100644
index 00000000..7e67212d
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-vi/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Khay thẻ SIM nằm ở gờ dưới cùng bên trái của điện thoại.\n\nDùng dụng cụ thao khay đựng SIM đi kèm với điện thoại để tháo khay ra và lắp thẻ nano SIM vào.\n\nSau khi bạn lắp thẻ SIM, quá trình kích hoạt thẻ có thể mất vài giây."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rCN/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000..1af22ecc
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rCN/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM 卡托位于手机左下边缘。\n\n请使用手机随附的 SIM 卡弹出工具将卡托弹出,然后插入 Nano SIM 卡。\n\nSIM 卡插入后可能要过几秒钟才能激活。"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rHK/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rHK/strings.xml
new file mode 100644
index 00000000..727c85da
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rHK/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM 卡槽位於手機的左下方側邊。\n\n請使用手機隨附的 SIM 卡針將 SIM 卡槽彈出,然後插入 Nano SIM 卡。\n\nSIM 卡插入後,可能需要數秒才能啟用。"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rTW/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000..f20f8b59
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zh-rTW/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"SIM 卡匣位於手機左下方的側邊。\n\n請使用手機隨附的 SIM 卡彈出工具將卡匣彈出,然後插入 Nano SIM 卡。\n\nSIM 卡插入之後,可能需要幾秒鐘的時間才能啟用。"</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zu/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zu/strings.xml
new file mode 100644
index 00000000..61a5cb28
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values-zu/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="esim_additional_carrier_name" msgid="2016054563889185083">"I-Sprint"</string>
+ <string name="sim_missing_content_description" msgid="8674668505396985731">"Ithreyi yekhadi le-SIM itholakala kunqenqema oluphansi ngakwesokunxele kwefoni yakho.\n\nSebenzisa ithuluzi lokukhipha i-SIM eliza nefoni yakho ukuze ukhiphe ithreyi uphinde ufake i-SIM card le-nano.\n\nUma usufake i-SIM card lakho, kungathatha amasekhondi ambalwa ukwenza kusebenze."</string>
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values/config.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values/config.xml
new file mode 100644
index 00000000..f91e5530
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values/config.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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.
+-->
+
+<resources>
+
+ <!-- The list of actions that should be considered medium priority when deciding what kind of
+ notification should be shown for deferred setup. String items should either be an intent
+ URI present in the script, in which case it will be considered complete if that action
+ returns any result code other than ResultCodes.RESULT_SKIP, or it can be a pseudo action,
+ "lock_screen" or "restore", which will be completed when either a lock screen is set up
+ or restore is complete. -->
+ <string-array name="deferred_medium_priority_actions" translatable="false">
+ <item>intent:#Intent;action=com.google.android.setupwizard.OPA_OPT_IN;end</item>
+ <!-- "lock_screen" and "restore" are pseudo-actions. They don't correspond to actions in the
+ script, but rather functions as a string key and the completed state is set in
+ runtime in DeferredSetupActionsTracker#updateCompletedActions. -->
+ <item>lock_screen</item>
+ <item>restore</item>
+ <item>intent:#Intent;action=com.google.android.setupwizard.ASSIST_GESTURE;end</item>
+ </string-array>
+
+ <string name="demo_device_admin_component_name" translatable="false">com.google.android.retaildemo/.DemoDeviceAdminReceiver</string>
+ <string name="demo_device_admin_download_location" translatable="false">http://g.co/pixel/retaildemo</string>
+ <string name="demo_device_admin_signature_checksum" translatable="false">ZUfHPe4VDBA5gL_f_lXMmgEdeF3WlKX5mv2CBbyvH4A</string>
+
+</resources>
diff --git a/overlay-vendor/vendor/google/apps/SetupWizard/res/values/strings.xml b/overlay-vendor/vendor/google/apps/SetupWizard/res/values/strings.xml
new file mode 100644
index 00000000..06b9f564
--- /dev/null
+++ b/overlay-vendor/vendor/google/apps/SetupWizard/res/values/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (C) 2018 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- The carrier name which may be shown as an example of which carriers support eSIM. This should be different from the carrier name of the carrier app [CHAR LIMIT=20] -->
+ <string name="esim_additional_carrier_name">Sprint</string>
+
+ <!-- Explanatory text displayed in setup wizard when device is missing the SIM, telling the user to check the instructions text or graphics on how to insert the SIM. If needed, ICU syntax is also supported, with "sim_slots" being the number of SIM slots available on the phone. [CHAR LIMIT=NONE] -->
+ <string name="sim_missing_content_description">The SIM card tray is located on the bottom left edge of your phone.\n\nUse the SIM ejection tool that comes with your phone to eject the tray and insert a nano SIM card.\n\nOnce you insert your SIM card, it may take a few seconds to activate.</string>
+</resources>
+
diff --git a/overlay/frameworks/base/core/res/res/values/arrays.xml b/overlay/frameworks/base/core/res/res/values/arrays.xml
new file mode 100644
index 00000000..2d5e4608
--- /dev/null
+++ b/overlay/frameworks/base/core/res/res/values/arrays.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <!-- Device-specific array of SIM slot indexes which are are embedded eUICCs.
+ e.g. If a device has two physical slots with indexes 0, 1, and slot 1 is an
+ eUICC, then the value of this array should be:
+ <integer-array name="non_removable_euicc_slots">
+ <item>1</item>
+ </integer-array>
+ If a device has three physical slots and slot 1 and 2 are eUICCs, then the value of
+ this array should be:
+ <integer-array name="non_removable_euicc_slots">
+ <item>1</item>
+ <item>2</item>
+ </integer-array>
+ This is used to differentiate between removable eUICCs and built in eUICCs, and should
+ be set by OEMs for devices which use eUICCs. -->
+ <integer-array name="non_removable_euicc_slots">
+ <item>1</item>
+ <item>2</item>
+ </integer-array>
+</resources>
+
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
new file mode 100644
index 00000000..6b1cfcc6
--- /dev/null
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** 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.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Our amoled doesn't animate well. -->
+ <bool name="config_animateScreenLights">false</bool>
+
+ <bool name="config_ui_enableFadingMarquee">false</bool>
+
+ <!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
+ autodetected from the Configuration. -->
+ <bool name="config_showNavigationBar">true</bool>
+
+ <!-- Whether Multiuser UI should be shown -->
+ <bool name="config_enableMultiUserUI">true</bool>
+
+ <!-- Maximum number of supported users -->
+ <integer name="config_multiuserMaximumUsers">4</integer>
+
+ <!-- Boolean indicating whether the wifi chipset has dual frequency band support -->
+ <bool translatable="false" name="config_wifi_dual_band_support">true</bool>
+
+ <!-- Enable 802.11ac for Wifi hotspot (SAP) -->
+ <bool translatable="false" name="config_wifi_softap_ieee80211ac_supported">true</bool>
+
+ <!-- List of regexpressions describing the interface (if any) that represent tetherable
+ Wifi interfaces. If the device doesn't want to support tethering over Wifi this
+ should be empty. An example would be "softap.*" -->
+ <string-array translatable="false" name="config_tether_wifi_regexs">
+ <item>"wlan0"</item>
+ <item>"softap.*"</item>
+ </string-array>
+
+ <!-- List of regexpressions describing the interface (if any) that represent tetherable
+ USB interfaces. If the device doesn't want to support tething over USB this should
+ be empty. An example would be "usb.*" -->
+ <string-array translatable="false" name="config_tether_usb_regexs">
+ <item>"usb\\d"</item>
+ <item>"rndis\\d"</item>
+ </string-array>
+
+ <!-- When true use the linux /dev/input/event subsystem to detect the switch changes
+ on the headphone/microphone jack. When false use the older uevent framework. -->
+ <bool name="config_useDevInputEventForAudioJack">true</bool>
+
+ <string translatable="false" name="config_radio_access_family">GSM|CDMA|EVDO|WCDMA|LTE</string>
+
+ <!-- Enable doze mode
+ ComponentName of a dream to show whenever the system would otherwise have gone to sleep. -->
+ <string translatable="false" name="config_dozeComponent">com.android.systemui/com.android.systemui.doze.DozeService</string>
+
+ <!-- Type of the ambient tap sensor. Empty if ambient tap is not supported. -->
+ <string name="config_dozeTapSensorType" translatable="false">com.google.sensor.single_touch</string>
+
+ <!-- If this is true, the screen will come on when you unplug usb/power/whatever. -->
+ <bool name="config_unplugTurnsOnScreen">true</bool>
+
+ <!-- If device supports pickup/lift gesture -->
+ <bool name="config_dozePulsePickup">true</bool>
+
+ <!-- Screen brightness when dozing. -->
+ <integer name="config_screenBrightnessDoze">21</integer>
+ <item name="config_screenBrightnessDozeFloat" format="float" type="dimen">0.07874</item>
+
+ <!-- Whether the always on display mode is available. -->
+ <bool name="config_dozeAlwaysOnDisplayAvailable">true</bool>
+
+ <!-- Disable AOD by default -->
+ <bool name="config_dozeAlwaysOnEnabled">false</bool>
+
+ <!-- Specifies whether to decouple the auto-suspend state of the device from the display on/off state. -->
+ <bool name="config_powerDecoupleAutoSuspendModeFromDisplay">true</bool>
+
+ <!-- Specifies whether to decouple the interactive state of the device from the display on/off state. -->
+ <bool name="config_powerDecoupleInteractiveModeFromDisplay">true</bool>
+
+ <!-- Radius of the software rounded corners. -->
+ <dimen name="rounded_corner_radius">157px</dimen>
+
+ <!-- Adjustment for software rounded corners since corners aren't perfectly round. -->
+ <dimen name="rounded_corner_radius_adjustment">25px</dimen>
+
+ <!-- Height of the status bar.
+ Do not read this dimen directly. Use {@link SystemBarUtils#getStatusBarHeight} instead.
+ -->
+ <dimen name="status_bar_height_default">28dp</dimen>
+ <dimen name="status_bar_height_portrait">28dp</dimen>
+
+ <!-- Height of area above QQS where battery/time go (equal to status bar height if > 48dp) -->
+ <dimen name="quick_qs_offset_height">171px</dimen>
+ <!-- Total height of QQS (quick_qs_offset_height + 128dp) -->
+ <dimen name="quick_qs_total_height">177dp</dimen>
+
+ <!-- Shutdown if the battery temperature exceeds (this value * 0.1) Celsius. -->
+ <integer name="config_shutdownBatteryTemperature">600</integer>
+
+ <!-- Whether or not we should show the option to show battery percentage -->
+ <bool name="config_battery_percentage_setting_available">true</bool>
+
+ <!-- Number of physical SIM slots on the device. This includes both eSIM
+ and pSIM slots, and is not necessarily the same as the number of phones/logical modems
+ supported by the device. For example, a multi-sim device can have 2 phones/logical modems,
+ but 3 physical slots, or a single SIM device can have 1 phones/logical modems, but 2
+ physical slots (one eSIM and one pSIM) -->
+ <integer name="config_num_physical_slots">3</integer>
+
+ <!-- Enable CBRS support -->
+ <bool translatable="false" name="config_cbrs_supported">true</bool>
+
+ <!-- IWLAN-->
+ <string name="config_wlan_data_service_package">com.google.android.iwlan</string>
+ <string name="config_wlan_network_service_package">com.google.android.iwlan</string>
+ <bool name="config_wlan_data_service_conn_persistence_on_restart">false</bool>
+ <string name="config_qualified_networks_service_package">com.shannon.qualifiednetworksservice</string>
+
+ <!-- Boolean indicating USSD over IMS is allowed.
+ If it is not supported due to modem limitations, USSD send over the CS pipe instead.-->
+ <bool name="config_allow_ussd_over_ims">true</bool>
+
+ <!-- Flag specifying whether VoLTE is available on device -->
+ <bool name="config_device_volte_available">true</bool>
+
+ <!-- Flag specifying whether VoLTE is available on device -->
+ <bool name="config_device_vt_available">true</bool>
+
+ <!-- Flag specifying whether WFC over IMS is availasble on device -->
+ <bool name="config_device_wfc_ims_available">true</bool>
+
+ <!-- An integer representing a timeout value in milliseconds that will be used to delay a
+ radio power off command until IMS deregistration completes. If 0, this feature is disabled
+ and there will be no delay. -->
+ <integer name="config_delay_for_ims_dereg_millis">3000</integer>
+
+ <!-- Whether the new Auto Selection Network UI should be shown -->
+ <bool name="config_enableNewAutoSelectNetworkUI">true</bool>
+
+ <!-- Is the device capable of hot swapping an UICC Card -->
+ <bool name="config_hotswapCapable">true</bool>
+
+ <!-- The default refresh rate. P21 manages this using the peak refresh rate setting, so set
+ this value to 0 so it has no effect. -->
+ <integer name="config_defaultRefreshRate">0</integer>
+
+ <!-- The default peak refresh rate. -->
+ <integer name="config_defaultPeakRefreshRate">60</integer>
+
+ <!-- Optional IPsec algorithms enabled by this device, defaulting to empty. OEMs can override
+ it by providing a list of algorithm names in an overlay config.xml file.
+
+ As Android releases new versions, more algorithms are becoming mandatory. Mandatory
+ algorithms will be automatically enabled on the device. Optional algorithms need
+ to be explicitly declared in this resource to be enabled.
+ * SDK level 28 makes the following algorithms mandatory : "cbc(aes)", "hmac(md5)",
+ "hmac(sha1)", "hmac(sha256)", "hmac(sha384)", "hmac(sha512)", "rfc4106(gcm(aes))"
+ * SDK level 31 makes the following algorithms mandatory : "rfc3686(ctr(aes))",
+ "xcbc(aes)", "rfc7539esp(chacha20,poly1305)"
+ -->
+ <string-array name="config_optionalIpSecAlgorithms" translatable="false">
+ <!-- Add algorithm here -->
+ <item>"xcbc(aes)"</item>
+ <item>"rfc3686(ctr(aes))"</item>
+ </string-array>
+
+ <!-- List supported color modes. -->
+ <integer-array name="config_availableColorModes">
+ <item>0</item> <!-- COLOR_MODE_NATURAL -->
+ <item>256</item> <!-- vendor color mode boosted -->
+ <item>3</item> <!-- COLOR_MODE_AUTOMATIC -->
+ </integer-array>
+
+ <integer-array name="config_mappedColorModes">
+ <item>0</item> <!-- COLOR_MODE_NATURAL -->
+ <item>256</item> <!-- COLOR_MODE_BOOSTED -->
+ <item>3</item> <!-- COLOR_MODE_SATURATED -->
+ <item>3</item> <!-- COLOR_MODE_AUTOMATIC -->
+ </integer-array>
+
+ <!-- Color mode to use when accessibility transforms are enabled. This color mode must be
+ supported by the device, but not necessarily appear in config_availableColorModes. The
+ regularly selected color mode will be used if this value is negative. -->
+ <integer name="config_accessibilityColorMode">2</integer>
+
+ <!-- Boolean indicating whether the HWC setColorTransform function can be performed efficiently
+ in hardware. -->
+ <bool name="config_setColorTransformAccelerated">true</bool>
+
+ <!-- Default color temperature, in Kelvin, to tint the screen when night display is
+ activated. -->
+ <integer name="config_nightDisplayColorTemperatureDefault">3339</integer>
+
+ <!-- Whether the device enable the standalone (SA) mode of 5G NR.-->
+ <bool name="config_telephony5gStandalone">true</bool>
+ <!-- Whether the device enable the non-standalone (NSA) mode of 5G NR.-->
+ <bool name="config_telephony5gNonStandalone">true</bool>
+
+ <!-- An array of device capabilities defined by GSMA SGP.22 v2.2.2, and their corresponding major
+ version. -->
+ <string-array translatable="false" name="config_telephonyEuiccDeviceCapabilities">
+ <item>"gsm,8"</item>
+ <item>"utran,9"</item>
+ <item>"eutran,15"</item>
+ <item>"nrepc,15"</item>
+ <item>"nr5gc,15"</item>
+ <item>"eutran5gc,15"</item>
+ </string-array>
+
+ <!-- Auto-brightness sensor type string -->
+ <string name="config_displayLightSensorType">"com.google.sensor.auto_brightness"</string>
+
+ <!-- Default list of files pinned by the Pinner Service -->
+ <string-array translatable="false" name="config_defaultPinnerServiceFiles">
+ <item>"/apex/com.android.art/javalib/core-oj.jar"</item>
+ <item>"/apex/com.android.art/javalib/core-libart.jar"</item>
+ <item>"/system/framework/framework.jar"</item>
+ <item>"/system/framework/services.jar"</item>
+ <item>"/system/bin/surfaceflinger"</item>
+ <item>"/system_ext/priv-app/SystemUIGoogle/SystemUIGoogle.apk"</item>
+ </string-array>
+
+ <!-- Should the pinner service pin the Camera application? -->
+ <bool name="config_pinnerCameraApp">true</bool>
+
+ <!-- Should the pinner service pin the Home application? -->
+ <bool name="config_pinnerHomeApp">true</bool>
+
+ <!-- The default intensity level for alarm vibrations. See
+ Settings.System.ALARM_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultAlarmVibrationIntensity">3</integer>
+ <!-- The default intensity level for haptic feedback. See
+ Settings.System.HAPTIC_FEEDBACK_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultHapticFeedbackIntensity">3</integer>
+ <!-- The default intensity level for media vibrations. See
+ Settings.System.MEDIA_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultMediaVibrationIntensity">3</integer>
+ <!-- The default intensity level for notification vibrations. See
+ Settings.System.NOTIFICATION_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultNotificationVibrationIntensity">3</integer>
+ <!-- The default intensity level for notification vibrations. See
+ Settings.System.RING_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultRingVibrationIntensity">3</integer>
+
+ <!-- Enables or disables haptic effect when the text insertion/selection handle is moved
+ manually by the user. Off by default, since the expected haptic feedback may not be
+ available on some devices. -->
+ <bool name="config_enableHapticTextHandle">true</bool>
+
+ <!-- Enable Zram writeback feature to allow unused pages in zram be written to flash. -->
+ <bool name="config_zramWriteback">true</bool>
+
+ <!-- List of system components which are allowed to receive ServiceState entries in an
+ un-sanitized form, even if the location toggle is off. This is intended ONLY for system
+ components, such as the telephony stack, which require access to the full ServiceState for
+ tasks such as network registration. -->
+ <string-array name="config_serviceStateLocationAllowedPackages">
+ <item>"com.shannon.imsservice"</item>
+ <item>"com.android.phone"</item>
+ </string-array>
+</resources>
diff --git a/overlay/frameworks/base/core/res/res/values/dimens.xml b/overlay/frameworks/base/core/res/res/values/dimens.xml
new file mode 100644
index 00000000..fc36aa34
--- /dev/null
+++ b/overlay/frameworks/base/core/res/res/values/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2022, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+-->
+<resources>
+ <!-- for 20dp of padding at 3.5px/dp at default density -->
+ <dimen name="rounded_corner_content_padding">70px</dimen>
+</resources>
diff --git a/overlay/frameworks/base/packages/SettingsLib/res/drawable-mcc310-mnc004/ic_5g_plus_mobiledata.xml b/overlay/frameworks/base/packages/SettingsLib/res/drawable-mcc310-mnc004/ic_5g_plus_mobiledata.xml
new file mode 100644
index 00000000..998db3b4
--- /dev/null
+++ b/overlay/frameworks/base/packages/SettingsLib/res/drawable-mcc310-mnc004/ic_5g_plus_mobiledata.xml
@@ -0,0 +1,36 @@
+<!--
+ Copyright (C) 2020 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportWidth="22"
+ android:viewportHeight="17"
+ android:width="22dp"
+ android:height="17dp">
+ <group>
+ <group>
+ <path android:fillColor="#FF000000"
+ android:pathData="M19.98,3.54v2.81c0,0.47 -0.15,0.84 -0.44,1.11s-0.69,0.41 -1.2,0.41c-0.5,0 -0.89,-0.13 -1.19,-0.4s-0.44,-0.63 -0.45,-1.09V3.54h0.88v2.82c0,0.28 0.07,0.48 0.2,0.61c0.13,0.13 0.32,0.19 0.56,0.19c0.49,0 0.75,-0.26 0.75,-0.78V3.54H19.98z"/>
+ <path android:fillColor="#FF000000"
+ android:pathData="M19.42,12.25l0.57,-3.04h0.88l-0.95,4.27h-0.88l-0.69,-2.85l-0.69,2.85h-0.88l-0.95,-4.27h0.88l0.58,3.03l0.7,-3.03h0.74L19.42,12.25z"/>
+ </group>
+ <group>
+ <path android:fillColor="#FF000000"
+ android:pathData="M0.94,8.49l0.43,-4.96H5.7v1.17H2.39L2.15,7.41c0.41,-0.29 0.85,-0.43 1.33,-0.43c0.77,0 1.38,0.3 1.83,0.9c0.44,0.6 0.66,1.41 0.66,2.43c0,1.03 -0.24,1.84 -0.72,2.43c-0.48,0.59 -1.14,0.88 -1.98,0.88c-0.75,0 -1.36,-0.24 -1.83,-0.73c-0.47,-0.49 -0.74,-1.16 -0.81,-2.02h1.13c0.07,0.57 0.23,1 0.49,1.29c0.26,0.29 0.59,0.43 1.01,0.43c0.47,0 0.84,-0.2 1.1,-0.61c0.26,-0.41 0.4,-0.96 0.4,-1.65c0,-0.65 -0.14,-1.18 -0.43,-1.59C4.05,8.32 3.67,8.11 3.19,8.11c-0.4,0 -0.72,0.1 -0.96,0.31L1.9,8.75L0.94,8.49z"/>
+ </group>
+ <path android:fillColor="#FF000000"
+ android:pathData="M13.86,12.24l-0.22,0.27c-0.63,0.73 -1.55,1.1 -2.76,1.1c-1.08,0 -1.92,-0.36 -2.53,-1.07c-0.61,-0.71 -0.93,-1.72 -0.94,-3.02V7.56c0,-1.39 0.28,-2.44 0.84,-3.13c0.56,-0.7 1.39,-1.04 2.51,-1.04c0.95,0 1.69,0.26 2.22,0.79c0.54,0.53 0.83,1.28 0.89,2.26h-1.25c-0.05,-0.62 -0.22,-1.1 -0.52,-1.45c-0.29,-0.35 -0.74,-0.52 -1.34,-0.52c-0.72,0 -1.24,0.23 -1.57,0.7C8.85,5.63 8.68,6.37 8.66,7.4v2.03c0,1 0.19,1.77 0.57,2.31c0.38,0.54 0.93,0.8 1.65,0.8c0.67,0 1.19,-0.16 1.54,-0.49l0.18,-0.17V9.59h-1.82V8.52h3.07V12.24z"/>
+ </group>
+</vector>
+
diff --git a/overlay/frameworks/base/packages/SettingsLib/res/drawable-mcc311-mnc480/ic_5g_plus_mobiledata.xml b/overlay/frameworks/base/packages/SettingsLib/res/drawable-mcc311-mnc480/ic_5g_plus_mobiledata.xml
new file mode 100644
index 00000000..998db3b4
--- /dev/null
+++ b/overlay/frameworks/base/packages/SettingsLib/res/drawable-mcc311-mnc480/ic_5g_plus_mobiledata.xml
@@ -0,0 +1,36 @@
+<!--
+ Copyright (C) 2020 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportWidth="22"
+ android:viewportHeight="17"
+ android:width="22dp"
+ android:height="17dp">
+ <group>
+ <group>
+ <path android:fillColor="#FF000000"
+ android:pathData="M19.98,3.54v2.81c0,0.47 -0.15,0.84 -0.44,1.11s-0.69,0.41 -1.2,0.41c-0.5,0 -0.89,-0.13 -1.19,-0.4s-0.44,-0.63 -0.45,-1.09V3.54h0.88v2.82c0,0.28 0.07,0.48 0.2,0.61c0.13,0.13 0.32,0.19 0.56,0.19c0.49,0 0.75,-0.26 0.75,-0.78V3.54H19.98z"/>
+ <path android:fillColor="#FF000000"
+ android:pathData="M19.42,12.25l0.57,-3.04h0.88l-0.95,4.27h-0.88l-0.69,-2.85l-0.69,2.85h-0.88l-0.95,-4.27h0.88l0.58,3.03l0.7,-3.03h0.74L19.42,12.25z"/>
+ </group>
+ <group>
+ <path android:fillColor="#FF000000"
+ android:pathData="M0.94,8.49l0.43,-4.96H5.7v1.17H2.39L2.15,7.41c0.41,-0.29 0.85,-0.43 1.33,-0.43c0.77,0 1.38,0.3 1.83,0.9c0.44,0.6 0.66,1.41 0.66,2.43c0,1.03 -0.24,1.84 -0.72,2.43c-0.48,0.59 -1.14,0.88 -1.98,0.88c-0.75,0 -1.36,-0.24 -1.83,-0.73c-0.47,-0.49 -0.74,-1.16 -0.81,-2.02h1.13c0.07,0.57 0.23,1 0.49,1.29c0.26,0.29 0.59,0.43 1.01,0.43c0.47,0 0.84,-0.2 1.1,-0.61c0.26,-0.41 0.4,-0.96 0.4,-1.65c0,-0.65 -0.14,-1.18 -0.43,-1.59C4.05,8.32 3.67,8.11 3.19,8.11c-0.4,0 -0.72,0.1 -0.96,0.31L1.9,8.75L0.94,8.49z"/>
+ </group>
+ <path android:fillColor="#FF000000"
+ android:pathData="M13.86,12.24l-0.22,0.27c-0.63,0.73 -1.55,1.1 -2.76,1.1c-1.08,0 -1.92,-0.36 -2.53,-1.07c-0.61,-0.71 -0.93,-1.72 -0.94,-3.02V7.56c0,-1.39 0.28,-2.44 0.84,-3.13c0.56,-0.7 1.39,-1.04 2.51,-1.04c0.95,0 1.69,0.26 2.22,0.79c0.54,0.53 0.83,1.28 0.89,2.26h-1.25c-0.05,-0.62 -0.22,-1.1 -0.52,-1.45c-0.29,-0.35 -0.74,-0.52 -1.34,-0.52c-0.72,0 -1.24,0.23 -1.57,0.7C8.85,5.63 8.68,6.37 8.66,7.4v2.03c0,1 0.19,1.77 0.57,2.31c0.38,0.54 0.93,0.8 1.65,0.8c0.67,0 1.19,-0.16 1.54,-0.49l0.18,-0.17V9.59h-1.82V8.52h3.07V12.24z"/>
+ </group>
+</vector>
+
diff --git a/overlay/frameworks/base/packages/SettingsLib/res/values-mcc310-mnc004/strings.xml b/overlay/frameworks/base/packages/SettingsLib/res/values-mcc310-mnc004/strings.xml
new file mode 100644
index 00000000..f8ed0c01
--- /dev/null
+++ b/overlay/frameworks/base/packages/SettingsLib/res/values-mcc310-mnc004/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Content description of the data connection type 5G UW. [CHAR LIMIT=NONE] -->
+ <string name="data_connection_5g_plus" translatable="false">5G UW</string>
+</resources>
diff --git a/overlay/frameworks/base/packages/SettingsLib/res/values-mcc311-mnc480/strings.xml b/overlay/frameworks/base/packages/SettingsLib/res/values-mcc311-mnc480/strings.xml
new file mode 100644
index 00000000..f8ed0c01
--- /dev/null
+++ b/overlay/frameworks/base/packages/SettingsLib/res/values-mcc311-mnc480/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Content description of the data connection type 5G UW. [CHAR LIMIT=NONE] -->
+ <string name="data_connection_5g_plus" translatable="false">5G UW</string>
+</resources>
diff --git a/overlay/frameworks/base/packages/SettingsLib/res/values-mcc440-mnc20/config.xml b/overlay/frameworks/base/packages/SettingsLib/res/values-mcc440-mnc20/config.xml
new file mode 100644
index 00000000..69c1dac6
--- /dev/null
+++ b/overlay/frameworks/base/packages/SettingsLib/res/values-mcc440-mnc20/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2020, 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 my 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.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Control whether status bar should distinguish HSPA data icon from UMTS
+ data icon on devices -->
+ <bool name="config_hspa_data_distinguishable">false</bool>
+</resources>
diff --git a/overlay/frameworks/base/packages/SystemUI/res/drawable/rounded.xml b/overlay/frameworks/base/packages/SystemUI/res/drawable/rounded.xml
new file mode 100644
index 00000000..7d30f443
--- /dev/null
+++ b/overlay/frameworks/base/packages/SystemUI/res/drawable/rounded.xml
@@ -0,0 +1,24 @@
+<!--
+ Copyright (C) 2020 The Android Open Source Project
+
+ 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="8dp"
+ android:height="8dp"
+ android:viewportWidth="21"
+ android:viewportHeight="21">
+
+ <path
+ android:fillColor="#000000"
+ android:pathData="M0,0L25,0C22.74,0 21.99,0 21.31,0C19.94,0.01 18.83,0.04 17.73,0.11C16.91,0.17 16.09,0.25 15.3,0.36C14.5,0.48 13.72,0.62 12.95,0.81C11.42,1.19 9.97,1.72 8.65,2.43C7.32,3.14 6.12,4.02 5.08,5.07C4.04,6.11 3.15,7.31 2.44,8.64C1.73,9.97 1.19,11.42 0.82,12.94C0.63,13.7 0.48,14.49 0.37,15.29C0.25,16.09 0.17,16.9 0.12,17.72C0.05,18.82 0.02,19.93 0.01,21.55C0.01,22.36 0.01,23.3 0.01,25.56L0,0Z" />
+</vector>
+
diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
new file mode 100644
index 00000000..3697d3a3
--- /dev/null
+++ b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2020, 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.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+<resources>
+ <!-- Doze: does this device support STATE_DOZE? -->
+ <bool name="doze_display_state_supported">true</bool>
+
+ <!-- Doze: does this device support STATE_DOZE_SUSPEND? -->
+ <bool name="doze_suspend_display_state_supported">false</bool>
+
+ <string name="config_rounded_mask">M21,0C19.94,0.01 18.83,0.04 17.73,0.11C16.91,0.17 16.09,0.25 15.3,0.36C14.5,0.48 13.72,0.62 12.95,0.81C11.42,1.19 9.97,1.72 8.65,2.43C7.32,3.14 6.12,4.02 5.08,5.07C4.04,6.11 3.15,7.31 2.44,8.64C1.73,9.97 1.19,11.42 0.82,12.94C0.63,13.7 0.48,14.49 0.37,15.29C0.25,16.09 0.17,16.9 0.12,17.72C0.05,18.82 0.02,19.93 0.01,21.55</string>
+
+ <!-- Override value to use for proximity sensor. -->
+ <string name="proximity_sensor_type" translatable="false">android.sensor.light</string>
+
+ <!-- If using proximity_sensor_type, specifies a threshold value to distinguish near and
+ far break points. A sensor value less than this is considered "near". -->
+ <item name="proximity_sensor_threshold" translatable="false" format="float" type="dimen">12</item>
+
+ <!-- If using proximity_sensor_type, specifies a threshold value to distinguish near and
+ far break points. A sensor value more than this is considered "far". If not set,
+ proximity_sensor_threshold is used. This allows one to implement a latching mechanism for
+ noisy sensors. -->
+ <item name="proximity_sensor_threshold_latch" translatable="false" format="float" type="dimen">24</item>
+
+ <string name="proximity_sensor_secondary_type" translatable="false">android.sensor.proximity</string>
+ <item name="proximity_sensor_secondary_threshold" translatable="false" format="float" type="dimen">5</item>
+</resources>
diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml b/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
new file mode 100644
index 00000000..6d08eb4c
--- /dev/null
+++ b/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+-->
+<resources>
+ <!-- the padding on the top of the statusbar (usually 0) -->
+ <dimen name="status_bar_padding_top">1dp</dimen>
+
+ <!-- Padding for the system icons on the keyguard (when no multi user switch is showing).
+ The icons always have a 4dp padding in the container so we only need 56 extra px of padding
+ for the corners -->
+ <dimen name="system_icons_super_container_avatarless_margin_end">56px</dimen>
+
+ <!-- Multi user switch has some intrinsic padding to it -->
+ <dimen name="multi_user_switch_keyguard_margin">40px</dimen>
+
+ <dimen name="keyguard_carrier_text_margin">70px</dimen>
+
+</resources>
diff --git a/overlay/packages/apps/Settings/res/values/bools.xml b/overlay/packages/apps/Settings/res/values/bools.xml
new file mode 100755
index 00000000..7b26044e
--- /dev/null
+++ b/overlay/packages/apps/Settings/res/values/bools.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <!-- Whether to show a preference item for mobile plan -->
+ <bool name="config_show_mobile_plan">false</bool>
+</resources>
diff --git a/overlay/packages/apps/Settings/res/values/config.xml b/overlay/packages/apps/Settings/res/values/config.xml
new file mode 100755
index 00000000..376cdba6
--- /dev/null
+++ b/overlay/packages/apps/Settings/res/values/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources>
+ <!-- Whether to aggregate for network selection list-->
+ <bool name="config_network_selection_list_aggregation_enabled">true</bool>
+
+ <!-- The switch preference's default value of connectivity helper call quality-->
+ <bool name="config_show_connectivity_helper_call_quality">true</bool>
+ <!-- The switch preference's default value of connectivity helper DeviceToDevice-->
+ <bool name="config_show_connectivity_helper_d2d">true</bool>
+</resources>
diff --git a/overlay/packages/services/Telephony/res/values/config.xml b/overlay/packages/services/Telephony/res/values/config.xml
new file mode 100644
index 00000000..0afa3ca8
--- /dev/null
+++ b/overlay/packages/services/Telephony/res/values/config.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+
+<!-- Phone app resources that may need to be customized
+ for different hardware or product builds. -->
+<resources>
+ <!-- String indicating the package name of the device ImsService implementation for MMTEL. -->
+ <string name="config_ims_mmtel_package">com.shannon.imsservice</string>
+
+ <!-- String indicating the package name of the device ImsService implementation for RCS. -->
+ <string name="config_ims_rcs_package">com.shannon.rcsservice</string>
+
+ <!-- Flag indicating whether the device supports RTT (real-time text) -->
+ <bool name="config_support_rtt">true</bool>
+
+ <!-- Show enabled lte option for lte device -->
+ <bool name="config_enabled_lte" translatable="false">true</bool>
+
+ <!-- String indicating the package name of the device GbaService implementation. -->
+ <string name="config_gba_package" translatable="false">com.shannon.rcsservice</string>
+
+ <!-- This device requires that emergency calls are placed over the default data SIM.
+ This is done mainly to avoid placing emergency calls over CROSS SIM when even
+ though it's the default voice SIM. -->
+ <bool name="config_gnss_supl_requires_default_data_for_emergency">true</bool>
+</resources>
diff --git a/pixelstats/Android.bp b/pixelstats/Android.bp
new file mode 100644
index 00000000..45768d1d
--- /dev/null
+++ b/pixelstats/Android.bp
@@ -0,0 +1,42 @@
+//
+// Copyright (C) 2017 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+cc_binary {
+ name: "pixelstats-vendor",
+ init_rc: ["pixelstats-vendor.gs101.rc"],
+ srcs: [
+ "service.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "liblog",
+ "libutils",
+ "libpixelstats",
+ ],
+ proprietary: true,
+ static_libs: ["chre_client"],
+ header_libs: ["chre_api"],
+}
diff --git a/pixelstats/pixelstats-vendor.gs101.rc b/pixelstats/pixelstats-vendor.gs101.rc
new file mode 100644
index 00000000..d324b6a8
--- /dev/null
+++ b/pixelstats/pixelstats-vendor.gs101.rc
@@ -0,0 +1,8 @@
+on property:sys.boot_completed=1
+ start vendor.pixelstats_vendor
+
+service vendor.pixelstats_vendor /vendor/bin/pixelstats-vendor
+ class hal
+ user system
+ group system context_hub readproc
+ disabled \ No newline at end of file
diff --git a/pixelstats/service.cpp b/pixelstats/service.cpp
new file mode 100644
index 00000000..eb71d45e
--- /dev/null
+++ b/pixelstats/service.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+#define LOG_TAG "pixelstats"
+
+#include <android-base/logging.h>
+#include <pixelstats/SysfsCollector.h>
+#include <pixelstats/UeventListener.h>
+
+#include <thread>
+
+using android::hardware::google::pixel::SysfsCollector;
+using android::hardware::google::pixel::UeventListener;
+
+#define BLOCK_STATS_LENGTH 17
+#define UFSHC_PATH(filename) "/dev/sys/block/bootdevice/" #filename
+#define UFS_ERR_PATH(err_type) UFSHC_PATH(err_stats/) #err_type
+const struct SysfsCollector::SysfsPaths sysfs_paths = {
+ .SlowioReadCntPath = UFSHC_PATH(slowio_read_cnt),
+ .SlowioWriteCntPath = UFSHC_PATH(slowio_write_cnt),
+ .SlowioUnmapCntPath = UFSHC_PATH(slowio_unmap_cnt),
+ .SlowioSyncCntPath = UFSHC_PATH(slowio_sync_cnt),
+ .CycleCountBinsPath = "/sys/class/power_supply/battery/cycle_counts",
+ .UFSLifetimeA = UFSHC_PATH(health_descriptor/life_time_estimation_a),
+ .UFSLifetimeB = UFSHC_PATH(health_descriptor/life_time_estimation_b),
+ .UFSLifetimeC = UFSHC_PATH(health_descriptor/life_time_estimation_c),
+ .F2fsStatsPath = "/sys/fs/f2fs/",
+ .ImpedancePath = "/sys/devices/platform/audiometrics/speaker_impedance",
+ .CodecPath = "/sys/devices/platform/audiometrics/codec_state",
+ .EEPROMPath = "/dev/battery_history",
+ .MitigationPath = "/sys/devices/virtual/pmic/mitigation",
+ .SpeakerTemperaturePath = "/sys/devices/platform/audiometrics/speaker_temp",
+ .SpeakerExcursionPath = "/sys/devices/platform/audiometrics/speaker_excursion",
+ .SpeakerHeartBeatPath = "/sys/devices/platform/audiometrics/speaker_heartbeat",
+ .ResumeLatencyMetricsPath = "/sys/kernel/metrics/resume_latency/resume_latency_metrics",
+ .LongIRQMetricsPath = "/sys/kernel/metrics/irq/long_irq_metrics",
+ .UFSErrStatsPath = {
+ UFS_ERR_PATH(pa_err_count),
+ UFS_ERR_PATH(dl_err_count),
+ UFS_ERR_PATH(nl_err_count),
+ UFS_ERR_PATH(tl_err_count),
+ UFS_ERR_PATH(dme_err_count),
+ UFS_ERR_PATH(fatal_err_count),
+ UFS_ERR_PATH(auto_hibern8_err_count)
+ },
+ .AmsRatePath = "/sys/devices/platform/audiometrics/ams_rate_read_once",
+ .TempResidencyPath = "/sys/kernel/metrics/temp_residency/temp_residency_all/stats",
+};
+
+const struct UeventListener::UeventPaths ueventPaths = {
+ .AudioUevent = "/devices/virtual/amcs/amcs",
+ .WirelessChargerPtmcPath = "/sys/class/power_supply/wireless/device/ptmc_id",
+ .TypeCPartnerUevent = "PRODUCT_TYPE="};
+
+int main() {
+ LOG(INFO) << "starting PixelStats";
+
+ UeventListener ueventListener(ueventPaths);
+ std::thread listenThread(&UeventListener::ListenForever, &ueventListener);
+ listenThread.detach();
+
+ SysfsCollector collector(sysfs_paths);
+ collector.collect(); // This blocks forever.
+
+ return 0;
+}
diff --git a/pkvm/Android.bp b/pkvm/Android.bp
new file mode 100644
index 00000000..dba96019
--- /dev/null
+++ b/pkvm/Android.bp
@@ -0,0 +1,31 @@
+// Copyright (C) 2021 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+cc_binary {
+ name: "pkvm_enabler",
+ vendor: true,
+ init_rc: ["pkvm_enabler.gs101.rc"],
+ srcs: ["pkvm_enabler.c"],
+ shared_libs: ["liblog"],
+}
diff --git a/pkvm/pkvm_enabler.c b/pkvm/pkvm_enabler.c
new file mode 100644
index 00000000..cb14ba6f
--- /dev/null
+++ b/pkvm/pkvm_enabler.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+#define LOG_TAG "pkvm_enabler"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <log/log.h>
+
+#define KVM_DEVICE "/dev/kvm"
+#define MISC_WRITER "/vendor/bin/misc_writer"
+
+int main() {
+ char *newargv[] = { MISC_WRITER, "--set-enable-pkvm", NULL };
+ char *newenvp[] = { NULL };
+ pid_t pid;
+ int ret, wstatus;
+
+ /* Check whether KVM device exists. */
+ ret = access(KVM_DEVICE, F_OK);
+
+ /* If KVM device exists, return SUCCESS to continue booting. */
+ if (ret == 0) {
+ exit(EXIT_SUCCESS);
+ }
+
+ if (ret != -ENOENT) {
+ ALOGW("Unexpected error from access(): %d", ret);
+ }
+
+ /*
+ * If KVM device does not exist, run misc_writer and return FAILURE
+ * to force a reboot.
+ */
+ pid = fork();
+ if (pid == -1) {
+ ALOGE("Could not fork: %d", errno);
+ exit(EXIT_FAILURE);
+ }
+
+ if (pid == 0) {
+ execve(MISC_WRITER, newargv, newenvp);
+ ALOGE("Could not execute " MISC_WRITER ": %d", errno);
+ _exit(EXIT_FAILURE);
+ }
+
+ waitpid(pid, &wstatus, 0);
+ if (WIFEXITED(wstatus)) {
+ ret = WEXITSTATUS(wstatus);
+ if (ret) {
+ ALOGE(MISC_WRITER " exit status: %d", ret);
+ }
+ } else {
+ ALOGE(MISC_WRITER " terminated unexpectedly: %d", wstatus);
+ }
+
+ exit(EXIT_FAILURE);
+}
diff --git a/pkvm/pkvm_enabler.gs101.rc b/pkvm/pkvm_enabler.gs101.rc
new file mode 100644
index 00000000..6f329d30
--- /dev/null
+++ b/pkvm/pkvm_enabler.gs101.rc
@@ -0,0 +1,5 @@
+service pkvm_enabler /vendor/bin/pkvm_enabler
+ reboot_on_failure reboot,pkvm-not-enabled
+
+on early-init
+ exec_start pkvm_enabler \ No newline at end of file
diff --git a/pkvm/pkvm_experiment.rc b/pkvm/pkvm_experiment.rc
new file mode 100644
index 00000000..148f0841
--- /dev/null
+++ b/pkvm/pkvm_experiment.rc
@@ -0,0 +1,13 @@
+service vendor.pkvm_enable /vendor/bin/misc_writer --set-enable-pkvm
+ disabled
+ oneshot
+
+service vendor.pkvm_disable /vendor/bin/misc_writer --set-disable-pkvm
+ disabled
+ oneshot
+
+on property:persist.device_config.virtualization_framework_native.isolated_compilation_enabled=true
+ start vendor.pkvm_enable
+
+on property:persist.device_config.virtualization_framework_native.isolated_compilation_enabled=false
+ start vendor.pkvm_disable
diff --git a/powerhint_a0.json b/powerhint_a0.json
new file mode 100644
index 00000000..76472db1
--- /dev/null
+++ b/powerhint_a0.json
@@ -0,0 +1,343 @@
+{
+ "Nodes": [
+ {
+ "Name": "CPULittleClusterMaxFreq",
+ "Path": "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq",
+ "Values": [
+ "9999999",
+ "1197000"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "CPULittleClusterMinFreq",
+ "Path": "/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq",
+ "Values": [
+ "9999999",
+ "1197000",
+ "0"
+ ],
+ "ResetOnInit": true
+ },
+ {
+ "Name": "CPUBigClusterMaxFreq",
+ "Path": "/sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq",
+ "Values": [
+ "9999999",
+ "1999000"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "CPUBigClusterMinFreq",
+ "Path": "/sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq",
+ "Values": [
+ "9999999",
+ "1197000",
+ "0"
+ ],
+ "ResetOnInit": true
+ },
+ {
+ "Name": "GPUMinFreq",
+ "Path": "/sys/devices/platform/1c500000.mali/hint_min_freq",
+ "Values": [
+ "151000",
+ "302000",
+ "455000",
+ "572000",
+ "670000"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "TAUClampBoost",
+ "Path": "/proc/vendor_sched/ta_uclamp_min",
+ "Values": [
+ "0",
+ "410",
+ "308",
+ "205",
+ "103"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "UfsClkGateEnable",
+ "Path": "/dev/sys/block/bootdevice/clkgate_enable",
+ "Values": [
+ "0",
+ "1"
+ ],
+ "ResetOnInit": true
+ },
+ {
+ "Name": "PowerHALRenderingState",
+ "Path": "vendor.powerhal.rendering",
+ "Values": [
+ "EXPENSIVE_RENDERING",
+ ""
+ ],
+ "Type": "Property"
+ }
+ ],
+ "Actions": [
+ {
+ "PowerHint": "INTERACTION",
+ "Type": "EndHint",
+ "Value": "DISABLE_TA_BOOST"
+ },
+ {
+ "PowerHint": "INTERACTION",
+ "Type": "DoHint",
+ "Value": "INTERACTION_120"
+ },
+ {
+ "PowerHint": "INTERACTION",
+ "Type": "DoHint",
+ "Value": "INTERACTION_90"
+ },
+ {
+ "PowerHint": "INTERACTION",
+ "Type": "DoHint",
+ "Value": "INTERACTION_60"
+ },
+ {
+ "PowerHint": "INTERACTION_120",
+ "Node": "TAUClampBoost",
+ "Duration": 6000,
+ "Value": "410"
+ },
+ {
+ "PowerHint": "INTERACTION_90",
+ "Node": "TAUClampBoost",
+ "Duration": 6000,
+ "Value": "308"
+ },
+ {
+ "PowerHint": "INTERACTION_60",
+ "Node": "TAUClampBoost",
+ "Duration": 6000,
+ "Value": "205"
+ },
+ {
+ "PowerHint": "REFRESH_120FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_60"
+ },
+ {
+ "PowerHint": "REFRESH_120FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_90"
+ },
+ {
+ "PowerHint": "REFRESH_90FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_60"
+ },
+ {
+ "PowerHint": "REFRESH_90FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_120"
+ },
+ {
+ "PowerHint": "REFRESH_60FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_90"
+ },
+ {
+ "PowerHint": "REFRESH_60FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_120"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "EndHint",
+ "Value": "INTERACTION_120"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "EndHint",
+ "Value": "INTERACTION_90"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "EndHint",
+ "Value": "INTERACTION_60"
+ },
+ {
+ "PowerHint": "INTERACTION",
+ "Node": "UfsClkGateEnable",
+ "Duration": 200,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Type": "EndHint",
+ "Value": "DISABLE_TA_BOOST"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "CPUBigClusterMaxFreq",
+ "Duration": 5000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "CPUBigClusterMinFreq",
+ "Duration": 5000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "CPULittleClusterMaxFreq",
+ "Duration": 5000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "CPULittleClusterMinFreq",
+ "Duration": 5000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "TAUClampBoost",
+ "Duration": 5000,
+ "Value": "308"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "UfsClkGateEnable",
+ "Duration": 5000,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "CPUBigClusterMaxFreq",
+ "Duration": 1000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "CPUBigClusterMinFreq",
+ "Duration": 1000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "CPULittleClusterMaxFreq",
+ "Duration": 1000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "CPULittleClusterMinFreq",
+ "Duration": 1000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "UfsClkGateEnable",
+ "Duration": 1000,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "CAMERA_STREAMING_STANDARD",
+ "Node": "CPUBigClusterMaxFreq",
+ "Duration": 0,
+ "Value": "1999000"
+ },
+ {
+ "PowerHint": "CAMERA_STREAMING_STANDARD",
+ "Node": "GPUMinFreq",
+ "Duration": 0,
+ "Value": "670000"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPUBigClusterMaxFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPUBigClusterMinFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPULittleClusterMaxFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPULittleClusterMinFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "EXPENSIVE_RENDERING",
+ "Node": "PowerHALRenderingState",
+ "Duration": 0,
+ "Value": "EXPENSIVE_RENDERING"
+ },
+ {
+ "PowerHint": "EXPENSIVE_RENDERING",
+ "Node": "GPUMinFreq",
+ "Duration": 0,
+ "Value": "455000"
+ },
+ {
+ "PowerHint": "REFRESH_120FPS",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "308"
+ },
+ {
+ "PowerHint": "REFRESH_90FPS",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "205"
+ },
+ {
+ "PowerHint": "REFRESH_60FPS",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "103"
+ },
+ {
+ "PowerHint": "ADPF_DISABLE_TA_BOOST",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "DISABLE_TA_BOOST",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "DoHint",
+ "Value": "DISABLE_TA_BOOST"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "EndHint",
+ "Value": "DISPLAY_UPDATE_IMMINENT"
+ },
+ {
+ "PowerHint": "DISPLAY_UPDATE_IMMINENT",
+ "Type": "EndHint",
+ "Value": "DISABLE_TA_BOOST"
+ }
+ ]
+}
diff --git a/powerhint_a1.json b/powerhint_a1.json
new file mode 100644
index 00000000..7a980ba5
--- /dev/null
+++ b/powerhint_a1.json
@@ -0,0 +1,397 @@
+{
+ "Nodes": [
+ {
+ "Name": "CPULittleClusterMaxFreq",
+ "Path": "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq",
+ "Values": [
+ "9999999",
+ "1197000"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "CPULittleClusterMinFreq",
+ "Path": "/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq",
+ "Values": [
+ "9999999",
+ "1197000",
+ "0"
+ ],
+ "ResetOnInit": true
+ },
+ {
+ "Name": "CPUMidClusterMaxFreq",
+ "Path": "/sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq",
+ "Values": [
+ "9999999",
+ "1999000"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "CPUMidClusterMinFreq",
+ "Path": "/sys/devices/system/cpu/cpu4/cpufreq/scaling_min_freq",
+ "Values": [
+ "9999999",
+ "1197000",
+ "0"
+ ],
+ "ResetOnInit": true
+ },
+ {
+ "Name": "CPUBigClusterMaxFreq",
+ "Path": "/sys/devices/system/cpu/cpu6/cpufreq/scaling_max_freq",
+ "Values": [
+ "9999999",
+ "1999000"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "CPUBigClusterMinFreq",
+ "Path": "/sys/devices/system/cpu/cpu6/cpufreq/scaling_min_freq",
+ "Values": [
+ "9999999",
+ "1106000",
+ "0"
+ ],
+ "ResetOnInit": true
+ },
+ {
+ "Name": "GPUMinFreq",
+ "Path": "/sys/devices/platform/1c500000.mali/hint_min_freq",
+ "Values": [
+ "151000",
+ "302000",
+ "455000",
+ "572000",
+ "670000"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "TAUClampBoost",
+ "Path": "/proc/vendor_sched/ta_uclamp_min",
+ "Values": [
+ "0",
+ "410",
+ "308",
+ "205",
+ "103"
+ ],
+ "DefaultIndex": 0,
+ "ResetOnInit": true
+ },
+ {
+ "Name": "UfsClkGateEnable",
+ "Path": "/dev/sys/block/bootdevice/clkgate_enable",
+ "Values": [
+ "0",
+ "1"
+ ],
+ "ResetOnInit": true
+ },
+ {
+ "Name": "LimitFlashCurrent",
+ "Path": "vendor.camera.max_flash_current",
+ "Values": [
+ "100",
+ "1500"
+ ],
+ "ResetOnInit": true,
+ "Type": "Property"
+ },
+ {
+ "Name": "PowerHALRenderingState",
+ "Path": "vendor.powerhal.rendering",
+ "Values": [
+ "EXPENSIVE_RENDERING",
+ ""
+ ],
+ "Type": "Property"
+ }
+ ],
+ "Actions": [
+ {
+ "PowerHint": "INTERACTION",
+ "Type": "EndHint",
+ "Value": "DISABLE_TA_BOOST"
+ },
+ {
+ "PowerHint": "INTERACTION",
+ "Type": "DoHint",
+ "Value": "INTERACTION_120"
+ },
+ {
+ "PowerHint": "INTERACTION",
+ "Type": "DoHint",
+ "Value": "INTERACTION_90"
+ },
+ {
+ "PowerHint": "INTERACTION",
+ "Type": "DoHint",
+ "Value": "INTERACTION_60"
+ },
+ {
+ "PowerHint": "INTERACTION_120",
+ "Node": "TAUClampBoost",
+ "Duration": 6000,
+ "Value": "410"
+ },
+ {
+ "PowerHint": "INTERACTION_90",
+ "Node": "TAUClampBoost",
+ "Duration": 6000,
+ "Value": "308"
+ },
+ {
+ "PowerHint": "INTERACTION_60",
+ "Node": "TAUClampBoost",
+ "Duration": 6000,
+ "Value": "205"
+ },
+ {
+ "PowerHint": "REFRESH_120FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_60"
+ },
+ {
+ "PowerHint": "REFRESH_120FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_90"
+ },
+ {
+ "PowerHint": "REFRESH_90FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_60"
+ },
+ {
+ "PowerHint": "REFRESH_90FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_120"
+ },
+ {
+ "PowerHint": "REFRESH_60FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_90"
+ },
+ {
+ "PowerHint": "REFRESH_60FPS",
+ "Type": "MaskHint",
+ "Value": "INTERACTION_120"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "EndHint",
+ "Value": "INTERACTION_120"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "EndHint",
+ "Value": "INTERACTION_90"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "EndHint",
+ "Value": "INTERACTION_60"
+ },
+ {
+ "PowerHint": "INTERACTION",
+ "Node": "UfsClkGateEnable",
+ "Duration": 200,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Type": "EndHint",
+ "Value": "DISABLE_TA_BOOST"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "CPUMidClusterMaxFreq",
+ "Duration": 5000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "CPUMidClusterMinFreq",
+ "Duration": 5000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "CPULittleClusterMaxFreq",
+ "Duration": 5000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "CPULittleClusterMinFreq",
+ "Duration": 5000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "TAUClampBoost",
+ "Duration": 5000,
+ "Value": "308"
+ },
+ {
+ "PowerHint": "LAUNCH",
+ "Node": "UfsClkGateEnable",
+ "Duration": 5000,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "CPUBigClusterMaxFreq",
+ "Duration": 1000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "CPUBigClusterMinFreq",
+ "Duration": 1000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "CPULittleClusterMaxFreq",
+ "Duration": 1000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "CPULittleClusterMinFreq",
+ "Duration": 1000,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "CAMERA_LAUNCH",
+ "Node": "UfsClkGateEnable",
+ "Duration": 1000,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "CAMERA_STREAMING_STANDARD",
+ "Node": "CPUBigClusterMaxFreq",
+ "Duration": 0,
+ "Value": "1999000"
+ },
+ {
+ "PowerHint": "CAMERA_STREAMING_STANDARD",
+ "Node": "GPUMinFreq",
+ "Duration": 0,
+ "Value": "670000"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPUBigClusterMaxFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPUBigClusterMinFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPUMidClusterMaxFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPUMidClusterMinFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPULittleClusterMaxFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "FIXED_PERFORMANCE",
+ "Node": "CPULittleClusterMinFreq",
+ "Duration": 0,
+ "Value": "9999999"
+ },
+ {
+ "PowerHint": "REFRESH_120FPS",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "308"
+ },
+ {
+ "PowerHint": "REFRESH_90FPS",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "205"
+ },
+ {
+ "PowerHint": "REFRESH_60FPS",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "103"
+ },
+ {
+ "PowerHint": "ADPF_DISABLE_TA_BOOST",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "DISABLE_TA_BOOST",
+ "Node": "TAUClampBoost",
+ "Duration": 0,
+ "Value": "0"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "DoHint",
+ "Value": "DISABLE_TA_BOOST"
+ },
+ {
+ "PowerHint": "DISPLAY_IDLE",
+ "Type": "EndHint",
+ "Value": "DISPLAY_UPDATE_IMMINENT"
+ },
+ {
+ "PowerHint": "DISPLAY_UPDATE_IMMINENT",
+ "Type": "EndHint",
+ "Value": "DISABLE_TA_BOOST"
+ },
+ {
+ "PowerHint": "THERMAL_FLASH_LED_REDUCE_CRITICAL",
+ "Node": "LimitFlashCurrent",
+ "Duration": 0,
+ "Value": "100"
+ },
+ {
+ "PowerHint": "THERMAL_FLASH_LED_REDUCE_NONE",
+ "Node": "LimitFlashCurrent",
+ "Duration": 0,
+ "Value": "1500"
+ },
+ {
+ "PowerHint": "EXPENSIVE_RENDERING",
+ "Node": "PowerHALRenderingState",
+ "Duration": 0,
+ "Value": "EXPENSIVE_RENDERING"
+ },
+ {
+ "PowerHint": "EXPENSIVE_RENDERING",
+ "Node": "GPUMinFreq",
+ "Duration": 0,
+ "Value": "455000"
+ }
+ ]
+}
diff --git a/powerstats/Android.bp b/powerstats/Android.bp
new file mode 100644
index 00000000..74b72429
--- /dev/null
+++ b/powerstats/Android.bp
@@ -0,0 +1,47 @@
+// Copyright (C) 2020 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.
+
+soong_namespace {
+ imports: [
+ "hardware/google/pixel",
+ "device/google/gs-common/powerstats",
+ ],
+}
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+cc_library {
+ name: "android.hardware.power.stats-impl.gs101",
+ vendor_available: true,
+ export_include_dirs: ["include"],
+ defaults: ["powerstats_pixel_defaults"],
+
+ srcs: [
+ "*.cpp",
+ ],
+
+ shared_libs: [
+ "android.hardware.power.stats-impl.gs-common",
+ "android.hardware.power.stats-impl.pixel",
+ ],
+}
diff --git a/powerstats/Gs101CommonDataProviders.cpp b/powerstats/Gs101CommonDataProviders.cpp
new file mode 100644
index 00000000..035810b4
--- /dev/null
+++ b/powerstats/Gs101CommonDataProviders.cpp
@@ -0,0 +1,712 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <PowerStatsAidl.h>
+#include <Gs101CommonDataProviders.h>
+#include "AocStateResidencyDataProvider.h"
+#include "DevfreqStateResidencyDataProvider.h"
+#include "DvfsStateResidencyDataProvider.h"
+#include "UfsStateResidencyDataProvider.h"
+#include <dataproviders/GenericStateResidencyDataProvider.h>
+#include <dataproviders/IioEnergyMeterDataProvider.h>
+#include <dataproviders/PowerStatsEnergyConsumer.h>
+#include <dataproviders/PowerStatsEnergyAttribution.h>
+#include <dataproviders/PixelStateResidencyDataProvider.h>
+
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <log/log.h>
+
+using aidl::android::hardware::power::stats::AocStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::DevfreqStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::DvfsStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::UfsStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::EnergyConsumerType;
+using aidl::android::hardware::power::stats::GenericStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::IioEnergyMeterDataProvider;
+using aidl::android::hardware::power::stats::PixelStateResidencyDataProvider;
+using aidl::android::hardware::power::stats::PowerStatsEnergyConsumer;
+
+constexpr char kBootHwSoCRev[] = "ro.boot.hw.soc.rev";
+
+void addAoC(std::shared_ptr<PowerStats> p) {
+ // AoC clock is synced from "libaoc.c"
+ static const uint64_t AOC_CLOCK = 4096;
+ std::string prefix = "/sys/devices/platform/19000000.aoc/control/";
+
+ // Add AoC cores (a32, ff1, hf0, and hf1)
+ std::vector<std::pair<std::string, std::string>> coreIds = {
+ {"AoC-A32", prefix + "a32_"},
+ {"AoC-FF1", prefix + "ff1_"},
+ {"AoC-HF1", prefix + "hf1_"},
+ {"AoC-HF0", prefix + "hf0_"},
+ };
+ std::vector<std::pair<std::string, std::string>> coreStates = {
+ {"DWN", "off"}, {"RET", "retention"}, {"WFI", "wfi"}};
+ p->addStateResidencyDataProvider(std::make_unique<AocStateResidencyDataProvider>(coreIds,
+ coreStates, AOC_CLOCK));
+
+ // Add AoC voltage stats
+ std::vector<std::pair<std::string, std::string>> voltageIds = {
+ {"AoC-Voltage", prefix + "voltage_"},
+ };
+ std::vector<std::pair<std::string, std::string>> voltageStates = {{"NOM", "nominal"},
+ {"SUD", "super_underdrive"},
+ {"UUD", "ultra_underdrive"},
+ {"UD", "underdrive"}};
+ p->addStateResidencyDataProvider(
+ std::make_unique<AocStateResidencyDataProvider>(voltageIds, voltageStates, AOC_CLOCK));
+
+ // Add AoC monitor mode
+ std::vector<std::pair<std::string, std::string>> monitorIds = {
+ {"AoC", prefix + "monitor_"},
+ };
+ std::vector<std::pair<std::string, std::string>> monitorStates = {
+ {"MON", "mode"},
+ };
+ p->addStateResidencyDataProvider(
+ std::make_unique<AocStateResidencyDataProvider>(monitorIds, monitorStates, AOC_CLOCK));
+
+ // Add AoC restart count
+ const GenericStateResidencyDataProvider::StateResidencyConfig restartCountConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "",
+ .totalTimeSupported = false,
+ .lastEntrySupported = false,
+ };
+ const std::vector<std::pair<std::string, std::string>> restartCountHeaders = {
+ std::make_pair("RESTART", ""),
+ };
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(
+ generateGenericStateResidencyConfigs(restartCountConfig, restartCountHeaders),
+ "AoC-Count", "");
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/19000000.aoc/restart_count", cfgs));
+}
+
+void addDvfsStats(std::shared_ptr<PowerStats> p) {
+ // A constant to represent the number of nanoseconds in one millisecond
+ const int NS_TO_MS = 1000000;
+
+ std::vector<DvfsStateResidencyDataProvider::Config> cfgs;
+
+ cfgs.push_back({"MIF", {
+ std::make_pair("3172MHz", "3172000"),
+ std::make_pair("2730MHz", "2730000"),
+ std::make_pair("2535MHz", "2535000"),
+ std::make_pair("2288MHz", "2288000"),
+ std::make_pair("2028MHz", "2028000"),
+ std::make_pair("1716MHz", "1716000"),
+ std::make_pair("1539MHz", "1539000"),
+ std::make_pair("1352MHz", "1352000"),
+ std::make_pair("1014MHz", "1014000"),
+ std::make_pair("845MHz", "845000"),
+ std::make_pair("676MHz", "676000"),
+ std::make_pair("546MHz", "546000"),
+ std::make_pair("421MHz", "421000"),
+ std::make_pair("0MHz", "0"),
+ }});
+
+ cfgs.push_back({"CL1", {
+ std::make_pair("2466MHz", "2466000"),
+ std::make_pair("2393MHz", "2393000"),
+ std::make_pair("2348MHz", "2348000"),
+ std::make_pair("2253MHz", "2253000"),
+ std::make_pair("2130MHz", "2130000"),
+ std::make_pair("1999MHz", "1999000"),
+ std::make_pair("1836MHz", "1836000"),
+ std::make_pair("1663MHz", "1663000"),
+ std::make_pair("1491MHz", "1491000"),
+ std::make_pair("1328MHz", "1328000"),
+ std::make_pair("1197MHz", "1197000"),
+ std::make_pair("1024MHz", "1024000"),
+ std::make_pair("910MHz", "910000"),
+ std::make_pair("799MHz", "799000"),
+ std::make_pair("696MHz", "696000"),
+ std::make_pair("533MHz", "533000"),
+ std::make_pair("400MHz", "400000"),
+ std::make_pair("0MHz", "0"),
+ }});
+
+ // B0/B1 chips have different DVFS operating points than A0/A1 SoC
+ const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0);
+ if (socRev >= 2) {
+ cfgs.push_back({"CL0", {
+ std::make_pair("2196MHz", "2196000"),
+ std::make_pair("2098MHz", "2098000"),
+ std::make_pair("2024MHz", "2024000"),
+ std::make_pair("1950MHz", "1950000"),
+ std::make_pair("1803MHz", "1803000"),
+ std::make_pair("1704MHz", "1704000"),
+ std::make_pair("1598MHz", "1598000"),
+ std::make_pair("1401MHz", "1401000"),
+ std::make_pair("1328MHz", "1328000"),
+ std::make_pair("1197MHz", "1197000"),
+ std::make_pair("1098MHz", "1098000"),
+ std::make_pair("930MHz", "930000"),
+ std::make_pair("738MHz", "738000"),
+ std::make_pair("574MHz", "574000"),
+ std::make_pair("300MHz", "300000"),
+ std::make_pair("0MHz", "0"),
+ }});
+
+ cfgs.push_back({"CL2", {
+ std::make_pair("3195MHz", "3195000"),
+ std::make_pair("3097MHz", "3097000"),
+ std::make_pair("2950MHz", "2950000"),
+ std::make_pair("2850MHz", "2850000"),
+ std::make_pair("2802MHz", "2802000"),
+ std::make_pair("2704MHz", "2704000"),
+ std::make_pair("2630MHz", "2630000"),
+ std::make_pair("2507MHz", "2507000"),
+ std::make_pair("2401MHz", "2401000"),
+ std::make_pair("2252MHz", "2252000"),
+ std::make_pair("2188MHz", "2188000"),
+ std::make_pair("2048MHz", "2048000"),
+ std::make_pair("1826MHz", "1826000"),
+ std::make_pair("1745MHz", "1745000"),
+ std::make_pair("1582MHz", "1582000"),
+ std::make_pair("1426MHz", "1426000"),
+ std::make_pair("1277MHz", "1277000"),
+ std::make_pair("1106MHz", "1106000"),
+ std::make_pair("984MHz", "984000"),
+ std::make_pair("851MHz", "851000"),
+ std::make_pair("500MHz", "500000"),
+ std::make_pair("0MHz", "0"),
+ }});
+
+ cfgs.push_back({"TPU", {
+ std::make_pair("1230MHz", "1230000"),
+ std::make_pair("1066MHz", "1066000"),
+ std::make_pair("800MHz", "800000"),
+ std::make_pair("500MHz", "500000"),
+ std::make_pair("226MHz", "226000"),
+ std::make_pair("RET_SLOW", "6"),
+ std::make_pair("S_OFF", "5"),
+ std::make_pair("S_SLOW", "4"),
+ std::make_pair("DS_FAST", "3"),
+ std::make_pair("DS_SLOW", "2"),
+ std::make_pair("DS_OFF", "1"),
+ std::make_pair("OFF", "0"),
+ }});
+ } else {
+ cfgs.push_back({"CL0", {
+ std::make_pair("2196MHz", "2196000"),
+ std::make_pair("2098MHz", "2098000"),
+ std::make_pair("2024MHz", "2024000"),
+ std::make_pair("1950MHz", "1950000"),
+ std::make_pair("1868MHz", "1868000"),
+ std::make_pair("1745MHz", "1745000"),
+ std::make_pair("1598MHz", "1598000"),
+ std::make_pair("1459MHz", "1459000"),
+ std::make_pair("1328MHz", "1328000"),
+ std::make_pair("1197MHz", "1197000"),
+ std::make_pair("1098MHz", "1098000"),
+ std::make_pair("889MHz", "889000"),
+ std::make_pair("738MHz", "738000"),
+ std::make_pair("574MHz", "574000"),
+ std::make_pair("300MHz", "300000"),
+ std::make_pair("0MHz", "0"),
+ }});
+
+ cfgs.push_back({"CL2", {
+ std::make_pair("3195MHz", "3195000"),
+ std::make_pair("3097MHz", "3097000"),
+ std::make_pair("2999MHz", "2999000"),
+ std::make_pair("2900MHz", "2900000"),
+ std::make_pair("2802MHz", "2802000"),
+ std::make_pair("2704MHz", "2704000"),
+ std::make_pair("2630MHz", "2630000"),
+ std::make_pair("2507MHz", "2507000"),
+ std::make_pair("2302MHz", "2302000"),
+ std::make_pair("2188MHz", "2188000"),
+ std::make_pair("2048MHz", "2048000"),
+ std::make_pair("1901MHz", "1901000"),
+ std::make_pair("1745MHz", "1745000"),
+ std::make_pair("1582MHz", "1582000"),
+ std::make_pair("1426MHz", "1426000"),
+ std::make_pair("1237MHz", "1237000"),
+ std::make_pair("1106MHz", "1106000"),
+ std::make_pair("984MHz", "984000"),
+ std::make_pair("848MHz", "848000"),
+ std::make_pair("500MHz", "500000"),
+ std::make_pair("0MHz", "0"),
+ }});
+
+ cfgs.push_back({"TPU", {
+ std::make_pair("1393MHz", "1393000"),
+ std::make_pair("1180MHz", "1180000"),
+ std::make_pair("1049MHz", "1049000"),
+ std::make_pair("967MHz", "967000"),
+ std::make_pair("721MHz", "721000"),
+ std::make_pair("648MHz", "648000"),
+ std::make_pair("455MHz", "455000"),
+ std::make_pair("250MHz", "250000"),
+ std::make_pair("RET_SLOW", "6"),
+ std::make_pair("S_OFF", "5"),
+ std::make_pair("S_SLOW", "4"),
+ std::make_pair("DS_FAST", "3"),
+ std::make_pair("DS_SLOW", "2"),
+ std::make_pair("DS_OFF", "1"),
+ std::make_pair("OFF", "0"),
+ }});
+ }
+
+ p->addStateResidencyDataProvider(std::make_unique<DvfsStateResidencyDataProvider>(
+ "/sys/devices/platform/acpm_stats/fvp_stats", NS_TO_MS, cfgs));
+}
+
+void addSoC(std::shared_ptr<PowerStats> p) {
+ // A constant to represent the number of nanoseconds in one millisecond.
+ const int NS_TO_MS = 1000000;
+
+ // ACPM stats are reported in nanoseconds. The transform function
+ // converts nanoseconds to milliseconds.
+ std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
+ const GenericStateResidencyDataProvider::StateResidencyConfig lpmStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "success_count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "total_time_ns:",
+ .totalTimeTransform = acpmNsToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_entry_time_ns:",
+ .lastEntryTransform = acpmNsToMs,
+ };
+ const GenericStateResidencyDataProvider::StateResidencyConfig downStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "down_count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "total_down_time_ns:",
+ .totalTimeTransform = acpmNsToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_down_time_ns:",
+ .lastEntryTransform = acpmNsToMs,
+ };
+ const GenericStateResidencyDataProvider::StateResidencyConfig reqStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "req_up_count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "total_req_up_time_ns:",
+ .totalTimeTransform = acpmNsToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_req_up_time_ns:",
+ .lastEntryTransform = acpmNsToMs,
+
+ };
+ const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
+ std::make_pair("SICD", "SICD"),
+ std::make_pair("SLEEP", "SLEEP"),
+ std::make_pair("SLEEP_SLCMON", "SLEEP_SLCMON"),
+ std::make_pair("STOP", "STOP"),
+ };
+ const std::vector<std::pair<std::string, std::string>> mifReqStateHeaders = {
+ std::make_pair("AOC", "AOC"),
+ std::make_pair("GSA", "GSA"),
+ };
+ const std::vector<std::pair<std::string, std::string>> slcReqStateHeaders = {
+ std::make_pair("AOC", "AOC"),
+ };
+
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(lpmStateConfig, powerStateHeaders),
+ "LPM", "LPM:");
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
+ "MIF", "MIF:");
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, mifReqStateHeaders),
+ "MIF-REQ", "MIF_REQ:");
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(downStateConfig, powerStateHeaders),
+ "SLC", "SLC:");
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(reqStateConfig, slcReqStateHeaders),
+ "SLC-REQ", "SLC_REQ:");
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/acpm_stats/soc_stats", cfgs));
+}
+
+void setEnergyMeter(std::shared_ptr<PowerStats> p) {
+ std::vector<const std::string> deviceNames { "s2mpg10-odpm", "s2mpg11-odpm" };
+ p->setEnergyMeterDataProvider(std::make_unique<IioEnergyMeterDataProvider>(deviceNames, true));
+}
+
+void addCPUclusters(std::shared_ptr<PowerStats> p) {
+ // A constant to represent the number of nanoseconds in one millisecond.
+ const int NS_TO_MS = 1000000;
+
+ std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
+ const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "down_count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "total_down_time_ns:",
+ .totalTimeTransform = acpmNsToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_down_time_ns:",
+ .lastEntryTransform = acpmNsToMs,
+ };
+
+ const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = {
+ std::make_pair("DOWN", ""),
+ };
+
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ for (std::string name : {"CORE00", "CORE01", "CORE02", "CORE03", "CORE10", "CORE11",
+ "CORE20", "CORE21", "CLUSTER0", "CLUSTER1", "CLUSTER2"}) {
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders),
+ name, name);
+ }
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/acpm_stats/core_stats", cfgs));
+
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::CPU_CLUSTER, "CPUCL0", {"S4M_VDD_CPUCL0"}));
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::CPU_CLUSTER, "CPUCL1", {"S3M_VDD_CPUCL1"}));
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::CPU_CLUSTER, "CPUCL2", {"S2M_VDD_CPUCL2"}));
+}
+
+void addGPU(std::shared_ptr<PowerStats> p) {
+ // Add gpu energy consumer
+ std::map<std::string, int32_t> stateCoeffs;
+ const int socRev = android::base::GetIntProperty(kBootHwSoCRev, 0);
+
+ // B0/B1 chips have different GPU DVFS operating points than A0/A1 SoC
+ if (socRev >= 2) {
+ stateCoeffs = {
+ {"151000", 642},
+ {"202000", 890},
+ {"251000", 1102},
+ {"302000", 1308},
+ {"351000", 1522},
+ {"400000", 1772},
+ {"471000", 2105},
+ {"510000", 2292},
+ {"572000", 2528},
+ {"701000", 3127},
+ {"762000", 3452},
+ {"848000", 4044}};
+ } else {
+ stateCoeffs = {
+ {"151000", 843},
+ {"302000", 1529},
+ {"455000", 2298},
+ {"572000", 2866},
+ {"670000", 3191}};
+ }
+
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
+ EnergyConsumerType::OTHER, "GPU", {"S2S_VDD_G3D"},
+ {{UID_TIME_IN_STATE, "/sys/devices/platform/1c500000.mali/uid_time_in_state"}},
+ stateCoeffs));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>("GPU",
+ "/sys/bus/platform/devices/1c500000.mali"));
+}
+
+void addMobileRadio(std::shared_ptr<PowerStats> p)
+{
+ // A constant to represent the number of microseconds in one millisecond.
+ const int US_TO_MS = 1000;
+
+ // modem power_stats are reported in microseconds. The transform function
+ // converts microseconds to milliseconds.
+ std::function<uint64_t(uint64_t)> modemUsToMs = [](uint64_t a) { return a / US_TO_MS; };
+ const GenericStateResidencyDataProvider::StateResidencyConfig powerStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "duration_usec:",
+ .totalTimeTransform = modemUsToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_entry_timestamp_usec:",
+ .lastEntryTransform = modemUsToMs,
+ };
+ const std::vector<std::pair<std::string, std::string>> powerStateHeaders = {
+ std::make_pair("SLEEP", "SLEEP:"),
+ };
+
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(powerStateConfig, powerStateHeaders),
+ "MODEM", "");
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/cpif/modem/power_stats", cfgs));
+
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::MOBILE_RADIO, "MODEM", {"VSYS_PWR_MODEM", "VSYS_PWR_RFFE"}));
+}
+
+void addGNSS(std::shared_ptr<PowerStats> p)
+{
+ // A constant to represent the number of microseconds in one millisecond.
+ const int US_TO_MS = 1000;
+
+ // gnss power_stats are reported in microseconds. The transform function
+ // converts microseconds to milliseconds.
+ std::function<uint64_t(uint64_t)> gnssUsToMs = [](uint64_t a) { return a / US_TO_MS; };
+
+ const GenericStateResidencyDataProvider::StateResidencyConfig gnssStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "duration_usec:",
+ .totalTimeTransform = gnssUsToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_entry_timestamp_usec:",
+ .lastEntryTransform = gnssUsToMs,
+ };
+
+ const std::vector<std::pair<std::string, std::string>> gnssStateHeaders = {
+ std::make_pair("ON", "GPS_ON:"),
+ std::make_pair("OFF", "GPS_OFF:"),
+ };
+
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(gnssStateConfig, gnssStateHeaders),
+ "GPS", "");
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/dev/bbd_pwrstat", cfgs));
+
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterConsumer(p,
+ EnergyConsumerType::GNSS, "GPS", {"L9S_GNSS_CORE"}));
+}
+
+void addPCIe(std::shared_ptr<PowerStats> p) {
+ // Add PCIe power entities for Modem and WiFi
+ const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "Cumulative count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "Cumulative duration msec:",
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "Last entry timestamp msec:",
+ };
+ const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
+ std::make_pair("UP", "Link up:"),
+ std::make_pair("DOWN", "Link down:"),
+ };
+
+ // Add PCIe - Modem
+ const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieModemCfgs = {
+ {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "PCIe-Modem",
+ "Version: 1"}
+ };
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/11920000.pcie/power_stats", pcieModemCfgs));
+
+ // Add PCIe - WiFi
+ const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> pcieWifiCfgs = {
+ {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders),
+ "PCIe-WiFi", "Version: 1"}
+ };
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/14520000.pcie/power_stats", pcieWifiCfgs));
+}
+
+void addWifi(std::shared_ptr<PowerStats> p) {
+ // The transform function converts microseconds to milliseconds.
+ std::function<uint64_t(uint64_t)> usecToMs = [](uint64_t a) { return a / 1000; };
+ const GenericStateResidencyDataProvider::StateResidencyConfig stateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "duration_usec:",
+ .totalTimeTransform = usecToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_entry_timestamp_usec:",
+ .lastEntryTransform = usecToMs,
+ };
+ const GenericStateResidencyDataProvider::StateResidencyConfig pcieStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "duration_usec:",
+ .totalTimeTransform = usecToMs,
+ .lastEntrySupported = false,
+ };
+
+ const std::vector<std::pair<std::string, std::string>> stateHeaders = {
+ std::make_pair("AWAKE", "AWAKE:"),
+ std::make_pair("ASLEEP", "ASLEEP:"),
+
+ };
+ const std::vector<std::pair<std::string, std::string>> pcieStateHeaders = {
+ std::make_pair("L0", "L0:"),
+ std::make_pair("L1", "L1:"),
+ std::make_pair("L1_1", "L1_1:"),
+ std::make_pair("L1_2", "L1_2:"),
+ std::make_pair("L2", "L2:"),
+ };
+
+ const std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs = {
+ {generateGenericStateResidencyConfigs(stateConfig, stateHeaders), "WIFI", "WIFI"},
+ {generateGenericStateResidencyConfigs(pcieStateConfig, pcieStateHeaders), "WIFI-PCIE",
+ "WIFI-PCIE"}
+ };
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>("/sys/wifi/power_stats",
+ cfgs));
+}
+
+void addUfs(std::shared_ptr<PowerStats> p) {
+ p->addStateResidencyDataProvider(std::make_unique<UfsStateResidencyDataProvider>("/sys/bus/platform/devices/14700000.ufs/ufs_stats/"));
+}
+
+void addPowerDomains(std::shared_ptr<PowerStats> p) {
+ // A constant to represent the number of nanoseconds in one millisecond.
+ const int NS_TO_MS = 1000000;
+
+ std::function<uint64_t(uint64_t)> acpmNsToMs = [](uint64_t a) { return a / NS_TO_MS; };
+ const GenericStateResidencyDataProvider::StateResidencyConfig cpuStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "on_count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "total_on_time_ns:",
+ .totalTimeTransform = acpmNsToMs,
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "last_on_time_ns:",
+ .lastEntryTransform = acpmNsToMs,
+ };
+
+ const std::vector<std::pair<std::string, std::string>> cpuStateHeaders = {
+ std::make_pair("ON", ""),
+ };
+
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ for (std::string name : {"pd-tpu", "pd-bo", "pd-tnr", "pd-gdc", "pd-mcsc", "pd-ipp",
+ "pd-g3aa", "pd-dns", "pd-itp", "pd-pdp", "pd-csis",
+ "pd-mfc", "pd-g2d", "pd-dpu", "pd-disp", "pd-hsi0",
+ "pd-embedded_g3d", "pd-g3d", "pd-eh"}) {
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(cpuStateConfig, cpuStateHeaders),
+ name, name + ":");
+ }
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ "/sys/devices/platform/acpm_stats/pd_stats", cfgs));
+}
+
+void addDevfreq(std::shared_ptr<PowerStats> p) {
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "INT",
+ "/sys/devices/platform/17000020.devfreq_int/devfreq/17000020.devfreq_int"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "INTCAM",
+ "/sys/devices/platform/17000030.devfreq_intcam/devfreq/17000030.devfreq_intcam"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "DISP",
+ "/sys/devices/platform/17000040.devfreq_disp/devfreq/17000040.devfreq_disp"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "CAM",
+ "/sys/devices/platform/17000050.devfreq_cam/devfreq/17000050.devfreq_cam"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "TNR",
+ "/sys/devices/platform/17000060.devfreq_tnr/devfreq/17000060.devfreq_tnr"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "MFC",
+ "/sys/devices/platform/17000070.devfreq_mfc/devfreq/17000070.devfreq_mfc"));
+
+ p->addStateResidencyDataProvider(std::make_unique<DevfreqStateResidencyDataProvider>(
+ "BO",
+ "/sys/devices/platform/17000080.devfreq_bo/devfreq/17000080.devfreq_bo"));
+}
+
+void addTPU(std::shared_ptr<PowerStats> p) {
+ std::map<std::string, int32_t> stateCoeffs;
+
+ stateCoeffs = {
+ {"226000", 49.25},
+ {"500000", 73.80},
+ {"800000", 86.99},
+ {"1066000", 103.93},
+ {"1230000", 108.10}};
+
+ p->addEnergyConsumer(PowerStatsEnergyConsumer::createMeterAndAttrConsumer(p,
+ EnergyConsumerType::OTHER, "TPU", {"S10M_VDD_TPU"},
+ {{UID_TIME_IN_STATE, "/sys/class/edgetpu/edgetpu-soc/device/tpu_usage"}},
+ stateCoeffs));
+}
+
+/**
+ * Unlike other data providers, which source power entity state residency data from the kernel,
+ * this data provider acts as a general-purpose channel for state residency data providers
+ * that live in user space. Entities are defined here and user space clients of this provider's
+ * vendor service register callbacks to provide state residency data for their given pwoer entity.
+ */
+void addPixelStateResidencyDataProvider(std::shared_ptr<PowerStats> p) {
+
+ auto pixelSdp = std::make_unique<PixelStateResidencyDataProvider>();
+
+ pixelSdp->addEntity("Bluetooth", {{0, "Idle"}, {1, "Active"}, {2, "Tx"}, {3, "Rx"}});
+
+ pixelSdp->start();
+
+ p->addStateResidencyDataProvider(std::move(pixelSdp));
+}
+
+void addGs101CommonDataProviders(std::shared_ptr<PowerStats> p) {
+ setEnergyMeter(p);
+
+ addPixelStateResidencyDataProvider(p);
+ addAoC(p);
+ addDvfsStats(p);
+ addSoC(p);
+ addCPUclusters(p);
+ addGPU(p);
+ addMobileRadio(p);
+ addGNSS(p);
+ addPCIe(p);
+ addWifi(p);
+ addUfs(p);
+ addPowerDomains(p);
+ addDevfreq(p);
+ addTPU(p);
+}
+
+void addNFC(std::shared_ptr<PowerStats> p, const std::string& path) {
+ const GenericStateResidencyDataProvider::StateResidencyConfig nfcStateConfig = {
+ .entryCountSupported = true,
+ .entryCountPrefix = "Cumulative count:",
+ .totalTimeSupported = true,
+ .totalTimePrefix = "Cumulative duration msec:",
+ .lastEntrySupported = true,
+ .lastEntryPrefix = "Last entry timestamp msec:",
+ };
+ const std::vector<std::pair<std::string, std::string>> nfcStateHeaders = {
+ std::make_pair("IDLE", "Idle mode:"),
+ std::make_pair("ACTIVE", "Active mode:"),
+ std::make_pair("ACTIVE-RW", "Active Reader/Writer mode:"),
+ };
+
+ std::vector<GenericStateResidencyDataProvider::PowerEntityConfig> cfgs;
+ cfgs.emplace_back(generateGenericStateResidencyConfigs(nfcStateConfig, nfcStateHeaders),
+ "NFC", "NFC subsystem");
+
+ p->addStateResidencyDataProvider(std::make_unique<GenericStateResidencyDataProvider>(
+ path, cfgs));
+}
diff --git a/powerstats/include/Gs101CommonDataProviders.h b/powerstats/include/Gs101CommonDataProviders.h
new file mode 100644
index 00000000..98e69538
--- /dev/null
+++ b/powerstats/include/Gs101CommonDataProviders.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <PowerStatsAidl.h>
+
+using aidl::android::hardware::power::stats::PowerStats;
+
+void addGs101CommonDataProviders(std::shared_ptr<PowerStats> p);
+
+void addNFC(std::shared_ptr<PowerStats> p, const std::string& path);
diff --git a/radio/config/Pixel_Default.cfg b/radio/config/Pixel_Default.cfg
new file mode 100644
index 00000000..b1a83fde
--- /dev/null
+++ b/radio/config/Pixel_Default.cfg
@@ -0,0 +1 @@
+Pixel_Default.nprf,Pixel_Default_metrics.xml \ No newline at end of file
diff --git a/radio/config/Pixel_Default.nprf b/radio/config/Pixel_Default.nprf
new file mode 100644
index 00000000..76406e44
--- /dev/null
+++ b/radio/config/Pixel_Default.nprf
Binary files differ
diff --git a/radio/config/Pixel_Default_metrics.xml b/radio/config/Pixel_Default_metrics.xml
new file mode 100644
index 00000000..25499465
--- /dev/null
+++ b/radio/config/Pixel_Default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+ <ITEM NAME="COMMON">
+ <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+ </ITEM>
+ <ITEM NAME="LTE">
+ <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="EDGE">
+ <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="HSPA">
+ <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="true"></ITEM>
+ <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="true"></ITEM>
+ <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="true"></ITEM>
+ <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="CDMA">
+ <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+ </ITEM>
+</NODE>
diff --git a/radio/config/Pixel_stability.cfg b/radio/config/Pixel_stability.cfg
new file mode 100644
index 00000000..db01dd11
--- /dev/null
+++ b/radio/config/Pixel_stability.cfg
@@ -0,0 +1 @@
+Pixel_stability.nprf,Pixel_Default_metrics.xml
diff --git a/radio/config/Pixel_stability.nprf b/radio/config/Pixel_stability.nprf
new file mode 100644
index 00000000..fc031883
--- /dev/null
+++ b/radio/config/Pixel_stability.nprf
Binary files differ
diff --git a/radio/config/default.cfg b/radio/config/default.cfg
new file mode 100644
index 00000000..58f9cd39
--- /dev/null
+++ b/radio/config/default.cfg
@@ -0,0 +1 @@
+default.nprf,default_metrics.xml \ No newline at end of file
diff --git a/radio/config/default.nprf b/radio/config/default.nprf
new file mode 100644
index 00000000..e9b3199a
--- /dev/null
+++ b/radio/config/default.nprf
Binary files differ
diff --git a/radio/config/default_NAS_RRC.cfg b/radio/config/default_NAS_RRC.cfg
new file mode 100644
index 00000000..2cd3df23
--- /dev/null
+++ b/radio/config/default_NAS_RRC.cfg
@@ -0,0 +1 @@
+default_NAS_RRC.nprf,default_metrics.xml
diff --git a/radio/config/default_NAS_RRC.nprf b/radio/config/default_NAS_RRC.nprf
new file mode 100644
index 00000000..351827f8
--- /dev/null
+++ b/radio/config/default_NAS_RRC.nprf
Binary files differ
diff --git a/radio/config/default_metrics.xml b/radio/config/default_metrics.xml
new file mode 100644
index 00000000..5a54933a
--- /dev/null
+++ b/radio/config/default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+ <ITEM NAME="COMMON">
+ <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+ </ITEM>
+ <ITEM NAME="LTE">
+ <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="EDGE">
+ <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="HSPA">
+ <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="CDMA">
+ <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+ </ITEM>
+</NODE>
diff --git a/radio/config/default_network.cfg b/radio/config/default_network.cfg
new file mode 100644
index 00000000..fbe56139
--- /dev/null
+++ b/radio/config/default_network.cfg
@@ -0,0 +1 @@
+default_network.nprf,default_metrics.xml
diff --git a/radio/config/default_network.nprf b/radio/config/default_network.nprf
new file mode 100644
index 00000000..f5152cf1
--- /dev/null
+++ b/radio/config/default_network.nprf
Binary files differ
diff --git a/radio/config/default_stability.cfg b/radio/config/default_stability.cfg
new file mode 100644
index 00000000..6974dd67
--- /dev/null
+++ b/radio/config/default_stability.cfg
@@ -0,0 +1 @@
+default_stability.nprf,default_metrics.xml
diff --git a/radio/config/default_stability.nprf b/radio/config/default_stability.nprf
new file mode 100644
index 00000000..b9536a1b
--- /dev/null
+++ b/radio/config/default_stability.nprf
Binary files differ
diff --git a/radio/config/logging.conf b/radio/config/logging.conf
new file mode 100644
index 00000000..d57c82aa
--- /dev/null
+++ b/radio/config/logging.conf
@@ -0,0 +1 @@
+modem_logging_control START -o /data/vendor/radio/logs/always-on -n 10 -s 20 -m /vendor/etc/modem/default.cfg --enable_exmetric --enable_exmetric_internal \ No newline at end of file
diff --git a/radio/config/teamfood_default.cfg b/radio/config/teamfood_default.cfg
new file mode 100644
index 00000000..608ba540
--- /dev/null
+++ b/radio/config/teamfood_default.cfg
@@ -0,0 +1 @@
+teamfood_default.nprf,teamfood_default_metrics.xml \ No newline at end of file
diff --git a/radio/config/teamfood_default.nprf b/radio/config/teamfood_default.nprf
new file mode 100644
index 00000000..9f3f1c56
--- /dev/null
+++ b/radio/config/teamfood_default.nprf
Binary files differ
diff --git a/radio/config/teamfood_default_metrics.xml b/radio/config/teamfood_default_metrics.xml
new file mode 100644
index 00000000..5a54933a
--- /dev/null
+++ b/radio/config/teamfood_default_metrics.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<NODE FILTER="Basic Metrics">
+ <ITEM NAME="COMMON">
+ <ITEM NAME="COMMON_BASIC_INFORMATION" VALUE="0x0100" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_CELL_INFORMATION" VALUE="0x0101" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_DATA_INFORMATION" VALUE="0x0102" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION" VALUE="0x0103" CHECKED="true"></ITEM>
+ <ITEM NAME="COMMON_SMS_INFORMATION" VALUE="0x0104" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_HPLMN_TIMER_INFORMATION" VALUE="0x0105" CHECKED="false"></ITEM>
+ <ITEM NAME="COMMON_SIG_MSG_INFORMATION_MULTI" VALUE="0x0106" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_RRC_SIGNALING_MESSAGE" VALUE="0x0108" CHECKED="true"></ITEM>
+ <ITEM NAME="NR_NAS_SIGNALING_MESSAGE" VALUE="0x0109" CHECKED="true"></ITEM>
+ </ITEM>
+ <ITEM NAME="LTE">
+ <ITEM NAME="LTE_PHY_PHY_STATUS_INFO" VALUE="0x0200" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CELL_SERCH_MEAS_INFO" VALUE="0x0201" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_NCELL_MEAS_INFO" VALUE="0x0202" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_SYSTEM_INF" VALUE="0x0204" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_CHAN_QUAL_INFO" VALUE="0x0205" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PARAMETER_INFO" VALUE="0x0206" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_INFO" VALUE="0x0207" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_THROUGHPUT_INFO" VALUE="0x0208" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_RCVD_SIGNAL_QUALITY_INFO" VALUE="0x0209" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PHICH_TTIB_INFO" VALUE="0x020A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_PHY_PUSCH_TTIB_INFO" VALUE="0x020B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_INFO" VALUE="0x0210" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SYNC_INFO" VALUE="0x0211" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO" VALUE="0x0212" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_UPLINK_INFO" VALUE="0x0213" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DRX_CONFIG" VALUE="0x0214" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_EVENT" VALUE="0x0215" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_PUSCH_STATS" VALUE="0x0216" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RACH_ATTEMPT" VALUE="0x0217" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_UL_SCHED_STATS" VALUE="0x0218" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SECONDARY_CELL_INFO" VALUE="0x0219" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_OTDOA_MEASURE_REPORT_INFO" VALUE="0x021A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_DOWNLINK_INFO2" VALUE="0x021B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_RF_BLACKOUT_TIME" VALUE="0x0220" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_SAR_MTPL" VALUE="0x0221" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L1_ANTENNA_SELECTION" VALUE="0x0222" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SPECIFIC_PARAM" VALUE="0x0230" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_SCH_CONFIG" VALUE="0x0231" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SCH_CONFIG" VALUE="0x0232" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIME_ALIGNMENT_TIMER" VALUE="0x0233" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PHR_CONFIG" VALUE="0x0234" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PREAMBLE_INFO" VALUE="0x0235" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_POWER_RAMPING_STEP" VALUE="0x0236" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_SUPERVISION_INFO" VALUE="0x0237" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAX_HARQ_MSG3TX" VALUE="0x0238" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RACH_INFO" VALUE="0x0239" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RNTI_INFO" VALUE="0x023A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RA_FAILURE_INFO" VALUE="0x023B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_SYNC_STAT_INFO" VALUE="0x023C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_D_SR_STATUS" VALUE="0x023D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BUFFER_STAT_INFO" VALUE="0x023E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_THROUGHPUT_INFO" VALUE="0x023F" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_INFO" VALUE="0x0240" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATUS_INFO" VALUE="0x0241" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_PDCP_INFO" VALUE="0x0242" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_PDCP_INFO" VALUE="0x0243" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_ROHC_CONF_INFO" VALUE="0x0244" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_UL_ROHC_INFO" VALUE="0x0245" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_DL_ROHC_INFO" VALUE="0x0246" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TTI_BUNDLING" VALUE="0x0247" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_MAC_CE" VALUE="0x0248" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_TIMER_STATE" VALUE="0x0249" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_BSR_STATS" VALUE="0x024A" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_RLC_STATS" VALUE="0x024B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_L2_PDCP_STATS" VALUE="0x024C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_SERVING_CELL_INFO = 0x0250" VALUE="0x0250" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_STATUS_VARIABLE_INFO" VALUE="0x0251" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MSG_INFO" VALUE="0x0252" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_INFO" VALUE="0x0253" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_PEER_MULTI_MSG_INFO" VALUE="0x0254" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_RRC_RACH_MSG_INFO" VALUE="0x0255" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_TIMER_STATE_INFO" VALUE="0x0256" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_EVENT" VALUE="0x0257" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_SIM_DATA_INFO = 0x0258" VALUE="0x0258" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_STATE_VARIABLE_INFO" VALUE="0x0259" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_MM_MSG_INFO" VALUE="0x025A" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_CONTEXT" VALUE="0x025B" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EPS_BEARER_QOS" VALUE="0x025C" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_PDP_INFO" VALUE="0x025D" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_IP_INFO" VALUE="0x025E" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_L3_SM_MSG_INFO" VALUE="0x025F" CHECKED="true"></ITEM>
+ <ITEM NAME="LTE_DATA_HANDOVER_STAT_INFO" VALUE="0x0262" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_DATA_CALL_DROP_INFO" VALUE="0x0263" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_TIN_INFO" VALUE="0x0264" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ATTEMPT_INFO" VALUE="0x0265" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_EMM_TIMER_STATE_INFO" VALUE="0x0266" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_NAS_ESM_TIMER_STATE_INFO" VALUE="0x0267" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_PACKET_INFO" VALUE="0x0270" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_PACKET_INFO" VALUE="0x0271" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_OVERALL_STAT_INFO" VALUE="0x0272" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_OVERALL_STAT_INFO" VALUE="0x0273" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_STAT_INFO" VALUE="0x0274" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_STAT_INFO" VALUE="0x0275" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_FRAME_INFO" VALUE= "0x0276" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RTP_CALL_STATS" VALUE="0x0277" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_TX_RTP_INFO" VALUE="0x0278" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_VOLTE_RX_RTP_INFO" VALUE="0x0279" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RRC_MBMS_SERVICE_INFO" VALUE="0x0280" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RX_MODE_INFO" VALUE="0x0290" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_SENSOR_INFO" VALUE="0x0291" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_TX_SWAP_INFO" VALUE="0x0292" CHECKED="false"></ITEM>
+ <ITEM NAME="LTE_RF_STATUS_RF_POWER_INFO" VALUE="0x0293" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="EDGE">
+ <ITEM NAME="EDGE_PHY_TIME_SLOT_INFO" VALUE="0x0300" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_RLC_INFO" VALUE="0x0301" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_RESERVED_MSG_02" VALUE="0x0302" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_MEAS_REPT_INFO" VALUE="0x0303" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_DEDICATED_STATE_INFO" VALUE="0x0304" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_SCELL_INFO" VALUE="0x0305" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_NCELL_INFO" VALUE="0x0306" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_3G_NCELL_INFO" VALUE="0x0307" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HANDOVER_INFO" VALUE="0x0308" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_HO_HISTORY_INFO" VALUE="0x0309" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_BASIC_INFO" VALUE="0x030A" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_MEASUREMENT_INFO" VALUE="0x030B" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_PHY_PWR_CNTRL_INFO" VALUE="0x030C" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_QOS_INFO" VALUE="0x0310" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_MM_GMM_INFO" VALUE="0x0311" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L2_RLC_STATS" VALUE="0x0312" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L3_EVENT" VALUE="0x0313" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_SAR_MTPL" VALUE="0x0320" CHECKED="false"></ITEM>
+ <ITEM NAME="EDGE_L1_ANTENNA_SELECTION" VALUE="0x0321" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="HSPA">
+ <ITEM NAME="HSPA_GP_POWER_CONTROL_INFO" VALUE="0x0400" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_TRCH_BLER_INFO" VALUE="0x0401" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GP_FINGER_INFO" VALUE="0x0402" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO" VALUE="0x0403" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO2" VALUE="0x0404" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_GD_DPA_INFO3" VALUE="0x0405" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CM_STATE" VALUE="0x040D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_TRANSPORT_CHANNEL" VALUE="0x040E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_RL_STATUS" VALUE="0x040F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_UMTS_RF_INFO" VALUE="0x0410" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SEARCH_INFO" VALUE="0x0411" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_FREQ_SEARCH_INFO" VALUE="0x0412" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_POWER_CONTROL_INFO" VALUE="0x0413" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_OLPC_INFO" VALUE="0x0414" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_HSDPA_STATS" VALUE="0x0415" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_MID_TYPE_INFO" VALUE="0x0416" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CELL_MEAS_INFO" VALUE="0x0417" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_MEAS_INFO" VALUE="0x0418" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_RAT_MEAS_INFO" VALUE="0x0419" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTERNAL_MEAS_INFO" VALUE="0x041A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_SERVING_CELL_INFO" VALUE="0x041B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTRA_FREQ_RESEL_INFO" VALUE="0x041C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_INTER_FREQ_RESEL_INFO" VALUE="0x041D" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_RESERVED_MSG_1E" VALUE="0x041E" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL1_CHIPSET_DELAY_INFO" VALUE="0x041F" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_STATUS_INFO" VALUE="0x0420" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_RB_MAP_INFO" VALUE="0x0421" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_NETWORK_INFO" VALUE="0x0422" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_URRC_EVENT" VALUE="0x0423" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_RACH_CONFIG_INFO" VALUE="0x0428" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_UDPCH_CONFIG_INFO" VALUE="0x0429" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UUL_POWER_INFO" VALUE="0x042A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_UPDCP_CHAN_CONF_INFO" VALUE="0x0430" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_AM_CHAN_STAT_INFO" VALUE="0x0431" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_AM_CONFIG_INFO" VALUE="0x0432" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_UM_CHAN_STAT_INFO" VALUE="0x0433" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_URLC_UM_CONFIG_INFO" VALUE="0x0434" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HSUPA_STATS" VALUE="0x0435" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_WCDMA_MAC_INFO" VALUE="0x0436" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_HS_MAC_INFO" VALUE="0x0437" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_INFO" VALUE="0x0438" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_EUL_MAC_STAT_INFO" VALUE="0x0439" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_MM_GMM_INFO" VALUE="0x043A" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_STATS" VALUE="0x043B" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL2_RLC_RESET" VALUE="0x043C" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_CC_INFO" VALUE="0x0450" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SS_INFO" VALUE="0x0451" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_UL3_SM_INFO" VALUE="0x0452" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_RX_STAT = 0x0460" VALUE="0x0460" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_VOC_TX_STAT = 0x0461" VALUE="0x0461" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_SAR_MTPL = 0x0470" VALUE="0x0470" CHECKED="false"></ITEM>
+ <ITEM NAME="HSPA_L1_ANTENNA_SELECTION" VALUE="0x0471" CHECKED="false"></ITEM>
+ </ITEM>
+ <ITEM NAME="CDMA">
+ <ITEM NAME="CDMA_COM_1X_MESSAGE" VALUE="0x0B00" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_EVDO_MESSAGE" VALUE="0x0B01" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_COM_MRU_TABLE_UPDATE_MESSAGE" VALUE="0x0B10" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_RTT_L3_MESSAGE" VALUE="0x0B30" CHECKED="false"></ITEM>
+ <ITEM NAME="CDMA_EVDO_L3_MESSAGE" VALUE="0x0B31" CHECKED="false"></ITEM>
+ </ITEM>
+</NODE>
diff --git a/radio/gnss_blanking.csv b/radio/gnss_blanking.csv
new file mode 100644
index 00000000..54f81e13
--- /dev/null
+++ b/radio/gnss_blanking.csv
@@ -0,0 +1,4 @@
+5
+850,30,
+B39,15,
+
diff --git a/rro_overlays/ConnectivityOverlay/Android.bp b/rro_overlays/ConnectivityOverlay/Android.bp
new file mode 100644
index 00000000..e76c15a3
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/Android.bp
@@ -0,0 +1,9 @@
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+runtime_resource_overlay {
+ name: "ConnectivityOverlay",
+ sdk_version: "current",
+ product_specific: true
+}
diff --git a/rro_overlays/ConnectivityOverlay/AndroidManifest.xml b/rro_overlays/ConnectivityOverlay/AndroidManifest.xml
new file mode 100644
index 00000000..f349b7fb
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<!-- Pixel specific connectivity overlays -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.connectivity.resources.overlay"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <application android:hasCode="false" />
+ <overlay
+ android:targetPackage="com.android.connectivity.resources"
+ android:targetName="ServiceConnectivityResourcesConfig"
+ android:isStatic="true"
+ android:priority="0"/>
+</manifest>
diff --git a/rro_overlays/ConnectivityOverlay/res/values-mcc204-mnc04/config.xml b/rro_overlays/ConnectivityOverlay/res/values-mcc204-mnc04/config.xml
new file mode 100644
index 00000000..2a6d2e5c
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/res/values-mcc204-mnc04/config.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Whether the device should automatically switch away from Wi-Fi networks that lose
+ Internet access. Actual device behaviour is controlled by
+ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. -->
+ <integer translatable="false" name="config_networkAvoidBadWifi">0</integer>
+
+ <!-- Whether the device should actively prefer bad wifi to good cell on Android 12/13
+ for configurations where config_avoidBadWifi=0. -->
+ <integer translatable="false" name="config_activelyPreferBadWifi">0</integer>
+</resources>
diff --git a/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc004/config.xml b/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc004/config.xml
new file mode 100644
index 00000000..3cc7253a
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc004/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Whether the device should automatically switch away from Wi-Fi networks that lose
+ Internet access. Actual device behaviour is controlled by
+ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. -->
+ <integer translatable="false" name="config_networkAvoidBadWifi">0</integer>
+</resources>
diff --git a/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc590/config.xml b/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc590/config.xml
new file mode 100644
index 00000000..3cc7253a
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc590/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Whether the device should automatically switch away from Wi-Fi networks that lose
+ Internet access. Actual device behaviour is controlled by
+ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. -->
+ <integer translatable="false" name="config_networkAvoidBadWifi">0</integer>
+</resources>
diff --git a/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc599/config.xml b/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc599/config.xml
new file mode 100644
index 00000000..3cc7253a
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/res/values-mcc310-mnc599/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Whether the device should automatically switch away from Wi-Fi networks that lose
+ Internet access. Actual device behaviour is controlled by
+ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. -->
+ <integer translatable="false" name="config_networkAvoidBadWifi">0</integer>
+</resources>
diff --git a/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc270/config.xml b/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc270/config.xml
new file mode 100644
index 00000000..3cc7253a
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc270/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Whether the device should automatically switch away from Wi-Fi networks that lose
+ Internet access. Actual device behaviour is controlled by
+ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. -->
+ <integer translatable="false" name="config_networkAvoidBadWifi">0</integer>
+</resources>
diff --git a/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc280/config.xml b/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc280/config.xml
new file mode 100644
index 00000000..3cc7253a
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc280/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Whether the device should automatically switch away from Wi-Fi networks that lose
+ Internet access. Actual device behaviour is controlled by
+ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. -->
+ <integer translatable="false" name="config_networkAvoidBadWifi">0</integer>
+</resources>
diff --git a/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc480/config.xml b/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc480/config.xml
new file mode 100644
index 00000000..3cc7253a
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/res/values-mcc311-mnc480/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Whether the device should automatically switch away from Wi-Fi networks that lose
+ Internet access. Actual device behaviour is controlled by
+ Settings.Global.NETWORK_AVOID_BAD_WIFI. This is the default value of that setting. -->
+ <integer translatable="false" name="config_networkAvoidBadWifi">0</integer>
+</resources>
diff --git a/rro_overlays/ConnectivityOverlay/res/values/config.xml b/rro_overlays/ConnectivityOverlay/res/values/config.xml
new file mode 100644
index 00000000..d9e9b583
--- /dev/null
+++ b/rro_overlays/ConnectivityOverlay/res/values/config.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- If the hardware supports specially marking packets that caused a wakeup of the
+ main CPU, set this value to the mark used. -->
+ <integer translatable="false" name="config_networkWakeupPacketMark">0x80000000</integer>
+
+ <!-- Mask to use when checking skb mark defined in config_networkWakeupPacketMark above. -->
+ <integer translatable="false" name="config_networkWakeupPacketMask">0x80000000</integer>
+
+ <!-- Whether the device should actively prefer bad wifi to good cell on Android 12/13
+ for configurations where config_avoidBadWifi=0. -->
+ <integer translatable="false" name="config_activelyPreferBadWifi">1</integer>
+</resources>
diff --git a/rro_overlays/EuiccSupportPixelOverlay/Android.bp b/rro_overlays/EuiccSupportPixelOverlay/Android.bp
new file mode 100644
index 00000000..cb914787
--- /dev/null
+++ b/rro_overlays/EuiccSupportPixelOverlay/Android.bp
@@ -0,0 +1,18 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+runtime_resource_overlay {
+ name: "EuiccSupportPixelOverlay",
+ theme: "EuiccSupportPixelOverlay",
+ certificate: "platform",
+ sdk_version: "current",
+ product_specific: true
+}
diff --git a/rro_overlays/EuiccSupportPixelOverlay/AndroidManifest.xml b/rro_overlays/EuiccSupportPixelOverlay/AndroidManifest.xml
new file mode 100644
index 00000000..d2b261ad
--- /dev/null
+++ b/rro_overlays/EuiccSupportPixelOverlay/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<!-- Pixel specific EuiccSupportPixel overlays -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.google.euiccpixel.overlay.gs101"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <application android:hasCode="false" />
+ <overlay
+ android:targetPackage="com.google.euiccpixel"
+ android:isStatic="true"
+ android:priority="0"/>
+</manifest>
diff --git a/rro_overlays/EuiccSupportPixelOverlay/res/values/config.xml b/rro_overlays/EuiccSupportPixelOverlay/res/values/config.xml
new file mode 100644
index 00000000..7016dd49
--- /dev/null
+++ b/rro_overlays/EuiccSupportPixelOverlay/res/values/config.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <string-array name="config_state_ready_intent_list">
+ <item>intent:#Intent;action=com.google.android.gms.dck.action.SE_STATE_CHANGED;i.com.google.android.gms.dck.extra.SE_STATE=0;end</item>
+ <item>intent:#Intent;action=com.qorvo.uwb.action.SE_STATE_CHANGED;i.com.qorvo.uwb.extra.SE_STATE=0;end</item>
+ </string-array>
+ <string-array name="config_state_busy_intent_list">
+ <item>intent:#Intent;action=com.google.android.gms.dck.action.SE_STATE_CHANGED;i.com.google.android.gms.dck.extra.SE_STATE=1;end</item>
+ <item>intent:#Intent;action=com.qorvo.uwb.action.SE_STATE_CHANGED;i.com.qorvo.uwb.extra.SE_STATE=1;end</item>
+ </string-array>
+ <string-array name="config_state_request_intent_list">
+ <item>intent:#Intent;action=com.google.android.gms.dck.action.SE_STATE_REQUEST;end</item>
+ <item>intent:#Intent;action=com.qorvo.uwb.action.SE_STATE_REQUEST;end</item>
+ </string-array>
+ <string-array name="config_state_request_permission_list">
+ <item>com.google.android.gms.dck.permission.DIGITAL_KEY_PRIVILEGED</item>
+ <item>com.qorvo.uwb.permission.SE_STATE_REQUEST</item>
+ </string-array>
+</resources>
diff --git a/rro_overlays/WifiOverlay/Android.bp b/rro_overlays/WifiOverlay/Android.bp
new file mode 100644
index 00000000..64259d23
--- /dev/null
+++ b/rro_overlays/WifiOverlay/Android.bp
@@ -0,0 +1,18 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+runtime_resource_overlay {
+ name: "WifiOverlay",
+ theme: "WifiOverlay",
+ certificate: "platform",
+ sdk_version: "current",
+ product_specific: true
+}
diff --git a/rro_overlays/WifiOverlay/AndroidManifest.xml b/rro_overlays/WifiOverlay/AndroidManifest.xml
new file mode 100644
index 00000000..632ac6a4
--- /dev/null
+++ b/rro_overlays/WifiOverlay/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<!-- Pixel specific wifi overlays -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.wifi.resources.pixel"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <application android:hasCode="false" />
+ <overlay
+ android:targetPackage="com.android.wifi.resources"
+ android:targetName="WifiCustomization"
+ android:isStatic="true"
+ android:priority="0"/>
+</manifest>
diff --git a/rro_overlays/WifiOverlay/OWNERS b/rro_overlays/WifiOverlay/OWNERS
new file mode 100644
index 00000000..cd92d6fa
--- /dev/null
+++ b/rro_overlays/WifiOverlay/OWNERS
@@ -0,0 +1,5 @@
+# People who can approve changes for submission
+etancohen@google.com
+arabawy@google.com
+kumachang@google.com
+satk@google.com
diff --git a/rro_overlays/WifiOverlay/res/values/config.xml b/rro_overlays/WifiOverlay/res/values/config.xml
new file mode 100644
index 00000000..4addce85
--- /dev/null
+++ b/rro_overlays/WifiOverlay/res/values/config.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+ <!-- Boolean indicating whether the wifi chipset has 5GHz frequency band support -->
+ <bool translatable="false" name="config_wifi5ghzSupport">true</bool>
+
+ <!-- boolean indicating whether the WiFi chipset has 6GHz band support -->
+ <bool translatable="false" name ="config_wifi6ghzSupport">true</bool>
+
+ <!-- Boolean indicating whether 802.11r Fast BSS Transition is enabled on this platform -->
+ <bool translatable="false" name="config_wifi_fast_bss_transition_enabled">true</bool>
+
+ <!-- Boolean indicating whether the wifi chipset has background scan support -->
+ <bool translatable="false" name="config_wifi_background_scan_support">true</bool>
+
+ <!-- Integer thresholds, do not connect to APs with RSSI lower than these values -->
+ <integer translatable="false" name="config_wifi_framework_wifi_score_entry_rssi_threshold_5GHz">-77</integer>
+ <integer translatable="false" name="config_wifi_framework_wifi_score_entry_rssi_threshold_24GHz">-80</integer>
+ <!-- Integer thresholds for low network score, should be somewhat less than the entry thresholds -->
+ <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz">-80</integer>
+ <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz">-83</integer>
+
+ <!-- Boolean indicating whether or not to revert to default country code when cellular
+ radio is unable to find any MCC information to infer wifi country code from -->
+ <bool translatable="false" name="config_wifi_revert_country_code_on_cellular_loss">false</bool>
+
+ <!-- Boolean indicating whether or not wifi should turn off when emergency call is made -->
+ <bool translatable="false" name="config_wifi_turn_off_during_emergency_call">true</bool>
+
+ <!-- Configure wifi tcp buffersizes in the form:
+ rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max -->
+ <string name="config_wifi_tcp_buffers" translatable="false">524288,2097152,8388608,262144,524288,4194304</string>
+
+ <!-- Enable ACS (auto channel selection) for Wifi hotspot (SAP) -->
+ <bool translatable="false" name="config_wifi_softap_acs_supported">true</bool>
+
+ <!-- Enable 802.11ac for Wifi hotspot (SAP) -->
+ <bool translatable="false" name="config_wifi_softap_ieee80211ac_supported">true</bool>
+
+ <!-- True if the firmware supports connected MAC randomization -->
+ <bool name="config_wifi_connected_mac_randomization_supported">true</bool>
+
+ <!-- True if the firmware supports p2p MAC randomization -->
+ <bool name="config_wifi_p2p_mac_randomization_supported">true</bool>
+
+ <!-- True if the firmware supports ap MAC randomization -->
+ <bool name="config_wifi_ap_mac_randomization_supported">true</bool>
+
+ <!-- True if the firmware supports Wi-Fi link probing -->
+ <bool name="config_wifi_link_probing_supported">true</bool>
+
+ <!-- Indicates that a full bugreport should be triggered when wifi diagnostics detects an error on non-user (i.e debug) builds -->
+ <bool translatable="false" name="config_wifi_diagnostics_bugreport_enabled">true</bool>
+
+ <!-- Default access point SSID used for tethering -->
+ <string name="wifi_tether_configure_ssid_default" translatable="false">Pixel</string>
+
+ <!-- Integer indicating maximum hardware supported client number of soft ap -->
+ <integer translatable="false" name="config_wifiHardwareSoftapMaxClientCount">32</integer>
+
+ <!-- Array indicating wifi fatal firmware alert error code list from driver -->
+ <array translatable="false" name="config_wifi_fatal_firmware_alert_error_code_list">
+ <item>1</item> <!-- ALERT_TX_STALL -->
+ <item>2</item> <!-- ALERT_RX_STALL -->
+ <item>3</item> <!-- ALERT_IOCTL_TIMEOUT -->
+ <item>8</item> <!-- ALERT_FW_QUEUE_STALL -->
+ </array>
+
+ <!-- Integer delay in milliseconds before set wlan interface up during watchdog recovery -->
+ <integer name="config_wifi_framework_recovery_timeout_delay">3000</integer>
+
+ <!-- Number of self recoveries to be attempted per hour. Any fatal errors beyond this will
+ cause the wifi stack to turn wifi off and wait for user input.
+ Set to 0 to turn off recovery attempts and always turn off wifi on failures -->
+ <integer translatable="false" name="config_wifiMaxNativeFailureSelfRecoveryPerHour">10</integer>
+
+ <!-- Wifi driver supports IEEE80211AX for softap -->
+ <bool translatable="false" name="config_wifiSoftapIeee80211axSupported">true</bool>
+
+ <!-- Indicates that 11ax mode is supported on this device
+ Note that if this flag is set to true, then 11ax is assumed to be supported.
+ However, if it is left to the default value of false, the 11ax support will
+ be checked via NL80211 interface -->
+ <bool translatable="false" name="config_wifi11axSupportOverride">true</bool>
+
+ <!-- Wifi driver supports WPA3 Simultaneous Authentication of Equals (WPA3-SAE) for softap -->
+ <bool translatable="false" name="config_wifi_softap_sae_supported">true</bool>
+
+ <!-- Override channel utilization estimation with fixed value, disabled in brcm-based pixels -->
+ <bool translatable="false" name="config_wifiChannelUtilizationOverrideEnabled">false</bool>
+
+ <!-- Enable adding minimum confirmation duration when sending network score to connectivity service. -->
+ <bool translatable="false" name="config_wifiMinConfirmationDurationSendNetworkScoreEnabled">true</bool>
+
+ <!-- Enable concurrent STA + STA peer to peer + internet connectivity -->
+ <bool translatable="false" name="config_wifiMultiStaLocalOnlyConcurrencyEnabled">true</bool>
+
+ <!-- Enable concurrent STA + STA MBB support -->
+ <bool translatable="false" name="config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled">true</bool>
+
+ <!-- Enable concurrent Bridged access point (AP) support -->
+ <bool translatable="false" name="config_wifiBridgedSoftApSupported">true</bool>
+
+ <!-- Enable concurrent STA + Bridged access point (AP) support -->
+ <bool translatable="false" name="config_wifiStaWithBridgedSoftApConcurrencySupported">true</bool>
+
+ <!-- Indicates that SAE Hash-to-Element is supported on this device -->
+ <bool translatable="false" name="config_wifiSaeH2eSupported">true</bool>
+
+ <!-- Enable the default coex channel avoidance algorithm and disable the functionality of
+ WifiManager#setCoexUnsafeChannels. -->
+ <bool translatable="false" name="config_wifiDefaultCoexAlgorithmEnabled">true</bool>
+ <!-- Whether to use the explicit vendor HAL API: IWifiStaIface.setRoamingState for disabling fw roaming. -->
+ <bool translatable="false" name="config_wifiUseHalApiToDisableFwRoaming">true</bool>
+
+ <!-- Indicate the driver doesn't support NL80211 Reg changed event -->
+ <bool translatable="false" name="config_wifiDriverSupportedNl80211RegChangedEvent">false</bool>
+
+ <!-- Indicate whether the verbose logging is always on -->
+ <!-- 0: verbose logging controlled by user
+ 1: verbose logging on by default for userdebug
+ 2: verbose logging on by default for all builds -->
+ <integer translatable="false" name="config_wifiVerboseLoggingAlwaysOnLevel">1</integer>
+
+ <!-- Enable aggregation of Wifi link layer radio stats from all radios -->
+ <bool translatable="false" name="config_wifiLinkLayerAllRadiosStatsAggregationEnabled">true</bool>
+
+ <!-- Enable WPA2 to WPA3 auto-upgrade offload to capable Driver/Firmware -->
+ <bool translatable="false" name="config_wifiSaeUpgradeOffloadEnabled">true</bool>
+</resources>
diff --git a/sensorhal/sensorlist.cpp b/sensorhal/sensorlist.cpp
new file mode 100644
index 00000000..fb621822
--- /dev/null
+++ b/sensorhal/sensorlist.cpp
@@ -0,0 +1,578 @@
+/*
+ * 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.
+ */
+
+#include "sensorlist.h"
+
+#include <math.h>
+
+#include "hubdefs.h"
+
+using namespace android;
+
+const int kVersion = 1;
+
+const float kMinSampleRateHzAccel = 6.250f;
+const float kMaxSampleRateHzAccel = 400.0f;
+const float kAccelRangeG = 16.0f;
+extern const float kScaleAccel = (kAccelRangeG * 9.81f / 32768.0f);
+
+const float kMinSampleRateHzGyro = 6.250f;
+const float kMaxSampleRateHzGyro = 400.0f;
+
+const float kMinSampleRateHzMag = 3.125f;
+const float kMaxSampleRateHzMag = 50.0f;
+extern const float kScaleMag = 0.15f;
+
+const float kMinSampleRateHzPolling = 0.1f;
+const float kMaxSampleRateHzPolling = 25.0f;
+
+const float kMinSampleRateHzPressure = 0.1f;
+const float kMaxSampleRateHzPressure = 10.0f;
+
+const float kMinSampleRateHzTemperature = kMinSampleRateHzPolling;
+const float kMaxSampleRateHzTemperature = kMaxSampleRateHzPolling;
+
+const float kMinSampleRateHzProximity = kMinSampleRateHzPolling;
+const float kMaxSampleRateHzProximity = 5.0;
+
+const float kMinSampleRateHzLight = kMinSampleRateHzPolling;
+const float kMaxSampleRateHzLight = 5.0;
+
+const float kMinSampleRateHzOrientation = 12.5f;
+const float kMaxSampleRateHzOrientation = 200.0f;
+
+#ifdef DIRECT_REPORT_ENABLED
+constexpr uint32_t kDirectReportFlagAccel = (
+ // support up to rate level fast (nominal 200Hz);
+ (SENSOR_DIRECT_RATE_FAST << SENSOR_FLAG_SHIFT_DIRECT_REPORT)
+ // support ashmem and gralloc direct channel
+ | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM
+ | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
+constexpr uint32_t kDirectReportFlagGyro = (
+ // support up to rate level fast (nominal 200Hz);
+ (SENSOR_DIRECT_RATE_FAST << SENSOR_FLAG_SHIFT_DIRECT_REPORT)
+ // support ashmem and gralloc direct channel
+ | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM
+ | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
+constexpr uint32_t kDirectReportFlagMag = (
+ // support up to rate level normal (nominal 50Hz);
+ (SENSOR_DIRECT_RATE_NORMAL << SENSOR_FLAG_SHIFT_DIRECT_REPORT)
+ // support ashmem and gralloc direct channel
+ | SENSOR_FLAG_DIRECT_CHANNEL_ASHMEM
+ | SENSOR_FLAG_DIRECT_CHANNEL_GRALLOC);
+#else
+constexpr uint32_t kDirectReportFlagAccel = 0;
+constexpr uint32_t kDirectReportFlagGyro = 0;
+constexpr uint32_t kDirectReportFlagMag = 0;
+#endif
+
+/*
+ * The fowllowing max count is determined by the total number of blocks
+ * avaliable in the shared nanohub buffer and number of samples each type of
+ * event can hold within a buffer block.
+ * For marlin's case, there are 239 blocks in the shared sensor buffer and
+ * each block can hold 30 OneAxis Samples, 15 ThreeAxis Samples or 24
+ * RawThreeAxies Samples.
+ */
+const int kMaxOneAxisEventCount = 7170;
+const int kMaxThreeAxisEventCount = 3585;
+const int kMaxRawThreeAxisEventCount = 5736;
+
+const int kMinFifoReservedEventCount = 20;
+
+const char SENSOR_STRING_TYPE_INTERNAL_TEMPERATURE[] =
+ "com.google.sensor.internal_temperature";
+const char SENSOR_STRING_TYPE_SYNC[] =
+ "com.google.sensor.sync";
+const char SENSOR_STRING_TYPE_DOUBLE_TWIST[] =
+ "com.google.sensor.double_twist";
+const char SENSOR_STRING_TYPE_DOUBLE_TAP[] =
+ "com.google.sensor.double_tap";
+const char SENSOR_STRING_TYPE_DOUBLE_TOUCH[] =
+ "com.google.sensor.double_touch";
+
+extern const sensor_t kSensorList[] = {
+ {
+ "TMD4903 Proximity Sensor",
+ "AMS",
+ kVersion,
+ COMMS_SENSOR_PROXIMITY,
+ SENSOR_TYPE_PROXIMITY,
+ 5.0f, // maxRange (cm)
+ 1.0f, // resolution (cm)
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzProximity), // minDelay
+ 300, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_PROXIMITY,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzProximity), // maxDelay
+ SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE,
+ { NULL, NULL }
+ },
+ {
+ "TMD4903 Light Sensor",
+ "AMS",
+ kVersion,
+ COMMS_SENSOR_LIGHT,
+ SENSOR_TYPE_LIGHT,
+ 43000.0f, // maxRange (lx)
+ 10.0f, // XXX resolution (lx)
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzLight), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_LIGHT,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzLight), // maxDelay
+ SENSOR_FLAG_ON_CHANGE_MODE,
+ { NULL, NULL }
+ },
+ {
+ "BMI160 accelerometer",
+ "Bosch",
+ kVersion,
+ COMMS_SENSOR_ACCEL,
+ SENSOR_TYPE_ACCELEROMETER,
+ GRAVITY_EARTH * kAccelRangeG, // maxRange
+ GRAVITY_EARTH * kAccelRangeG / 32768.0f, // resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzAccel), // minDelay
+ 3000, // XXX fifoReservedEventCount
+ kMaxRawThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_ACCELEROMETER,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzAccel), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagAccel,
+ { NULL, NULL }
+ },
+ {
+ "BMI160 gyroscope",
+ "Bosch",
+ kVersion,
+ COMMS_SENSOR_GYRO,
+ SENSOR_TYPE_GYROSCOPE,
+ 1000.0f * M_PI / 180.0f, // maxRange
+ 1000.0f * M_PI / (180.0f * 32768.0f), // resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzGyro), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_GYROSCOPE,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzGyro), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagGyro,
+ { NULL, NULL }
+ },
+ {
+ "BMI160 gyroscope (uncalibrated)",
+ "Bosch",
+ kVersion,
+ COMMS_SENSOR_GYRO_UNCALIBRATED,
+ SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
+ 1000.0f * M_PI / 180.0f, // maxRange
+ 1000.0f * M_PI / (180.0f * 32768.0f), // resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzGyro), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzGyro), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagGyro,
+ { NULL, NULL }
+ },
+ {
+ "AK09915 magnetometer",
+ "AKM",
+ kVersion,
+ COMMS_SENSOR_MAG,
+ SENSOR_TYPE_MAGNETIC_FIELD,
+ 1300.0f, // XXX maxRange
+ 0.0f, // XXX resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzMag), // minDelay
+ 600, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_MAGNETIC_FIELD,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzMag), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagMag,
+ { NULL, NULL }
+ },
+ {
+ "AK09915 magnetometer (uncalibrated)",
+ "AKM",
+ kVersion,
+ COMMS_SENSOR_MAG_UNCALIBRATED,
+ SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
+ 1300.0f, // XXX maxRange
+ 0.0f, // XXX resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzMag), // minDelay
+ 600, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzMag), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagMag,
+ { NULL, NULL }
+ },
+ {
+ "BMP285 pressure",
+ "Bosch",
+ kVersion,
+ COMMS_SENSOR_PRESSURE,
+ SENSOR_TYPE_PRESSURE,
+ 1100.0f, // maxRange (hPa)
+ 0.005f, // resolution (hPa)
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzPressure), // minDelay
+ 300, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_PRESSURE,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzPressure), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE,
+ { NULL, NULL }
+ },
+ {
+ "BMP285 temperature",
+ "Bosch",
+ kVersion,
+ COMMS_SENSOR_TEMPERATURE,
+ SENSOR_TYPE_INTERNAL_TEMPERATURE,
+ 85.0f, // maxRange (degC)
+ 0.01, // resolution (degC)
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzTemperature), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_INTERNAL_TEMPERATURE,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzTemperature), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Orientation",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_ORIENTATION,
+ SENSOR_TYPE_ORIENTATION,
+ 360.0f, // maxRange (deg)
+ 1.0f, // XXX resolution (deg)
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_ORIENTATION,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE,
+ { NULL, NULL }
+ },
+ {
+ "BMI160 Step detector",
+ "Bosch",
+ kVersion,
+ COMMS_SENSOR_STEP_DETECTOR,
+ SENSOR_TYPE_STEP_DETECTOR,
+ 1.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ 0, // minDelay
+ 100, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_STEP_DETECTOR,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_SPECIAL_REPORTING_MODE,
+ { NULL, NULL }
+ },
+ {
+ "BMI160 Step counter",
+ "Bosch",
+ kVersion,
+ COMMS_SENSOR_STEP_COUNTER,
+ SENSOR_TYPE_STEP_COUNTER,
+ 1.0f, // XXX maxRange
+ 1.0f, // resolution
+ 0.0f, // XXX power
+ 0, // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_STEP_COUNTER,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_ON_CHANGE_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Significant motion",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_SIGNIFICANT_MOTION,
+ SENSOR_TYPE_SIGNIFICANT_MOTION,
+ 1.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ -1, // minDelay
+ 0, // XXX fifoReservedEventCount
+ 0, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_SIGNIFICANT_MOTION,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Gravity",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_GRAVITY,
+ SENSOR_TYPE_GRAVITY,
+ 1000.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_GRAVITY,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Linear Acceleration",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_LINEAR_ACCEL,
+ SENSOR_TYPE_LINEAR_ACCELERATION,
+ 1000.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_LINEAR_ACCELERATION,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Rotation Vector",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_ROTATION_VECTOR,
+ SENSOR_TYPE_ROTATION_VECTOR,
+ 1000.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_ROTATION_VECTOR,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Geomagnetic Rotation Vector",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_GEO_MAG,
+ SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
+ 1000.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Game Rotation Vector",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_GAME_ROTATION_VECTOR,
+ SENSOR_TYPE_GAME_ROTATION_VECTOR,
+ 1000.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzOrientation), // minDelay
+ 300, // XXX fifoReservedEventCount
+ kMaxThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzOrientation), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Tilt Detector",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_TILT,
+ SENSOR_TYPE_TILT_DETECTOR,
+ 1.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ 0, // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_TILT_DETECTOR,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_SPECIAL_REPORTING_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Pickup Gesture",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_GESTURE,
+ SENSOR_TYPE_PICK_UP_GESTURE,
+ 1.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ -1, // minDelay
+ 0, // XXX fifoReservedEventCount
+ 0, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_PICK_UP_GESTURE,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Sensors Sync",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_SYNC,
+ SENSOR_TYPE_SYNC,
+ 1.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.1f, // XXX power
+ 0, // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_SYNC,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_SPECIAL_REPORTING_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Double Twist",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_DOUBLE_TWIST,
+ SENSOR_TYPE_DOUBLE_TWIST,
+ 1.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.1f, // XXX power
+ 0, // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_DOUBLE_TWIST,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_SPECIAL_REPORTING_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Double Tap",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_DOUBLE_TAP,
+ SENSOR_TYPE_DOUBLE_TAP,
+ 1.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.1f, // XXX power
+ 0, // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_DOUBLE_TAP,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_SPECIAL_REPORTING_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Device Orientation",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_WINDOW_ORIENTATION,
+ SENSOR_TYPE_DEVICE_ORIENTATION,
+ 3.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.1f, // XXX power
+ 0, // minDelay
+ kMinFifoReservedEventCount, // XXX fifoReservedEventCount
+ kMaxOneAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_DEVICE_ORIENTATION,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_ON_CHANGE_MODE,
+ { NULL, NULL }
+ },
+ {
+ "Double Touch",
+ "Google",
+ kVersion,
+ COMMS_SENSOR_DOUBLE_TOUCH,
+ SENSOR_TYPE_DOUBLE_TOUCH,
+ 1.0f, // maxRange
+ 1.0f, // XXX resolution
+ 0.0f, // XXX power
+ -1, // minDelay
+ 0, // XXX fifoReservedEventCount
+ 0, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_DOUBLE_TOUCH,
+ "", // requiredPermission
+ 0, // maxDelay
+ SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE,
+ { NULL, NULL }
+ },
+ {
+ "BMI160 accelerometer (uncalibrated)",
+ "Bosch",
+ kVersion,
+ COMMS_SENSOR_ACCEL_UNCALIBRATED,
+ SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED,
+ GRAVITY_EARTH * kAccelRangeG, // maxRange
+ GRAVITY_EARTH * kAccelRangeG / 32768.0f, // resolution
+ 0.0f, // XXX power
+ (int32_t)(1.0E6f / kMaxSampleRateHzAccel), // minDelay
+ 3000, // XXX fifoReservedEventCount
+ kMaxRawThreeAxisEventCount, // XXX fifoMaxEventCount
+ SENSOR_STRING_TYPE_ACCELEROMETER_UNCALIBRATED,
+ "", // requiredPermission
+ (long)(1.0E6f / kMinSampleRateHzAccel), // maxDelay
+ SENSOR_FLAG_CONTINUOUS_MODE | kDirectReportFlagAccel,
+ { NULL, NULL }
+ },
+};
+
+extern const size_t kSensorCount = sizeof(kSensorList) / sizeof(sensor_t);
diff --git a/sensors/Android.mk b/sensors/Android.mk
new file mode 100644
index 00000000..ce844c9a
--- /dev/null
+++ b/sensors/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ifeq ($(BOARD_USES_EXYNOS_SENSORS_DUMMY), true)
+
+LOCAL_PATH := $(call my-dir)
+
+# HAL module implemenation stored in
+# hw/<SENSORS_HARDWARE_MODULE_ID>.<ro.hardware>.so
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_RELATIVE_PATH := hw
+LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware
+LOCAL_SRC_FILES := sensors_dummy.c
+LOCAL_MODULE := sensors.gs101
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../NOTICE
+LOCAL_PROPRIETARY_MODULE := true
+
+include $(BUILD_SHARED_LIBRARY)
+
+endif
diff --git a/sensors/sensors_dummy.c b/sensors/sensors_dummy.c
new file mode 100644
index 00000000..b1edd562
--- /dev/null
+++ b/sensors/sensors_dummy.c
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* this implements a sensors hardware library for the Android emulator.
+ * the following code should be built as a shared library that will be
+ * placed into /system/lib/hw/sensors.goldfish.so
+ *
+ * it will be loaded by the code in hardware/libhardware/hardware.c
+ * which is itself called from com_android_server_SensorService.cpp
+ */
+
+#define SENSORS_SERVICE_NAME "sensors"
+
+#define LOG_TAG "Dummy_Sensors"
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <log/log.h>
+#include <cutils/sockets.h>
+#include <hardware/sensors.h>
+#include <pthread.h>
+
+#if 0
+#define D(...) ALOGD(__VA_ARGS__)
+#else
+#define D(...) ((void)0)
+#endif
+
+#define E(...) ALOGE(__VA_ARGS__)
+
+/** SENSOR IDS AND NAMES
+ **/
+
+#define MAX_NUM_SENSORS 8
+
+#define SUPPORTED_SENSORS ((1<<MAX_NUM_SENSORS)-1)
+
+#define ID_BASE SENSORS_HANDLE_BASE
+#define ID_ACCELERATION (ID_BASE+0)
+#define ID_MAGNETIC_FIELD (ID_BASE+1)
+#define ID_ORIENTATION (ID_BASE+2)
+#define ID_TEMPERATURE (ID_BASE+3)
+#define ID_PROXIMITY (ID_BASE+4)
+#define ID_LIGHT (ID_BASE+5)
+#define ID_PRESSURE (ID_BASE+6)
+#define ID_HUMIDITY (ID_BASE+7)
+
+#define SENSORS_ACCELERATION (1 << ID_ACCELERATION)
+#define SENSORS_MAGNETIC_FIELD (1 << ID_MAGNETIC_FIELD)
+#define SENSORS_ORIENTATION (1 << ID_ORIENTATION)
+#define SENSORS_TEMPERATURE (1 << ID_TEMPERATURE)
+#define SENSORS_PROXIMITY (1 << ID_PROXIMITY)
+#define SENSORS_LIGHT (1 << ID_LIGHT)
+#define SENSORS_PRESSURE (1 << ID_PRESSURE)
+#define SENSORS_HUMIDITY (1 << ID_HUMIDITY)
+
+#define ID_CHECK(x) ((unsigned)((x) - ID_BASE) < MAX_NUM_SENSORS)
+
+#define SENSORS_LIST \
+ SENSOR_(ACCELERATION,"acceleration") \
+ SENSOR_(MAGNETIC_FIELD,"magnetic-field") \
+ SENSOR_(ORIENTATION,"orientation") \
+ SENSOR_(TEMPERATURE,"temperature") \
+ SENSOR_(PROXIMITY,"proximity") \
+ SENSOR_(LIGHT, "light") \
+ SENSOR_(PRESSURE, "pressure") \
+ SENSOR_(HUMIDITY, "humidity")
+
+static const struct {
+ const char* name;
+ int id; } _sensorIds[MAX_NUM_SENSORS] =
+{
+#define SENSOR_(x,y) { y, ID_##x },
+ SENSORS_LIST
+#undef SENSOR_
+};
+
+static const char*
+_sensorIdToName( int id )
+{
+ int nn;
+ for (nn = 0; nn < MAX_NUM_SENSORS; nn++)
+ if (id == _sensorIds[nn].id)
+ return _sensorIds[nn].name;
+ return "<UNKNOWN>";
+}
+
+static int
+_sensorIdFromName( const char* name )
+{
+ int nn;
+
+ if (name == NULL)
+ return -1;
+
+ for (nn = 0; nn < MAX_NUM_SENSORS; nn++)
+ if (!strcmp(name, _sensorIds[nn].name))
+ return _sensorIds[nn].id;
+
+ return -1;
+}
+
+/* return the current time in nanoseconds */
+static int64_t now_ns(void) {
+ struct timespec ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return (int64_t)ts.tv_sec * 1000000000 + ts.tv_nsec;
+}
+
+/** SENSORS POLL DEVICE
+ **
+ ** This one is used to read sensor data from the hardware.
+ ** We implement this by simply reading the data from the
+ ** emulator through the QEMUD channel.
+ **/
+
+typedef struct SensorDevice {
+ struct sensors_poll_device_1 device;
+ sensors_event_t sensors[MAX_NUM_SENSORS];
+ uint32_t pendingSensors;
+ int64_t timeStart;
+ int64_t timeOffset;
+ uint32_t active_sensors;
+ int fd;
+ pthread_mutex_t lock;
+} SensorDevice;
+
+/* Grab the file descriptor to the emulator's sensors service pipe.
+ * This function returns a file descriptor on success, or -errno on
+ * failure, and assumes the SensorDevice instance's lock is held.
+ *
+ * This is needed because set_delay(), poll() and activate() can be called
+ * from different threads, and poll() is blocking.
+ *
+ * 1) On a first thread, de-activate() all sensors first, then call poll(),
+ * which results in the thread blocking.
+ *
+ * 2) On a second thread, slightly later, call set_delay() then activate()
+ * to enable the acceleration sensor.
+ *
+ * The system expects this to unblock the first thread which will receive
+ * new sensor events after the activate() call in 2).
+ *
+ * This cannot work if both threads don't use the same connection.
+ *
+ * TODO(digit): This protocol is brittle, implement another control channel
+ * for set_delay()/activate()/batch() when supporting HAL 1.3
+ */
+static int sensor_device_get_fd_locked(SensorDevice* dev) {
+ /* Create connection to service on first call */
+ if (dev->fd < 0) {
+ int ret = -errno;
+ E("%s: Could not open connection to service: %s", __FUNCTION__,
+ strerror(-ret));
+ return ret;
+ }
+ return dev->fd;
+}
+
+/* Pick up one pending sensor event. On success, this returns the sensor
+ * id, and sets |*event| accordingly. On failure, i.e. if there are no
+ * pending events, return -EINVAL.
+ *
+ * Note: The device's lock must be acquired.
+ */
+static int sensor_device_pick_pending_event_locked(SensorDevice* d,
+ sensors_event_t* event)
+{
+ uint32_t mask = SUPPORTED_SENSORS & d->pendingSensors;
+
+ if (mask) {
+ uint32_t i = 31 - __builtin_clz(mask);
+
+ pthread_mutex_lock(&d->lock);
+ d->pendingSensors &= ~(1U << i);
+ *event = d->sensors[i];
+ event->sensor = i;
+ event->version = sizeof(*event);
+ pthread_mutex_unlock(&d->lock);
+ D("%s: %d [%f, %f, %f]", __FUNCTION__,
+ i,
+ event->data[0],
+ event->data[1],
+ event->data[2]);
+ return i;
+ }
+ E("No sensor to return!!! pendingSensors=0x%08x", d->pendingSensors);
+ // we may end-up in a busy loop, slow things down, just in case.
+ usleep(1000);
+ return -EINVAL;
+}
+
+static int sensor_device_close(struct hw_device_t* dev0)
+{
+ SensorDevice* dev = (void*)dev0;
+ // Assume that there are no other threads blocked on poll()
+ if (dev->fd >= 0) {
+ close(dev->fd);
+ dev->fd = -1;
+ }
+ pthread_mutex_destroy(&dev->lock);
+ free(dev);
+ return 0;
+}
+
+/* Return an array of sensor data. This function blocks until there is sensor
+ * related events to report. On success, it will write the events into the
+ * |data| array, which contains |count| items. The function returns the number
+ * of events written into the array, which shall never be greater than |count|.
+ * On error, return -errno code.
+ *
+ * Note that according to the sensor HAL [1], it shall never return 0!
+ *
+ * [1] http://source.android.com/devices/sensors/hal-interface.html
+ */
+static int sensor_device_poll(struct sensors_poll_device_t *dev0,
+ sensors_event_t* data, int count)
+{
+ return -EIO;
+}
+
+static int sensor_device_activate(struct sensors_poll_device_t *dev0,
+ int handle,
+ int enabled)
+{
+ SensorDevice* dev = (void*)dev0;
+
+ D("%s: handle=%s (%d) enabled=%d", __FUNCTION__,
+ _sensorIdToName(handle), handle, enabled);
+
+ /* Sanity check */
+ if (!ID_CHECK(handle)) {
+ E("%s: bad handle ID", __FUNCTION__);
+ return -EINVAL;
+ }
+
+ /* Exit early if sensor is already enabled/disabled. */
+ uint32_t mask = (1U << handle);
+ uint32_t sensors = enabled ? mask : 0;
+
+ pthread_mutex_lock(&dev->lock);
+
+ uint32_t active = dev->active_sensors;
+ uint32_t new_sensors = (active & ~mask) | (sensors & mask);
+ uint32_t changed = active ^ new_sensors;
+
+ if (changed)
+ dev->active_sensors = new_sensors;
+
+ pthread_mutex_unlock(&dev->lock);
+ return 0;
+}
+
+static int sensor_device_default_flush(
+ struct sensors_poll_device_1* dev0,
+ int handle) {
+
+ SensorDevice* dev = (void*)dev0;
+
+ D("%s: handle=%s (%d)", __FUNCTION__,
+ _sensorIdToName(handle), handle);
+
+ /* Sanity check */
+ if (!ID_CHECK(handle)) {
+ E("%s: bad handle ID", __FUNCTION__);
+ return -EINVAL;
+ }
+
+ pthread_mutex_lock(&dev->lock);
+ dev->sensors[handle].version = META_DATA_VERSION;
+ dev->sensors[handle].type = SENSOR_TYPE_META_DATA;
+ dev->sensors[handle].sensor = 0;
+ dev->sensors[handle].timestamp = 0;
+ dev->sensors[handle].meta_data.what = META_DATA_FLUSH_COMPLETE;
+ dev->pendingSensors |= (1U << handle);
+ pthread_mutex_unlock(&dev->lock);
+
+ return 0;
+}
+
+static int sensor_device_set_delay(struct sensors_poll_device_t *dev0,
+ int handle __unused,
+ int64_t ns)
+{
+ return 0;
+}
+
+static int sensor_device_default_batch(
+ struct sensors_poll_device_1* dev,
+ int sensor_handle,
+ int flags,
+ int64_t sampling_period_ns,
+ int64_t max_report_latency_ns) {
+ return sensor_device_set_delay(dev, sensor_handle, sampling_period_ns);
+}
+
+/** MODULE REGISTRATION SUPPORT
+ **
+ ** This is required so that hardware/libhardware/hardware.c
+ ** will dlopen() this library appropriately.
+ **/
+
+/*
+ * the following is the list of all supported sensors.
+ * this table is used to build sSensorList declared below
+ * according to which hardware sensors are reported as
+ * available from the emulator (see get_sensors_list below)
+ *
+ * note: numerical values for maxRange/resolution/power for
+ * all sensors but light, pressure and humidity were
+ * taken from the reference AK8976A implementation
+ */
+static const struct sensor_t sSensorListInit[] = {
+ { .name = "Accelerometer",
+ .vendor = "The Android Open Source Project",
+ .version = 1,
+ .handle = ID_ACCELERATION,
+ .type = SENSOR_TYPE_ACCELEROMETER,
+ .maxRange = 2.8f,
+ .resolution = 1.0f/4032.0f,
+ .power = 3.0f,
+ .minDelay = 10000,
+ .maxDelay = 60 * 1000 * 1000,
+ .fifoReservedEventCount = 0,
+ .fifoMaxEventCount = 0,
+ .stringType = 0,
+ .requiredPermission = 0,
+ .flags = SENSOR_FLAG_CONTINUOUS_MODE,
+ .reserved = {}
+ },
+};
+
+static struct sensor_t sSensorList[1];
+
+static int sensors__get_sensors_list(struct sensors_module_t* module __unused,
+ struct sensor_t const** list)
+{
+ *list = sSensorList;
+
+ return 0;
+}
+
+static int
+open_sensors(const struct hw_module_t* module,
+ const char* name,
+ struct hw_device_t* *device)
+{
+ int status = -EINVAL;
+
+ D("%s: name=%s", __FUNCTION__, name);
+
+ if (!strcmp(name, SENSORS_HARDWARE_POLL)) {
+ SensorDevice *dev = malloc(sizeof(*dev));
+
+ memset(dev, 0, sizeof(*dev));
+
+ dev->device.common.tag = HARDWARE_DEVICE_TAG;
+ dev->device.common.version = SENSORS_DEVICE_API_VERSION_1_3;
+ dev->device.common.module = (struct hw_module_t*) module;
+ dev->device.common.close = sensor_device_close;
+ dev->device.poll = sensor_device_poll;
+ dev->device.activate = sensor_device_activate;
+ dev->device.setDelay = sensor_device_set_delay;
+
+ // Version 1.3-specific functions
+ dev->device.batch = sensor_device_default_batch;
+ dev->device.flush = sensor_device_default_flush;
+
+ dev->fd = -1;
+ pthread_mutex_init(&dev->lock, NULL);
+
+ *device = &dev->device.common;
+ status = 0;
+ }
+ return status;
+}
+
+
+static struct hw_module_methods_t sensors_module_methods = {
+ .open = open_sensors
+};
+
+struct sensors_module_t HAL_MODULE_INFO_SYM = {
+ .common = {
+ .tag = HARDWARE_MODULE_TAG,
+ .version_major = 1,
+ .version_minor = 0,
+ .id = SENSORS_HARDWARE_MODULE_ID,
+ .name = "Dummy SENSORS Module",
+ .author = "The Android Open Source Project",
+ .methods = &sensors_module_methods,
+ },
+ .get_sensors_list = sensors__get_sensors_list
+};
diff --git a/sepolicy/OWNERS b/sepolicy/OWNERS
new file mode 100644
index 00000000..791abb4a
--- /dev/null
+++ b/sepolicy/OWNERS
@@ -0,0 +1,3 @@
+include platform/system/sepolicy:/OWNERS
+
+rurumihong@google.com
diff --git a/ambient/exo_app.te b/sepolicy/ambient/exo_app.te
index 3a88eebb..3a88eebb 100644
--- a/ambient/exo_app.te
+++ b/sepolicy/ambient/exo_app.te
diff --git a/ambient/seapp_contexts b/sepolicy/ambient/seapp_contexts
index 8024688c..8024688c 100644
--- a/ambient/seapp_contexts
+++ b/sepolicy/ambient/seapp_contexts
diff --git a/bluetooth/device.te b/sepolicy/bluetooth/device.te
index a2563322..a2563322 100644
--- a/bluetooth/device.te
+++ b/sepolicy/bluetooth/device.te
diff --git a/bluetooth/file_contexts b/sepolicy/bluetooth/file_contexts
index d4681dbd..d4681dbd 100644
--- a/bluetooth/file_contexts
+++ b/sepolicy/bluetooth/file_contexts
diff --git a/bluetooth/genfs_contexts b/sepolicy/bluetooth/genfs_contexts
index 607e1462..607e1462 100644
--- a/bluetooth/genfs_contexts
+++ b/sepolicy/bluetooth/genfs_contexts
diff --git a/bluetooth/hal_bluetooth_btlinux.te b/sepolicy/bluetooth/hal_bluetooth_btlinux.te
index f348099e..f348099e 100644
--- a/bluetooth/hal_bluetooth_btlinux.te
+++ b/sepolicy/bluetooth/hal_bluetooth_btlinux.te
diff --git a/bluetooth/hwservice.te b/sepolicy/bluetooth/hwservice.te
index 5e36cd0c..5e36cd0c 100644
--- a/bluetooth/hwservice.te
+++ b/sepolicy/bluetooth/hwservice.te
diff --git a/bluetooth/hwservice_contexts b/sepolicy/bluetooth/hwservice_contexts
index 8480b4e1..8480b4e1 100644
--- a/bluetooth/hwservice_contexts
+++ b/sepolicy/bluetooth/hwservice_contexts
diff --git a/confirmationui/device.te b/sepolicy/confirmationui/device.te
index 54fe349f..54fe349f 100644
--- a/confirmationui/device.te
+++ b/sepolicy/confirmationui/device.te
diff --git a/confirmationui/file_contexts b/sepolicy/confirmationui/file_contexts
index 49db4171..49db4171 100644
--- a/confirmationui/file_contexts
+++ b/sepolicy/confirmationui/file_contexts
diff --git a/confirmationui/hal_confirmationui.te b/sepolicy/confirmationui/hal_confirmationui.te
index a8f4ae8c..a8f4ae8c 100644
--- a/confirmationui/hal_confirmationui.te
+++ b/sepolicy/confirmationui/hal_confirmationui.te
diff --git a/confirmationui/securedpud.slider.te b/sepolicy/confirmationui/securedpud.slider.te
index fd553a30..fd553a30 100644
--- a/confirmationui/securedpud.slider.te
+++ b/sepolicy/confirmationui/securedpud.slider.te
diff --git a/display/common/file.te b/sepolicy/display/common/file.te
index 3734e33c..3734e33c 100644
--- a/display/common/file.te
+++ b/sepolicy/display/common/file.te
diff --git a/display/common/file_contexts b/sepolicy/display/common/file_contexts
index bca77466..bca77466 100644
--- a/display/common/file_contexts
+++ b/sepolicy/display/common/file_contexts
diff --git a/display/gs101/genfs_contexts b/sepolicy/display/gs101/genfs_contexts
index 8ea3b669..8ea3b669 100644
--- a/display/gs101/genfs_contexts
+++ b/sepolicy/display/gs101/genfs_contexts
diff --git a/display/gs101/hal_graphics_composer_default.te b/sepolicy/display/gs101/hal_graphics_composer_default.te
index dccddf0e..dccddf0e 100644
--- a/display/gs101/hal_graphics_composer_default.te
+++ b/sepolicy/display/gs101/hal_graphics_composer_default.te
diff --git a/edgetpu/device.te b/sepolicy/edgetpu/device.te
index 9296ba50..9296ba50 100644
--- a/edgetpu/device.te
+++ b/sepolicy/edgetpu/device.te
diff --git a/edgetpu/edgetpu_app_service.te b/sepolicy/edgetpu/edgetpu_app_service.te
index 58ce2464..58ce2464 100644
--- a/edgetpu/edgetpu_app_service.te
+++ b/sepolicy/edgetpu/edgetpu_app_service.te
diff --git a/edgetpu/edgetpu_logging.te b/sepolicy/edgetpu/edgetpu_logging.te
index 8c2f0dc7..8c2f0dc7 100644
--- a/edgetpu/edgetpu_logging.te
+++ b/sepolicy/edgetpu/edgetpu_logging.te
diff --git a/edgetpu/edgetpu_vendor_service.te b/sepolicy/edgetpu/edgetpu_vendor_service.te
index 10605107..10605107 100644
--- a/edgetpu/edgetpu_vendor_service.te
+++ b/sepolicy/edgetpu/edgetpu_vendor_service.te
diff --git a/edgetpu/file.te b/sepolicy/edgetpu/file.te
index 2482dbf3..2482dbf3 100644
--- a/edgetpu/file.te
+++ b/sepolicy/edgetpu/file.te
diff --git a/edgetpu/file_contexts b/sepolicy/edgetpu/file_contexts
index 04f8491f..04f8491f 100644
--- a/edgetpu/file_contexts
+++ b/sepolicy/edgetpu/file_contexts
diff --git a/edgetpu/genfs_contexts b/sepolicy/edgetpu/genfs_contexts
index 345d2990..345d2990 100644
--- a/edgetpu/genfs_contexts
+++ b/sepolicy/edgetpu/genfs_contexts
diff --git a/edgetpu/hal_neuralnetworks_darwinn.te b/sepolicy/edgetpu/hal_neuralnetworks_darwinn.te
index f301a729..f301a729 100644
--- a/edgetpu/hal_neuralnetworks_darwinn.te
+++ b/sepolicy/edgetpu/hal_neuralnetworks_darwinn.te
diff --git a/edgetpu/priv_app.te b/sepolicy/edgetpu/priv_app.te
index db6e0a27..db6e0a27 100644
--- a/edgetpu/priv_app.te
+++ b/sepolicy/edgetpu/priv_app.te
diff --git a/edgetpu/property.te b/sepolicy/edgetpu/property.te
index ed93d448..ed93d448 100644
--- a/edgetpu/property.te
+++ b/sepolicy/edgetpu/property.te
diff --git a/edgetpu/property_contexts b/sepolicy/edgetpu/property_contexts
index 130cfefe..130cfefe 100644
--- a/edgetpu/property_contexts
+++ b/sepolicy/edgetpu/property_contexts
diff --git a/edgetpu/service.te b/sepolicy/edgetpu/service.te
index 46bee033..46bee033 100644
--- a/edgetpu/service.te
+++ b/sepolicy/edgetpu/service.te
diff --git a/edgetpu/service_contexts b/sepolicy/edgetpu/service_contexts
index 76fe43da..76fe43da 100644
--- a/edgetpu/service_contexts
+++ b/sepolicy/edgetpu/service_contexts
diff --git a/edgetpu/untrusted_app_all.te b/sepolicy/edgetpu/untrusted_app_all.te
index 9abec616..9abec616 100644
--- a/edgetpu/untrusted_app_all.te
+++ b/sepolicy/edgetpu/untrusted_app_all.te
diff --git a/edgetpu/vendor_init.te b/sepolicy/edgetpu/vendor_init.te
index aec79583..aec79583 100644
--- a/edgetpu/vendor_init.te
+++ b/sepolicy/edgetpu/vendor_init.te
diff --git a/gs101-sepolicy.mk b/sepolicy/gs101-sepolicy.mk
index d33fcd4e..d33fcd4e 100644
--- a/gs101-sepolicy.mk
+++ b/sepolicy/gs101-sepolicy.mk
diff --git a/health/file_contexts b/sepolicy/health/file_contexts
index 55321741..55321741 100644
--- a/health/file_contexts
+++ b/sepolicy/health/file_contexts
diff --git a/modem/user/dmd.te b/sepolicy/modem/user/dmd.te
index eabf8930..eabf8930 100644
--- a/modem/user/dmd.te
+++ b/sepolicy/modem/user/dmd.te
diff --git a/modem/user/file.te b/sepolicy/modem/user/file.te
index e2beb8bc..e2beb8bc 100644
--- a/modem/user/file.te
+++ b/sepolicy/modem/user/file.te
diff --git a/modem/user/file_contexts b/sepolicy/modem/user/file_contexts
index ff1482bc..ff1482bc 100644
--- a/modem/user/file_contexts
+++ b/sepolicy/modem/user/file_contexts
diff --git a/modem/user/property.te b/sepolicy/modem/user/property.te
index 353b1c8a..353b1c8a 100644
--- a/modem/user/property.te
+++ b/sepolicy/modem/user/property.te
diff --git a/modem/user/property_contexts b/sepolicy/modem/user/property_contexts
index 0be942b8..0be942b8 100644
--- a/modem/user/property_contexts
+++ b/sepolicy/modem/user/property_contexts
diff --git a/modem/userdebug/file_contexts b/sepolicy/modem/userdebug/file_contexts
index 20b74c64..20b74c64 100644
--- a/modem/userdebug/file_contexts
+++ b/sepolicy/modem/userdebug/file_contexts
diff --git a/modem/userdebug/vcd.te b/sepolicy/modem/userdebug/vcd.te
index c4af485f..c4af485f 100644
--- a/modem/userdebug/vcd.te
+++ b/sepolicy/modem/userdebug/vcd.te
diff --git a/neuralnetworks/file_contexts b/sepolicy/neuralnetworks/file_contexts
index fc151ab9..fc151ab9 100644
--- a/neuralnetworks/file_contexts
+++ b/sepolicy/neuralnetworks/file_contexts
diff --git a/neuralnetworks/hal_neuralnetworks_armnn.te b/sepolicy/neuralnetworks/hal_neuralnetworks_armnn.te
index c9872853..c9872853 100644
--- a/neuralnetworks/hal_neuralnetworks_armnn.te
+++ b/sepolicy/neuralnetworks/hal_neuralnetworks_armnn.te
diff --git a/pkvm/file_contexts b/sepolicy/pkvm/file_contexts
index 310aad4d..310aad4d 100644
--- a/pkvm/file_contexts
+++ b/sepolicy/pkvm/file_contexts
diff --git a/pkvm/vendor_misc_writer.te b/sepolicy/pkvm/vendor_misc_writer.te
index b9b4ceb1..b9b4ceb1 100644
--- a/pkvm/vendor_misc_writer.te
+++ b/sepolicy/pkvm/vendor_misc_writer.te
diff --git a/private/dex2oat.te b/sepolicy/private/dex2oat.te
index 50d7852c..50d7852c 100644
--- a/private/dex2oat.te
+++ b/sepolicy/private/dex2oat.te
diff --git a/private/fsverity_init.te b/sepolicy/private/fsverity_init.te
index ed3728d6..ed3728d6 100644
--- a/private/fsverity_init.te
+++ b/sepolicy/private/fsverity_init.te
diff --git a/private/gmscore_app.te b/sepolicy/private/gmscore_app.te
index e52eb551..e52eb551 100644
--- a/private/gmscore_app.te
+++ b/sepolicy/private/gmscore_app.te
diff --git a/private/hal_dumpstate_default.te b/sepolicy/private/hal_dumpstate_default.te
index 83c75689..83c75689 100644
--- a/private/hal_dumpstate_default.te
+++ b/sepolicy/private/hal_dumpstate_default.te
diff --git a/private/incidentd.te b/sepolicy/private/incidentd.te
index 1557f065..1557f065 100644
--- a/private/incidentd.te
+++ b/sepolicy/private/incidentd.te
diff --git a/private/lpdumpd.te b/sepolicy/private/lpdumpd.te
index 86a101c5..86a101c5 100644
--- a/private/lpdumpd.te
+++ b/sepolicy/private/lpdumpd.te
diff --git a/private/permissioncontroller_app.te b/sepolicy/private/permissioncontroller_app.te
index 4619571c..4619571c 100644
--- a/private/permissioncontroller_app.te
+++ b/sepolicy/private/permissioncontroller_app.te
diff --git a/private/postinstall_dexopt.te b/sepolicy/private/postinstall_dexopt.te
index 2b51e8b7..2b51e8b7 100644
--- a/private/postinstall_dexopt.te
+++ b/sepolicy/private/postinstall_dexopt.te
diff --git a/private/priv_app.te b/sepolicy/private/priv_app.te
index c77a18da..c77a18da 100644
--- a/private/priv_app.te
+++ b/sepolicy/private/priv_app.te
diff --git a/private/radio.te b/sepolicy/private/radio.te
index a569b9c5..a569b9c5 100644
--- a/private/radio.te
+++ b/sepolicy/private/radio.te
diff --git a/private/service_contexts b/sepolicy/private/service_contexts
index 8877518a..8877518a 100644
--- a/private/service_contexts
+++ b/sepolicy/private/service_contexts
diff --git a/private/untrusted_app_25.te b/sepolicy/private/untrusted_app_25.te
index f26e0815..f26e0815 100644
--- a/private/untrusted_app_25.te
+++ b/sepolicy/private/untrusted_app_25.te
diff --git a/private/wait_for_keymaster.te b/sepolicy/private/wait_for_keymaster.te
index 0e29999c..0e29999c 100644
--- a/private/wait_for_keymaster.te
+++ b/sepolicy/private/wait_for_keymaster.te
diff --git a/system_ext/private/platform_app.te b/sepolicy/system_ext/private/platform_app.te
index e9dcc76b..e9dcc76b 100644
--- a/system_ext/private/platform_app.te
+++ b/sepolicy/system_ext/private/platform_app.te
diff --git a/system_ext/private/property_contexts b/sepolicy/system_ext/private/property_contexts
index 9cf97280..9cf97280 100644
--- a/system_ext/private/property_contexts
+++ b/sepolicy/system_ext/private/property_contexts
diff --git a/system_ext/public/property.te b/sepolicy/system_ext/public/property.te
index 8908e485..8908e485 100644
--- a/system_ext/public/property.te
+++ b/sepolicy/system_ext/public/property.te
diff --git a/telephony/pktrouter/device.te b/sepolicy/telephony/pktrouter/device.te
index 3225bac6..3225bac6 100644
--- a/telephony/pktrouter/device.te
+++ b/sepolicy/telephony/pktrouter/device.te
diff --git a/telephony/pktrouter/file_contexts b/sepolicy/telephony/pktrouter/file_contexts
index f6e73dbf..f6e73dbf 100644
--- a/telephony/pktrouter/file_contexts
+++ b/sepolicy/telephony/pktrouter/file_contexts
diff --git a/telephony/pktrouter/netutils_wrapper.te b/sepolicy/telephony/pktrouter/netutils_wrapper.te
index ff1be58e..ff1be58e 100644
--- a/telephony/pktrouter/netutils_wrapper.te
+++ b/sepolicy/telephony/pktrouter/netutils_wrapper.te
diff --git a/telephony/pktrouter/pktrouter.te b/sepolicy/telephony/pktrouter/pktrouter.te
index e06c8db6..e06c8db6 100644
--- a/telephony/pktrouter/pktrouter.te
+++ b/sepolicy/telephony/pktrouter/pktrouter.te
diff --git a/telephony/pktrouter/property.te b/sepolicy/telephony/pktrouter/property.te
index a3d6a392..a3d6a392 100644
--- a/telephony/pktrouter/property.te
+++ b/sepolicy/telephony/pktrouter/property.te
diff --git a/telephony/pktrouter/property_contexts b/sepolicy/telephony/pktrouter/property_contexts
index 4165d92c..4165d92c 100644
--- a/telephony/pktrouter/property_contexts
+++ b/sepolicy/telephony/pktrouter/property_contexts
diff --git a/telephony/pktrouter/vendor_init.te b/sepolicy/telephony/pktrouter/vendor_init.te
index 3a867815..3a867815 100644
--- a/telephony/pktrouter/vendor_init.te
+++ b/sepolicy/telephony/pktrouter/vendor_init.te
diff --git a/telephony/user/file_contexts b/sepolicy/telephony/user/file_contexts
index 1aafb7e3..1aafb7e3 100644
--- a/telephony/user/file_contexts
+++ b/sepolicy/telephony/user/file_contexts
diff --git a/telephony/user/init_radio.te b/sepolicy/telephony/user/init_radio.te
index 3a29edf3..3a29edf3 100644
--- a/telephony/user/init_radio.te
+++ b/sepolicy/telephony/user/init_radio.te
diff --git a/tracking_denials/dumpstate.te b/sepolicy/tracking_denials/dumpstate.te
index fc4afa4d..fc4afa4d 100644
--- a/tracking_denials/dumpstate.te
+++ b/sepolicy/tracking_denials/dumpstate.te
diff --git a/tracking_denials/hal_drm_default.te b/sepolicy/tracking_denials/hal_drm_default.te
index ee4ed089..ee4ed089 100644
--- a/tracking_denials/hal_drm_default.te
+++ b/sepolicy/tracking_denials/hal_drm_default.te
diff --git a/tracking_denials/hal_fingerprint_default.te b/sepolicy/tracking_denials/hal_fingerprint_default.te
index 9a2d37e5..9a2d37e5 100644
--- a/tracking_denials/hal_fingerprint_default.te
+++ b/sepolicy/tracking_denials/hal_fingerprint_default.te
diff --git a/tracking_denials/hal_neuralnetworks_armnn.te b/sepolicy/tracking_denials/hal_neuralnetworks_armnn.te
index 120510fd..120510fd 100644
--- a/tracking_denials/hal_neuralnetworks_armnn.te
+++ b/sepolicy/tracking_denials/hal_neuralnetworks_armnn.te
diff --git a/tracking_denials/hal_power_default.te b/sepolicy/tracking_denials/hal_power_default.te
index 47f5162e..47f5162e 100644
--- a/tracking_denials/hal_power_default.te
+++ b/sepolicy/tracking_denials/hal_power_default.te
diff --git a/tracking_denials/incidentd.te b/sepolicy/tracking_denials/incidentd.te
index 2187eab4..2187eab4 100644
--- a/tracking_denials/incidentd.te
+++ b/sepolicy/tracking_denials/incidentd.te
diff --git a/tracking_denials/init-insmod-sh.te b/sepolicy/tracking_denials/init-insmod-sh.te
index 8b2358b2..8b2358b2 100644
--- a/tracking_denials/init-insmod-sh.te
+++ b/sepolicy/tracking_denials/init-insmod-sh.te
diff --git a/tracking_denials/kernel.te b/sepolicy/tracking_denials/kernel.te
index 7901bdcf..7901bdcf 100644
--- a/tracking_denials/kernel.te
+++ b/sepolicy/tracking_denials/kernel.te
diff --git a/tracking_denials/rebalance_interrupts_vendor.te b/sepolicy/tracking_denials/rebalance_interrupts_vendor.te
index f6cec9e1..f6cec9e1 100644
--- a/tracking_denials/rebalance_interrupts_vendor.te
+++ b/sepolicy/tracking_denials/rebalance_interrupts_vendor.te
diff --git a/tracking_denials/surfaceflinger.te b/sepolicy/tracking_denials/surfaceflinger.te
index 2db24d73..2db24d73 100644
--- a/tracking_denials/surfaceflinger.te
+++ b/sepolicy/tracking_denials/surfaceflinger.te
diff --git a/tracking_denials/untrusted_app.te b/sepolicy/tracking_denials/untrusted_app.te
index 9b098f88..9b098f88 100644
--- a/tracking_denials/untrusted_app.te
+++ b/sepolicy/tracking_denials/untrusted_app.te
diff --git a/tracking_denials/update_engine.te b/sepolicy/tracking_denials/update_engine.te
index 98e7b851..98e7b851 100644
--- a/tracking_denials/update_engine.te
+++ b/sepolicy/tracking_denials/update_engine.te
diff --git a/tracking_denials/uwb_vendor_app.te b/sepolicy/tracking_denials/uwb_vendor_app.te
index 91933c0d..91933c0d 100644
--- a/tracking_denials/uwb_vendor_app.te
+++ b/sepolicy/tracking_denials/uwb_vendor_app.te
diff --git a/tracking_denials/vendor_init.te b/sepolicy/tracking_denials/vendor_init.te
index d27b8e95..d27b8e95 100644
--- a/tracking_denials/vendor_init.te
+++ b/sepolicy/tracking_denials/vendor_init.te
diff --git a/trusty_metricsd/file_contexts b/sepolicy/trusty_metricsd/file_contexts
index bedf7437..bedf7437 100644
--- a/trusty_metricsd/file_contexts
+++ b/sepolicy/trusty_metricsd/file_contexts
diff --git a/trusty_metricsd/trusty_metricsd.te b/sepolicy/trusty_metricsd/trusty_metricsd.te
index 63fc85b6..63fc85b6 100644
--- a/trusty_metricsd/trusty_metricsd.te
+++ b/sepolicy/trusty_metricsd/trusty_metricsd.te
diff --git a/usf/file.te b/sepolicy/usf/file.te
index 8f49e32b..8f49e32b 100644
--- a/usf/file.te
+++ b/sepolicy/usf/file.te
diff --git a/usf/file_contexts b/sepolicy/usf/file_contexts
index 3c7833b1..3c7833b1 100644
--- a/usf/file_contexts
+++ b/sepolicy/usf/file_contexts
diff --git a/usf/sensor_hal.te b/sepolicy/usf/sensor_hal.te
index 491d6403..491d6403 100644
--- a/usf/sensor_hal.te
+++ b/sepolicy/usf/sensor_hal.te
diff --git a/usf/te_macros b/sepolicy/usf/te_macros
index 01ac13c1..01ac13c1 100644
--- a/usf/te_macros
+++ b/sepolicy/usf/te_macros
diff --git a/whitechapel/vendor/google/aocd.te b/sepolicy/whitechapel/vendor/google/aocd.te
index 69b0af0d..69b0af0d 100644
--- a/whitechapel/vendor/google/aocd.te
+++ b/sepolicy/whitechapel/vendor/google/aocd.te
diff --git a/whitechapel/vendor/google/aocdump.te b/sepolicy/whitechapel/vendor/google/aocdump.te
index ca468a35..ca468a35 100644
--- a/whitechapel/vendor/google/aocdump.te
+++ b/sepolicy/whitechapel/vendor/google/aocdump.te
diff --git a/whitechapel/vendor/google/attributes b/sepolicy/whitechapel/vendor/google/attributes
index 7e6def72..7e6def72 100644
--- a/whitechapel/vendor/google/attributes
+++ b/sepolicy/whitechapel/vendor/google/attributes
diff --git a/whitechapel/vendor/google/audioserver.te b/sepolicy/whitechapel/vendor/google/audioserver.te
index c7d69097..c7d69097 100644
--- a/whitechapel/vendor/google/audioserver.te
+++ b/sepolicy/whitechapel/vendor/google/audioserver.te
diff --git a/whitechapel/vendor/google/bipchmgr.te b/sepolicy/whitechapel/vendor/google/bipchmgr.te
index 9298e322..9298e322 100644
--- a/whitechapel/vendor/google/bipchmgr.te
+++ b/sepolicy/whitechapel/vendor/google/bipchmgr.te
diff --git a/whitechapel/vendor/google/bluetooth.te b/sepolicy/whitechapel/vendor/google/bluetooth.te
index 92737abe..92737abe 100644
--- a/whitechapel/vendor/google/bluetooth.te
+++ b/sepolicy/whitechapel/vendor/google/bluetooth.te
diff --git a/whitechapel/vendor/google/bootanim.te b/sepolicy/whitechapel/vendor/google/bootanim.te
index 7b3019df..7b3019df 100644
--- a/whitechapel/vendor/google/bootanim.te
+++ b/sepolicy/whitechapel/vendor/google/bootanim.te
diff --git a/whitechapel/vendor/google/bootdevice_sysdev.te b/sepolicy/whitechapel/vendor/google/bootdevice_sysdev.te
index 2ff0acb9..2ff0acb9 100644
--- a/whitechapel/vendor/google/bootdevice_sysdev.te
+++ b/sepolicy/whitechapel/vendor/google/bootdevice_sysdev.te
diff --git a/whitechapel/vendor/google/bug_map b/sepolicy/whitechapel/vendor/google/bug_map
index b7c26b57..b7c26b57 100644
--- a/whitechapel/vendor/google/bug_map
+++ b/sepolicy/whitechapel/vendor/google/bug_map
diff --git a/whitechapel/vendor/google/cbd.te b/sepolicy/whitechapel/vendor/google/cbd.te
index cbd222ff..cbd222ff 100644
--- a/whitechapel/vendor/google/cbd.te
+++ b/sepolicy/whitechapel/vendor/google/cbd.te
diff --git a/whitechapel/vendor/google/cbrs_setup.te b/sepolicy/whitechapel/vendor/google/cbrs_setup.te
index 1abbcff1..1abbcff1 100644
--- a/whitechapel/vendor/google/cbrs_setup.te
+++ b/sepolicy/whitechapel/vendor/google/cbrs_setup.te
diff --git a/whitechapel/vendor/google/cccdk_timesync_app.te b/sepolicy/whitechapel/vendor/google/cccdk_timesync_app.te
index f6e514d9..f6e514d9 100644
--- a/whitechapel/vendor/google/cccdk_timesync_app.te
+++ b/sepolicy/whitechapel/vendor/google/cccdk_timesync_app.te
diff --git a/whitechapel/vendor/google/certs/EuiccSupportPixel.x509.pem b/sepolicy/whitechapel/vendor/google/certs/EuiccSupportPixel.x509.pem
index d11ad3d0..d11ad3d0 100644
--- a/whitechapel/vendor/google/certs/EuiccSupportPixel.x509.pem
+++ b/sepolicy/whitechapel/vendor/google/certs/EuiccSupportPixel.x509.pem
diff --git a/whitechapel/vendor/google/certs/com_google_mds.x509.pem b/sepolicy/whitechapel/vendor/google/certs/com_google_mds.x509.pem
index 640c6fb9..640c6fb9 100644
--- a/whitechapel/vendor/google/certs/com_google_mds.x509.pem
+++ b/sepolicy/whitechapel/vendor/google/certs/com_google_mds.x509.pem
diff --git a/whitechapel/vendor/google/certs/com_qorvo_uwb.x509.pem b/sepolicy/whitechapel/vendor/google/certs/com_qorvo_uwb.x509.pem
index 0e7c9ed5..0e7c9ed5 100644
--- a/whitechapel/vendor/google/certs/com_qorvo_uwb.x509.pem
+++ b/sepolicy/whitechapel/vendor/google/certs/com_qorvo_uwb.x509.pem
diff --git a/whitechapel/vendor/google/charger_vendor.te b/sepolicy/whitechapel/vendor/google/charger_vendor.te
index df59b717..df59b717 100644
--- a/whitechapel/vendor/google/charger_vendor.te
+++ b/sepolicy/whitechapel/vendor/google/charger_vendor.te
diff --git a/whitechapel/vendor/google/chre.te b/sepolicy/whitechapel/vendor/google/chre.te
index 26c1675f..26c1675f 100644
--- a/whitechapel/vendor/google/chre.te
+++ b/sepolicy/whitechapel/vendor/google/chre.te
diff --git a/whitechapel/vendor/google/con_monitor.te b/sepolicy/whitechapel/vendor/google/con_monitor.te
index 8695ccaa..8695ccaa 100644
--- a/whitechapel/vendor/google/con_monitor.te
+++ b/sepolicy/whitechapel/vendor/google/con_monitor.te
diff --git a/whitechapel/vendor/google/device.te b/sepolicy/whitechapel/vendor/google/device.te
index 94ec0bb4..94ec0bb4 100644
--- a/whitechapel/vendor/google/device.te
+++ b/sepolicy/whitechapel/vendor/google/device.te
diff --git a/whitechapel/vendor/google/disable-contaminant-detection-sh.te b/sepolicy/whitechapel/vendor/google/disable-contaminant-detection-sh.te
index 95845a18..95845a18 100644
--- a/whitechapel/vendor/google/disable-contaminant-detection-sh.te
+++ b/sepolicy/whitechapel/vendor/google/disable-contaminant-detection-sh.te
diff --git a/whitechapel/vendor/google/dmd.te b/sepolicy/whitechapel/vendor/google/dmd.te
index b51c34d6..b51c34d6 100644
--- a/whitechapel/vendor/google/dmd.te
+++ b/sepolicy/whitechapel/vendor/google/dmd.te
diff --git a/whitechapel/vendor/google/domain.te b/sepolicy/whitechapel/vendor/google/domain.te
index fd876e09..fd876e09 100644
--- a/whitechapel/vendor/google/domain.te
+++ b/sepolicy/whitechapel/vendor/google/domain.te
diff --git a/whitechapel/vendor/google/dumpstate.te b/sepolicy/whitechapel/vendor/google/dumpstate.te
index cdf6e8ef..cdf6e8ef 100644
--- a/whitechapel/vendor/google/dumpstate.te
+++ b/sepolicy/whitechapel/vendor/google/dumpstate.te
diff --git a/whitechapel/vendor/google/e2fs.te b/sepolicy/whitechapel/vendor/google/e2fs.te
index a6664594..a6664594 100644
--- a/whitechapel/vendor/google/e2fs.te
+++ b/sepolicy/whitechapel/vendor/google/e2fs.te
diff --git a/whitechapel/vendor/google/euiccpixel_app.te b/sepolicy/whitechapel/vendor/google/euiccpixel_app.te
index 8763117f..8763117f 100644
--- a/whitechapel/vendor/google/euiccpixel_app.te
+++ b/sepolicy/whitechapel/vendor/google/euiccpixel_app.te
diff --git a/whitechapel/vendor/google/exo_camera_injection/dumpstate.te b/sepolicy/whitechapel/vendor/google/exo_camera_injection/dumpstate.te
index 1a5b393d..1a5b393d 100644
--- a/whitechapel/vendor/google/exo_camera_injection/dumpstate.te
+++ b/sepolicy/whitechapel/vendor/google/exo_camera_injection/dumpstate.te
diff --git a/whitechapel/vendor/google/exo_camera_injection/exo_app.te b/sepolicy/whitechapel/vendor/google/exo_camera_injection/exo_app.te
index a90de48e..a90de48e 100644
--- a/whitechapel/vendor/google/exo_camera_injection/exo_app.te
+++ b/sepolicy/whitechapel/vendor/google/exo_camera_injection/exo_app.te
diff --git a/whitechapel/vendor/google/exo_camera_injection/file_contexts b/sepolicy/whitechapel/vendor/google/exo_camera_injection/file_contexts
index 98627c63..98627c63 100644
--- a/whitechapel/vendor/google/exo_camera_injection/file_contexts
+++ b/sepolicy/whitechapel/vendor/google/exo_camera_injection/file_contexts
diff --git a/whitechapel/vendor/google/exo_camera_injection/hal_exo_camera_injection.te b/sepolicy/whitechapel/vendor/google/exo_camera_injection/hal_exo_camera_injection.te
index 138d1b1d..138d1b1d 100644
--- a/whitechapel/vendor/google/exo_camera_injection/hal_exo_camera_injection.te
+++ b/sepolicy/whitechapel/vendor/google/exo_camera_injection/hal_exo_camera_injection.te
diff --git a/whitechapel/vendor/google/exo_camera_injection/hwservice.te b/sepolicy/whitechapel/vendor/google/exo_camera_injection/hwservice.te
index cea97689..cea97689 100644
--- a/whitechapel/vendor/google/exo_camera_injection/hwservice.te
+++ b/sepolicy/whitechapel/vendor/google/exo_camera_injection/hwservice.te
diff --git a/whitechapel/vendor/google/exo_camera_injection/hwservice_contexts b/sepolicy/whitechapel/vendor/google/exo_camera_injection/hwservice_contexts
index 59ccfe67..59ccfe67 100644
--- a/whitechapel/vendor/google/exo_camera_injection/hwservice_contexts
+++ b/sepolicy/whitechapel/vendor/google/exo_camera_injection/hwservice_contexts
diff --git a/whitechapel/vendor/google/fastbootd.te b/sepolicy/whitechapel/vendor/google/fastbootd.te
index e350e0f3..e350e0f3 100644
--- a/whitechapel/vendor/google/fastbootd.te
+++ b/sepolicy/whitechapel/vendor/google/fastbootd.te
diff --git a/whitechapel/vendor/google/file.te b/sepolicy/whitechapel/vendor/google/file.te
index 48cb759d..48cb759d 100644
--- a/whitechapel/vendor/google/file.te
+++ b/sepolicy/whitechapel/vendor/google/file.te
diff --git a/whitechapel/vendor/google/file_contexts b/sepolicy/whitechapel/vendor/google/file_contexts
index a75eff9e..a75eff9e 100644
--- a/whitechapel/vendor/google/file_contexts
+++ b/sepolicy/whitechapel/vendor/google/file_contexts
diff --git a/whitechapel/vendor/google/fsck.te b/sepolicy/whitechapel/vendor/google/fsck.te
index d29555b3..d29555b3 100644
--- a/whitechapel/vendor/google/fsck.te
+++ b/sepolicy/whitechapel/vendor/google/fsck.te
diff --git a/whitechapel/vendor/google/genfs_contexts b/sepolicy/whitechapel/vendor/google/genfs_contexts
index bd291349..bd291349 100644
--- a/whitechapel/vendor/google/genfs_contexts
+++ b/sepolicy/whitechapel/vendor/google/genfs_contexts
diff --git a/whitechapel/vendor/google/gpsd.te b/sepolicy/whitechapel/vendor/google/gpsd.te
index 791a02e4..791a02e4 100644
--- a/whitechapel/vendor/google/gpsd.te
+++ b/sepolicy/whitechapel/vendor/google/gpsd.te
diff --git a/whitechapel/vendor/google/grilservice_app.te b/sepolicy/whitechapel/vendor/google/grilservice_app.te
index 50ff22a5..50ff22a5 100644
--- a/whitechapel/vendor/google/grilservice_app.te
+++ b/sepolicy/whitechapel/vendor/google/grilservice_app.te
diff --git a/whitechapel/vendor/google/hal_audio_default.te b/sepolicy/whitechapel/vendor/google/hal_audio_default.te
index 0755cba1..0755cba1 100644
--- a/whitechapel/vendor/google/hal_audio_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_audio_default.te
diff --git a/whitechapel/vendor/google/hal_audiometricext_default.te b/sepolicy/whitechapel/vendor/google/hal_audiometricext_default.te
index 5358eac4..5358eac4 100644
--- a/whitechapel/vendor/google/hal_audiometricext_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_audiometricext_default.te
diff --git a/whitechapel/vendor/google/hal_bootctl_default.te b/sepolicy/whitechapel/vendor/google/hal_bootctl_default.te
index a9f9cdea..a9f9cdea 100644
--- a/whitechapel/vendor/google/hal_bootctl_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_bootctl_default.te
diff --git a/whitechapel/vendor/google/hal_camera_default.te b/sepolicy/whitechapel/vendor/google/hal_camera_default.te
index 2e36e4a8..2e36e4a8 100644
--- a/whitechapel/vendor/google/hal_camera_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_camera_default.te
diff --git a/whitechapel/vendor/google/hal_contexthub.te b/sepolicy/whitechapel/vendor/google/hal_contexthub.te
index ba776c89..ba776c89 100644
--- a/whitechapel/vendor/google/hal_contexthub.te
+++ b/sepolicy/whitechapel/vendor/google/hal_contexthub.te
diff --git a/whitechapel/vendor/google/hal_drm_clearkey.te b/sepolicy/whitechapel/vendor/google/hal_drm_clearkey.te
index 0e0a5c24..0e0a5c24 100644
--- a/whitechapel/vendor/google/hal_drm_clearkey.te
+++ b/sepolicy/whitechapel/vendor/google/hal_drm_clearkey.te
diff --git a/whitechapel/vendor/google/hal_drm_default.te b/sepolicy/whitechapel/vendor/google/hal_drm_default.te
index 30e443a8..30e443a8 100644
--- a/whitechapel/vendor/google/hal_drm_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_drm_default.te
diff --git a/whitechapel/vendor/google/hal_dumpstate_default.te b/sepolicy/whitechapel/vendor/google/hal_dumpstate_default.te
index 314546f2..314546f2 100644
--- a/whitechapel/vendor/google/hal_dumpstate_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_dumpstate_default.te
diff --git a/whitechapel/vendor/google/hal_fingerprint_default.te b/sepolicy/whitechapel/vendor/google/hal_fingerprint_default.te
index aee24633..aee24633 100644
--- a/whitechapel/vendor/google/hal_fingerprint_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_fingerprint_default.te
diff --git a/whitechapel/vendor/google/hal_gnss_default.te b/sepolicy/whitechapel/vendor/google/hal_gnss_default.te
index e3004237..e3004237 100644
--- a/whitechapel/vendor/google/hal_gnss_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_gnss_default.te
diff --git a/whitechapel/vendor/google/hal_graphics_allocator_default.te b/sepolicy/whitechapel/vendor/google/hal_graphics_allocator_default.te
index 9791dae6..9791dae6 100644
--- a/whitechapel/vendor/google/hal_graphics_allocator_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_graphics_allocator_default.te
diff --git a/whitechapel/vendor/google/hal_graphics_composer_default.te b/sepolicy/whitechapel/vendor/google/hal_graphics_composer_default.te
index 0562aa0e..0562aa0e 100644
--- a/whitechapel/vendor/google/hal_graphics_composer_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_graphics_composer_default.te
diff --git a/whitechapel/vendor/google/hal_health_default.te b/sepolicy/whitechapel/vendor/google/hal_health_default.te
index 65a5d483..65a5d483 100644
--- a/whitechapel/vendor/google/hal_health_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_health_default.te
diff --git a/whitechapel/vendor/google/hal_health_storage_default.te b/sepolicy/whitechapel/vendor/google/hal_health_storage_default.te
index 2aa0881e..2aa0881e 100644
--- a/whitechapel/vendor/google/hal_health_storage_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_health_storage_default.te
diff --git a/whitechapel/vendor/google/hal_input_processor_default.te b/sepolicy/whitechapel/vendor/google/hal_input_processor_default.te
index 00d4c695..00d4c695 100644
--- a/whitechapel/vendor/google/hal_input_processor_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_input_processor_default.te
diff --git a/whitechapel/vendor/google/hal_memtrack_default.te b/sepolicy/whitechapel/vendor/google/hal_memtrack_default.te
index 7554c6ff..7554c6ff 100644
--- a/whitechapel/vendor/google/hal_memtrack_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_memtrack_default.te
diff --git a/whitechapel/vendor/google/hal_nfc_default.te b/sepolicy/whitechapel/vendor/google/hal_nfc_default.te
index 247ca3d7..247ca3d7 100644
--- a/whitechapel/vendor/google/hal_nfc_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_nfc_default.te
diff --git a/whitechapel/vendor/google/hal_power_default.te b/sepolicy/whitechapel/vendor/google/hal_power_default.te
index 122661ae..122661ae 100644
--- a/whitechapel/vendor/google/hal_power_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_power_default.te
diff --git a/whitechapel/vendor/google/hal_power_stats_default.te b/sepolicy/whitechapel/vendor/google/hal_power_stats_default.te
index 13a0487f..13a0487f 100644
--- a/whitechapel/vendor/google/hal_power_stats_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_power_stats_default.te
diff --git a/whitechapel/vendor/google/hal_radioext_default.te b/sepolicy/whitechapel/vendor/google/hal_radioext_default.te
index eef71cf6..eef71cf6 100644
--- a/whitechapel/vendor/google/hal_radioext_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_radioext_default.te
diff --git a/whitechapel/vendor/google/hal_secure_element_default.te b/sepolicy/whitechapel/vendor/google/hal_secure_element_default.te
index 17a679d2..17a679d2 100644
--- a/whitechapel/vendor/google/hal_secure_element_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_secure_element_default.te
diff --git a/whitechapel/vendor/google/hal_secure_element_st33spi.te b/sepolicy/whitechapel/vendor/google/hal_secure_element_st33spi.te
index a5978f20..a5978f20 100644
--- a/whitechapel/vendor/google/hal_secure_element_st33spi.te
+++ b/sepolicy/whitechapel/vendor/google/hal_secure_element_st33spi.te
diff --git a/whitechapel/vendor/google/hal_secure_element_st54spi.te b/sepolicy/whitechapel/vendor/google/hal_secure_element_st54spi.te
index 7f6ea41b..7f6ea41b 100644
--- a/whitechapel/vendor/google/hal_secure_element_st54spi.te
+++ b/sepolicy/whitechapel/vendor/google/hal_secure_element_st54spi.te
diff --git a/whitechapel/vendor/google/hal_tetheroffload_default.te b/sepolicy/whitechapel/vendor/google/hal_tetheroffload_default.te
index 00ae3214..00ae3214 100644
--- a/whitechapel/vendor/google/hal_tetheroffload_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_tetheroffload_default.te
diff --git a/whitechapel/vendor/google/hal_thermal_default.te b/sepolicy/whitechapel/vendor/google/hal_thermal_default.te
index 9852a767..9852a767 100644
--- a/whitechapel/vendor/google/hal_thermal_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_thermal_default.te
diff --git a/whitechapel/vendor/google/hal_usb_gadget_impl.te b/sepolicy/whitechapel/vendor/google/hal_usb_gadget_impl.te
index 31216c98..31216c98 100644
--- a/whitechapel/vendor/google/hal_usb_gadget_impl.te
+++ b/sepolicy/whitechapel/vendor/google/hal_usb_gadget_impl.te
diff --git a/whitechapel/vendor/google/hal_usb_impl.te b/sepolicy/whitechapel/vendor/google/hal_usb_impl.te
index 97ec1c7c..97ec1c7c 100644
--- a/whitechapel/vendor/google/hal_usb_impl.te
+++ b/sepolicy/whitechapel/vendor/google/hal_usb_impl.te
diff --git a/whitechapel/vendor/google/hal_uwb_vendor.te b/sepolicy/whitechapel/vendor/google/hal_uwb_vendor.te
index ccfc1705..ccfc1705 100644
--- a/whitechapel/vendor/google/hal_uwb_vendor.te
+++ b/sepolicy/whitechapel/vendor/google/hal_uwb_vendor.te
diff --git a/whitechapel/vendor/google/hal_uwb_vendor_default.te b/sepolicy/whitechapel/vendor/google/hal_uwb_vendor_default.te
index b287433f..b287433f 100644
--- a/whitechapel/vendor/google/hal_uwb_vendor_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_uwb_vendor_default.te
diff --git a/whitechapel/vendor/google/hal_vendor_hwcservice_default.te b/sepolicy/whitechapel/vendor/google/hal_vendor_hwcservice_default.te
index 0cd13b33..0cd13b33 100644
--- a/whitechapel/vendor/google/hal_vendor_hwcservice_default.te
+++ b/sepolicy/whitechapel/vendor/google/hal_vendor_hwcservice_default.te
diff --git a/whitechapel/vendor/google/hal_wifi.te b/sepolicy/whitechapel/vendor/google/hal_wifi.te
index e7f657ec..e7f657ec 100644
--- a/whitechapel/vendor/google/hal_wifi.te
+++ b/sepolicy/whitechapel/vendor/google/hal_wifi.te
diff --git a/whitechapel/vendor/google/hal_wifi_ext.te b/sepolicy/whitechapel/vendor/google/hal_wifi_ext.te
index 959f71b6..959f71b6 100644
--- a/whitechapel/vendor/google/hal_wifi_ext.te
+++ b/sepolicy/whitechapel/vendor/google/hal_wifi_ext.te
diff --git a/whitechapel/vendor/google/hal_wlc.te b/sepolicy/whitechapel/vendor/google/hal_wlc.te
index 891853c9..891853c9 100644
--- a/whitechapel/vendor/google/hal_wlc.te
+++ b/sepolicy/whitechapel/vendor/google/hal_wlc.te
diff --git a/whitechapel/vendor/google/hardware_info_app.te b/sepolicy/whitechapel/vendor/google/hardware_info_app.te
index 80b53377..80b53377 100644
--- a/whitechapel/vendor/google/hardware_info_app.te
+++ b/sepolicy/whitechapel/vendor/google/hardware_info_app.te
diff --git a/whitechapel/vendor/google/hbmsvmanager_app.te b/sepolicy/whitechapel/vendor/google/hbmsvmanager_app.te
index b7058090..b7058090 100644
--- a/whitechapel/vendor/google/hbmsvmanager_app.te
+++ b/sepolicy/whitechapel/vendor/google/hbmsvmanager_app.te
diff --git a/whitechapel/vendor/google/hwservice.te b/sepolicy/whitechapel/vendor/google/hwservice.te
index a3a3ead1..a3a3ead1 100644
--- a/whitechapel/vendor/google/hwservice.te
+++ b/sepolicy/whitechapel/vendor/google/hwservice.te
diff --git a/whitechapel/vendor/google/hwservice_contexts b/sepolicy/whitechapel/vendor/google/hwservice_contexts
index 30207772..30207772 100644
--- a/whitechapel/vendor/google/hwservice_contexts
+++ b/sepolicy/whitechapel/vendor/google/hwservice_contexts
diff --git a/whitechapel/vendor/google/hwservicemanager.te b/sepolicy/whitechapel/vendor/google/hwservicemanager.te
index 7b64499b..7b64499b 100644
--- a/whitechapel/vendor/google/hwservicemanager.te
+++ b/sepolicy/whitechapel/vendor/google/hwservicemanager.te
diff --git a/whitechapel/vendor/google/incident.te b/sepolicy/whitechapel/vendor/google/incident.te
index 672606df..672606df 100644
--- a/whitechapel/vendor/google/incident.te
+++ b/sepolicy/whitechapel/vendor/google/incident.te
diff --git a/whitechapel/vendor/google/init-insmod-sh.te b/sepolicy/whitechapel/vendor/google/init-insmod-sh.te
index 0e60196e..0e60196e 100644
--- a/whitechapel/vendor/google/init-insmod-sh.te
+++ b/sepolicy/whitechapel/vendor/google/init-insmod-sh.te
diff --git a/whitechapel/vendor/google/init.te b/sepolicy/whitechapel/vendor/google/init.te
index 11726894..11726894 100644
--- a/whitechapel/vendor/google/init.te
+++ b/sepolicy/whitechapel/vendor/google/init.te
diff --git a/whitechapel/vendor/google/installd.te b/sepolicy/whitechapel/vendor/google/installd.te
index 44e74c63..44e74c63 100644
--- a/whitechapel/vendor/google/installd.te
+++ b/sepolicy/whitechapel/vendor/google/installd.te
diff --git a/whitechapel/vendor/google/kernel.te b/sepolicy/whitechapel/vendor/google/kernel.te
index c34e7f72..c34e7f72 100644
--- a/whitechapel/vendor/google/kernel.te
+++ b/sepolicy/whitechapel/vendor/google/kernel.te
diff --git a/whitechapel/vendor/google/keys.conf b/sepolicy/whitechapel/vendor/google/keys.conf
index fb6e52b6..fb6e52b6 100644
--- a/whitechapel/vendor/google/keys.conf
+++ b/sepolicy/whitechapel/vendor/google/keys.conf
diff --git a/whitechapel/vendor/google/lhd.te b/sepolicy/whitechapel/vendor/google/lhd.te
index e980897c..e980897c 100644
--- a/whitechapel/vendor/google/lhd.te
+++ b/sepolicy/whitechapel/vendor/google/lhd.te
diff --git a/whitechapel/vendor/google/logd.te b/sepolicy/whitechapel/vendor/google/logd.te
index cc55e204..cc55e204 100644
--- a/whitechapel/vendor/google/logd.te
+++ b/sepolicy/whitechapel/vendor/google/logd.te
diff --git a/whitechapel/vendor/google/logger_app.te b/sepolicy/whitechapel/vendor/google/logger_app.te
index 14196600..14196600 100644
--- a/whitechapel/vendor/google/logger_app.te
+++ b/sepolicy/whitechapel/vendor/google/logger_app.te
diff --git a/whitechapel/vendor/google/mac_permissions.xml b/sepolicy/whitechapel/vendor/google/mac_permissions.xml
index 6cb7113c..6cb7113c 100644
--- a/whitechapel/vendor/google/mac_permissions.xml
+++ b/sepolicy/whitechapel/vendor/google/mac_permissions.xml
diff --git a/whitechapel/vendor/google/mediacodec.te b/sepolicy/whitechapel/vendor/google/mediacodec.te
index 0c22d5bf..0c22d5bf 100644
--- a/whitechapel/vendor/google/mediacodec.te
+++ b/sepolicy/whitechapel/vendor/google/mediacodec.te
diff --git a/whitechapel/vendor/google/mediaprovider.te b/sepolicy/whitechapel/vendor/google/mediaprovider.te
index dc3e1c01..dc3e1c01 100644
--- a/whitechapel/vendor/google/mediaprovider.te
+++ b/sepolicy/whitechapel/vendor/google/mediaprovider.te
diff --git a/whitechapel/vendor/google/modem_diagnostics.te b/sepolicy/whitechapel/vendor/google/modem_diagnostics.te
index 9fa772b4..9fa772b4 100644
--- a/whitechapel/vendor/google/modem_diagnostics.te
+++ b/sepolicy/whitechapel/vendor/google/modem_diagnostics.te
diff --git a/whitechapel/vendor/google/modem_logging_control.te b/sepolicy/whitechapel/vendor/google/modem_logging_control.te
index 7392297f..7392297f 100644
--- a/whitechapel/vendor/google/modem_logging_control.te
+++ b/sepolicy/whitechapel/vendor/google/modem_logging_control.te
diff --git a/whitechapel/vendor/google/modem_svc_sit.te b/sepolicy/whitechapel/vendor/google/modem_svc_sit.te
index 63dec363..63dec363 100644
--- a/whitechapel/vendor/google/modem_svc_sit.te
+++ b/sepolicy/whitechapel/vendor/google/modem_svc_sit.te
diff --git a/whitechapel/vendor/google/nfc.te b/sepolicy/whitechapel/vendor/google/nfc.te
index 80784434..80784434 100644
--- a/whitechapel/vendor/google/nfc.te
+++ b/sepolicy/whitechapel/vendor/google/nfc.te
diff --git a/whitechapel/vendor/google/oemrilservice_app.te b/sepolicy/whitechapel/vendor/google/oemrilservice_app.te
index ca8257a1..ca8257a1 100644
--- a/whitechapel/vendor/google/oemrilservice_app.te
+++ b/sepolicy/whitechapel/vendor/google/oemrilservice_app.te
diff --git a/whitechapel/vendor/google/ofl_app.te b/sepolicy/whitechapel/vendor/google/ofl_app.te
index a9498165..a9498165 100644
--- a/whitechapel/vendor/google/ofl_app.te
+++ b/sepolicy/whitechapel/vendor/google/ofl_app.te
diff --git a/whitechapel/vendor/google/omadm.te b/sepolicy/whitechapel/vendor/google/omadm.te
index 3990dd7b..3990dd7b 100644
--- a/whitechapel/vendor/google/omadm.te
+++ b/sepolicy/whitechapel/vendor/google/omadm.te
diff --git a/whitechapel/vendor/google/pixelstats_vendor.te b/sepolicy/whitechapel/vendor/google/pixelstats_vendor.te
index eb255475..eb255475 100644
--- a/whitechapel/vendor/google/pixelstats_vendor.te
+++ b/sepolicy/whitechapel/vendor/google/pixelstats_vendor.te
diff --git a/whitechapel/vendor/google/platform_app.te b/sepolicy/whitechapel/vendor/google/platform_app.te
index 49fb531b..49fb531b 100644
--- a/whitechapel/vendor/google/platform_app.te
+++ b/sepolicy/whitechapel/vendor/google/platform_app.te
diff --git a/whitechapel/vendor/google/property.te b/sepolicy/whitechapel/vendor/google/property.te
index f1430adf..f1430adf 100644
--- a/whitechapel/vendor/google/property.te
+++ b/sepolicy/whitechapel/vendor/google/property.te
diff --git a/whitechapel/vendor/google/property_contexts b/sepolicy/whitechapel/vendor/google/property_contexts
index c9e16156..c9e16156 100644
--- a/whitechapel/vendor/google/property_contexts
+++ b/sepolicy/whitechapel/vendor/google/property_contexts
diff --git a/whitechapel/vendor/google/radio.te b/sepolicy/whitechapel/vendor/google/radio.te
index baa356bd..baa356bd 100644
--- a/whitechapel/vendor/google/radio.te
+++ b/sepolicy/whitechapel/vendor/google/radio.te
diff --git a/whitechapel/vendor/google/ramdump_app.te b/sepolicy/whitechapel/vendor/google/ramdump_app.te
index 308e9fb7..308e9fb7 100644
--- a/whitechapel/vendor/google/ramdump_app.te
+++ b/sepolicy/whitechapel/vendor/google/ramdump_app.te
diff --git a/whitechapel/vendor/google/recovery.te b/sepolicy/whitechapel/vendor/google/recovery.te
index 1974ebb1..1974ebb1 100644
--- a/whitechapel/vendor/google/recovery.te
+++ b/sepolicy/whitechapel/vendor/google/recovery.te
diff --git a/whitechapel/vendor/google/rfsd.te b/sepolicy/whitechapel/vendor/google/rfsd.te
index 2f7102fc..2f7102fc 100644
--- a/whitechapel/vendor/google/rfsd.te
+++ b/sepolicy/whitechapel/vendor/google/rfsd.te
diff --git a/whitechapel/vendor/google/ril_config_service.te b/sepolicy/whitechapel/vendor/google/ril_config_service.te
index 0ac43317..0ac43317 100644
--- a/whitechapel/vendor/google/ril_config_service.te
+++ b/sepolicy/whitechapel/vendor/google/ril_config_service.te
diff --git a/whitechapel/vendor/google/rild.te b/sepolicy/whitechapel/vendor/google/rild.te
index 78b14e51..78b14e51 100644
--- a/whitechapel/vendor/google/rild.te
+++ b/sepolicy/whitechapel/vendor/google/rild.te
diff --git a/whitechapel/vendor/google/rlsservice.te b/sepolicy/whitechapel/vendor/google/rlsservice.te
index 3086bcad..3086bcad 100644
--- a/whitechapel/vendor/google/rlsservice.te
+++ b/sepolicy/whitechapel/vendor/google/rlsservice.te
diff --git a/whitechapel/vendor/google/scd.te b/sepolicy/whitechapel/vendor/google/scd.te
index 28aaee0a..28aaee0a 100644
--- a/whitechapel/vendor/google/scd.te
+++ b/sepolicy/whitechapel/vendor/google/scd.te
diff --git a/whitechapel/vendor/google/sced.te b/sepolicy/whitechapel/vendor/google/sced.te
index 43292621..43292621 100644
--- a/whitechapel/vendor/google/sced.te
+++ b/sepolicy/whitechapel/vendor/google/sced.te
diff --git a/whitechapel/vendor/google/seapp_contexts b/sepolicy/whitechapel/vendor/google/seapp_contexts
index f866e37a..f866e37a 100644
--- a/whitechapel/vendor/google/seapp_contexts
+++ b/sepolicy/whitechapel/vendor/google/seapp_contexts
diff --git a/whitechapel/vendor/google/secure_element.te b/sepolicy/whitechapel/vendor/google/secure_element.te
index cb6c1396..cb6c1396 100644
--- a/whitechapel/vendor/google/secure_element.te
+++ b/sepolicy/whitechapel/vendor/google/secure_element.te
diff --git a/whitechapel/vendor/google/service.te b/sepolicy/whitechapel/vendor/google/service.te
index 8d5dc1ee..8d5dc1ee 100644
--- a/whitechapel/vendor/google/service.te
+++ b/sepolicy/whitechapel/vendor/google/service.te
diff --git a/whitechapel/vendor/google/service_contexts b/sepolicy/whitechapel/vendor/google/service_contexts
index 25108867..25108867 100644
--- a/whitechapel/vendor/google/service_contexts
+++ b/sepolicy/whitechapel/vendor/google/service_contexts
diff --git a/whitechapel/vendor/google/servicemanager.te b/sepolicy/whitechapel/vendor/google/servicemanager.te
index efddd92c..efddd92c 100644
--- a/whitechapel/vendor/google/servicemanager.te
+++ b/sepolicy/whitechapel/vendor/google/servicemanager.te
diff --git a/whitechapel/vendor/google/shell.te b/sepolicy/whitechapel/vendor/google/shell.te
index e13e744e..e13e744e 100644
--- a/whitechapel/vendor/google/shell.te
+++ b/sepolicy/whitechapel/vendor/google/shell.te
diff --git a/whitechapel/vendor/google/ssr_detector.te b/sepolicy/whitechapel/vendor/google/ssr_detector.te
index f27fcc5b..f27fcc5b 100644
--- a/whitechapel/vendor/google/ssr_detector.te
+++ b/sepolicy/whitechapel/vendor/google/ssr_detector.te
diff --git a/whitechapel/vendor/google/storageproxyd.te b/sepolicy/whitechapel/vendor/google/storageproxyd.te
index bf29cbf2..bf29cbf2 100644
--- a/whitechapel/vendor/google/storageproxyd.te
+++ b/sepolicy/whitechapel/vendor/google/storageproxyd.te
diff --git a/whitechapel/vendor/google/system_app.te b/sepolicy/whitechapel/vendor/google/system_app.te
index 8c9d5345..8c9d5345 100644
--- a/whitechapel/vendor/google/system_app.te
+++ b/sepolicy/whitechapel/vendor/google/system_app.te
diff --git a/whitechapel/vendor/google/system_server.te b/sepolicy/whitechapel/vendor/google/system_server.te
index d064cb73..d064cb73 100644
--- a/whitechapel/vendor/google/system_server.te
+++ b/sepolicy/whitechapel/vendor/google/system_server.te
diff --git a/whitechapel/vendor/google/tcpdump_logger.te b/sepolicy/whitechapel/vendor/google/tcpdump_logger.te
index f017cedf..f017cedf 100644
--- a/whitechapel/vendor/google/tcpdump_logger.te
+++ b/sepolicy/whitechapel/vendor/google/tcpdump_logger.te
diff --git a/whitechapel/vendor/google/toolbox.te b/sepolicy/whitechapel/vendor/google/toolbox.te
index 9fbbb7ab..9fbbb7ab 100644
--- a/whitechapel/vendor/google/toolbox.te
+++ b/sepolicy/whitechapel/vendor/google/toolbox.te
diff --git a/whitechapel/vendor/google/trusty_apploader.te b/sepolicy/whitechapel/vendor/google/trusty_apploader.te
index 983e3a03..983e3a03 100644
--- a/whitechapel/vendor/google/trusty_apploader.te
+++ b/sepolicy/whitechapel/vendor/google/trusty_apploader.te
diff --git a/whitechapel/vendor/google/untrusted_app_all.te b/sepolicy/whitechapel/vendor/google/untrusted_app_all.te
index 642ee175..642ee175 100644
--- a/whitechapel/vendor/google/untrusted_app_all.te
+++ b/sepolicy/whitechapel/vendor/google/untrusted_app_all.te
diff --git a/whitechapel/vendor/google/update_engine.te b/sepolicy/whitechapel/vendor/google/update_engine.te
index a403d9e4..a403d9e4 100644
--- a/whitechapel/vendor/google/update_engine.te
+++ b/sepolicy/whitechapel/vendor/google/update_engine.te
diff --git a/whitechapel/vendor/google/uwb_vendor_app.te b/sepolicy/whitechapel/vendor/google/uwb_vendor_app.te
index 68edcb1b..68edcb1b 100644
--- a/whitechapel/vendor/google/uwb_vendor_app.te
+++ b/sepolicy/whitechapel/vendor/google/uwb_vendor_app.te
diff --git a/whitechapel/vendor/google/vendor_ims_app.te b/sepolicy/whitechapel/vendor/google/vendor_ims_app.te
index 140d9c25..140d9c25 100644
--- a/whitechapel/vendor/google/vendor_ims_app.te
+++ b/sepolicy/whitechapel/vendor/google/vendor_ims_app.te
diff --git a/whitechapel/vendor/google/vendor_init.te b/sepolicy/whitechapel/vendor/google/vendor_init.te
index 8ebe5e52..8ebe5e52 100644
--- a/whitechapel/vendor/google/vendor_init.te
+++ b/sepolicy/whitechapel/vendor/google/vendor_init.te
diff --git a/whitechapel/vendor/google/vendor_rcs_app.te b/sepolicy/whitechapel/vendor/google/vendor_rcs_app.te
index e67727cc..e67727cc 100644
--- a/whitechapel/vendor/google/vendor_rcs_app.te
+++ b/sepolicy/whitechapel/vendor/google/vendor_rcs_app.te
diff --git a/whitechapel/vendor/google/vendor_shell.te b/sepolicy/whitechapel/vendor/google/vendor_shell.te
index 2ace587a..2ace587a 100644
--- a/whitechapel/vendor/google/vendor_shell.te
+++ b/sepolicy/whitechapel/vendor/google/vendor_shell.te
diff --git a/whitechapel/vendor/google/vendor_telephony_app.te b/sepolicy/whitechapel/vendor/google/vendor_telephony_app.te
index 499764b2..499764b2 100644
--- a/whitechapel/vendor/google/vendor_telephony_app.te
+++ b/sepolicy/whitechapel/vendor/google/vendor_telephony_app.te
diff --git a/whitechapel/vendor/google/vendor_uwb_init.te b/sepolicy/whitechapel/vendor/google/vendor_uwb_init.te
index 716af19c..716af19c 100644
--- a/whitechapel/vendor/google/vendor_uwb_init.te
+++ b/sepolicy/whitechapel/vendor/google/vendor_uwb_init.te
diff --git a/whitechapel/vendor/google/vndservice.te b/sepolicy/whitechapel/vendor/google/vndservice.te
index f70a26fe..f70a26fe 100644
--- a/whitechapel/vendor/google/vndservice.te
+++ b/sepolicy/whitechapel/vendor/google/vndservice.te
diff --git a/whitechapel/vendor/google/vndservice_contexts b/sepolicy/whitechapel/vendor/google/vndservice_contexts
index d44e1cb8..d44e1cb8 100644
--- a/whitechapel/vendor/google/vndservice_contexts
+++ b/sepolicy/whitechapel/vendor/google/vndservice_contexts
diff --git a/whitechapel/vendor/google/vold.te b/sepolicy/whitechapel/vendor/google/vold.te
index ecea1946..ecea1946 100644
--- a/whitechapel/vendor/google/vold.te
+++ b/sepolicy/whitechapel/vendor/google/vold.te
diff --git a/whitechapel/vendor/google/wifi_sniffer.te b/sepolicy/whitechapel/vendor/google/wifi_sniffer.te
index 491162a0..491162a0 100644
--- a/whitechapel/vendor/google/wifi_sniffer.te
+++ b/sepolicy/whitechapel/vendor/google/wifi_sniffer.te
diff --git a/whitechapel/vendor/google/wlcfwupdate.te b/sepolicy/whitechapel/vendor/google/wlcfwupdate.te
index 37c29484..37c29484 100644
--- a/whitechapel/vendor/google/wlcfwupdate.te
+++ b/sepolicy/whitechapel/vendor/google/wlcfwupdate.te
diff --git a/task_profiles.json b/task_profiles.json
new file mode 100644
index 00000000..4bcfe412
--- /dev/null
+++ b/task_profiles.json
@@ -0,0 +1,293 @@
+{
+ "Profiles": [
+ {
+ "Name": "MaxPerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_ta",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_ta",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "CameraServicePerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_cam",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_cam",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "CameraServicePower",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_cam_power",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_cam_power",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "Dex2oatPerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_dex2oat",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_dex2oat",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "OtaPerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_ota",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_ota",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "CameraServiceHighCapacity",
+ "Actions": [
+ {
+ "Name": "JoinCgroup",
+ "Params":
+ {
+ "Controller": "cpuset",
+ "Path": "camera-daemon-high-group"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "CameraServiceMidCapacity",
+ "Actions": [
+ {
+ "Name": "JoinCgroup",
+ "Params":
+ {
+ "Controller": "cpuset",
+ "Path": "camera-daemon-mid-group"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "CameraServiceMidHighCapacity",
+ "Actions": [
+ {
+ "Name": "JoinCgroup",
+ "Params":
+ {
+ "Controller": "cpuset",
+ "Path": "camera-daemon-mid-high-group"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "HighEnergySaving",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_bg",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_bg",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "NormalPerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_sys",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_sys",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "HighPerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_fg",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_fg",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "RealtimePerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_ta",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_ta",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "NNApiHALPerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_nnapi",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_nnapi",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "ServicePerformance",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_sysbg",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_sysbg",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "SFMainPolicy",
+ "Actions": [
+ {
+ "Name": "JoinCgroup",
+ "Params":
+ {
+ "Controller": "cpuset",
+ "Path": "top-app"
+ }
+ },
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_sf",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_sf",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "SFRenderEnginePolicy",
+ "Actions": [
+ {
+ "Name": "JoinCgroup",
+ "Params":
+ {
+ "Controller": "cpuset",
+ "Path": "top-app"
+ }
+ },
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/set_task_group_rt",
+ "ProcFilePath": "/proc/vendor_sched/set_proc_group_rt",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "ResetUclampGrp",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/uclamp_fork_reset_set",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ },
+ {
+ "Name": "NoResetUclampGrp",
+ "Actions": [
+ {
+ "Name": "WriteFile",
+ "Params":
+ {
+ "FilePath": "/proc/vendor_sched/uclamp_fork_reset_clear",
+ "Value": "<pid>",
+ "LogFailures": "false"
+ }
+ }
+ ]
+ }
+ ],
+
+ "AggregateProfiles": [
+ {
+ "Name": "Dex2OatBootComplete",
+ "Profiles": [ "Dex2oatPerformance", "ProcessCapacityNormal", "LowIoPriority", "TimerSlackHigh" ]
+ },
+ {
+ "Name": "OtaProfiles",
+ "Profiles": [ "OtaPerformance", "ServiceCapacityLow", "LowIoPriority", "TimerSlackHigh" ]
+ }
+ ]
+}
diff --git a/telephony/pktrouter.mk b/telephony/pktrouter.mk
new file mode 100644
index 00000000..dd923b59
--- /dev/null
+++ b/telephony/pktrouter.mk
@@ -0,0 +1,3 @@
+PRODUCT_PACKAGES += wfc-pkt-router
+PRODUCT_PROPERTY_OVERRIDES += vendor.pktrouter=1
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/telephony/pktrouter
diff --git a/telephony/user.mk b/telephony/user.mk
new file mode 100644
index 00000000..f75596f3
--- /dev/null
+++ b/telephony/user.mk
@@ -0,0 +1,2 @@
+PRODUCT_COPY_FILES += vendor/samsung_slsi/telephony/$(BOARD_USES_SHARED_VENDOR_TELEPHONY)/common/device/samsung/init.radio.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.radio.sh
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/telephony/user/
diff --git a/thermal/Android.mk b/thermal/Android.mk
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/thermal/Android.mk
diff --git a/thermal/thermal.c b/thermal/thermal.c
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/thermal/thermal.c
diff --git a/trusty_metricsd/trusty_metricsd.mk b/trusty_metricsd/trusty_metricsd.mk
new file mode 100644
index 00000000..487875be
--- /dev/null
+++ b/trusty_metricsd/trusty_metricsd.mk
@@ -0,0 +1,6 @@
+# Trusty Metrics Daemon
+PRODUCT_SOONG_NAMESPACES += \
+ vendor/google/trusty/common
+
+PRODUCT_PACKAGES += trusty_metricsd
+BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs101-sepolicy/trusty_metricsd
diff --git a/tts/de-de/de-de-x-multi-r35.zvoice b/tts/de-de/de-de-x-multi-r35.zvoice
new file mode 100644
index 00000000..0e7d9a31
--- /dev/null
+++ b/tts/de-de/de-de-x-multi-r35.zvoice
Binary files differ
diff --git a/tts/es-es/es-es-x-multi-r35.zvoice b/tts/es-es/es-es-x-multi-r35.zvoice
new file mode 100644
index 00000000..4b35606e
--- /dev/null
+++ b/tts/es-es/es-es-x-multi-r35.zvoice
Binary files differ
diff --git a/tts/fr-fr/fr-fr-x-multi-r35.zvoice b/tts/fr-fr/fr-fr-x-multi-r35.zvoice
new file mode 100644
index 00000000..67e4f0d3
--- /dev/null
+++ b/tts/fr-fr/fr-fr-x-multi-r35.zvoice
Binary files differ
diff --git a/tts/it-it/it-it-x-multi-r32.zvoice b/tts/it-it/it-it-x-multi-r32.zvoice
new file mode 100644
index 00000000..a90c9d87
--- /dev/null
+++ b/tts/it-it/it-it-x-multi-r32.zvoice
Binary files differ
diff --git a/tts/ja-jp/ja-jp-x-multi-r34.zvoice b/tts/ja-jp/ja-jp-x-multi-r34.zvoice
new file mode 100644
index 00000000..dcb46dcb
--- /dev/null
+++ b/tts/ja-jp/ja-jp-x-multi-r34.zvoice
Binary files differ
diff --git a/tts/voice_packs.mk b/tts/voice_packs.mk
new file mode 100644
index 00000000..9e535dd6
--- /dev/null
+++ b/tts/voice_packs.mk
@@ -0,0 +1,22 @@
+#
+# Copyright (C) 2022 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.
+
+# Voice packs for Text-To-Speech
+PRODUCT_COPY_FILES += \
+ device/google/gs101/tts/ja-jp/ja-jp-x-multi-r34.zvoice:product/tts/google/ja-jp/ja-jp-x-multi-r34.zvoice\
+ device/google/gs101/tts/fr-fr/fr-fr-x-multi-r35.zvoice:product/tts/google/fr-fr/fr-fr-x-multi-r35.zvoice\
+ device/google/gs101/tts/de-de/de-de-x-multi-r35.zvoice:product/tts/google/de-de/de-de-x-multi-r35.zvoice\
+ device/google/gs101/tts/it-it/it-it-x-multi-r32.zvoice:product/tts/google/it-it/it-it-x-multi-r32.zvoice\
+ device/google/gs101/tts/es-es/es-es-x-multi-r35.zvoice:product/tts/google/es-es/es-es-x-multi-r35.zvoice
diff --git a/usb/gadget/Android.bp b/usb/gadget/Android.bp
new file mode 100644
index 00000000..ab7ac325
--- /dev/null
+++ b/usb/gadget/Android.bp
@@ -0,0 +1,52 @@
+//
+// Copyright (C) 2021 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "//device/google/gs101:device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "//device/google/gs101:device_google_gs101_license",
+ ],
+}
+
+cc_binary {
+ name: "android.hardware.usb.gadget-service.gs101",
+ relative_install_path: "hw",
+ init_rc: ["android.hardware.usb.gadget-service.gs101.rc"],
+ vintf_fragments: [
+ "android.hardware.usb.gadget@1.2-service.gs101.xml",
+ ],
+ srcs: ["service_gadget.cpp", "UsbGadget.cpp"],
+ cflags: ["-Wall", "-Werror"],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libhidlbase",
+ "liblog",
+ "libutils",
+ "libhardware",
+ "android.hardware.usb.gadget@1.0",
+ "android.hardware.usb.gadget@1.1",
+ "android.hardware.usb.gadget@1.2",
+ "libcutils",
+ ],
+ static_libs: [
+ "libpixelusb",
+ ],
+ proprietary: true,
+}
diff --git a/usb/gadget/UsbGadget.cpp b/usb/gadget/UsbGadget.cpp
new file mode 100644
index 00000000..b6d1dd39
--- /dev/null
+++ b/usb/gadget/UsbGadget.cpp
@@ -0,0 +1,514 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+#define LOG_TAG "android.hardware.usb.gadget@1.2-service.gs101"
+
+#include "UsbGadget.h"
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/inotify.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+namespace android {
+namespace hardware {
+namespace usb {
+namespace gadget {
+namespace V1_2 {
+namespace implementation {
+
+string enabledPath;
+constexpr char kHsi2cPath[] = "/sys/devices/platform/10d50000.hsi2c";
+constexpr char kI2CPath[] = "/sys/devices/platform/10d50000.hsi2c/i2c-";
+constexpr char kAccessoryLimitCurrent[] = "i2c-max77759tcpc/usb_limit_accessory_current";
+constexpr char kAccessoryLimitCurrentEnable[] = "i2c-max77759tcpc/usb_limit_accessory_enable";
+
+UsbGadget::UsbGadget() : mGadgetIrqPath("") {
+ if (access(OS_DESC_PATH, R_OK) != 0) {
+ ALOGE("configfs setup not done yet");
+ abort();
+ }
+}
+
+V1_0::Status UsbGadget::getUsbGadgetIrqPath() {
+ std::string irqs;
+ size_t read_pos = 0;
+ size_t found_pos = 0;
+
+ if (!ReadFileToString(kProcInterruptsPath, &irqs)) {
+ ALOGE("cannot read all interrupts");
+ return Status::ERROR;
+ }
+
+ while (true) {
+ found_pos = irqs.find_first_of("\n", read_pos);
+ if (found_pos == std::string::npos) {
+ ALOGI("the string of all interrupts is unexpected");
+ return Status::ERROR;
+ }
+
+ std::string single_irq = irqs.substr(read_pos, found_pos - read_pos);
+
+ if (single_irq.find("dwc3", 0) != std::string::npos) {
+ unsigned int dwc3_irq_number;
+ size_t dwc3_pos = single_irq.find_first_of(":");
+ if (!ParseUint(single_irq.substr(0, dwc3_pos), &dwc3_irq_number)) {
+ ALOGI("unknown IRQ strings");
+ return Status::ERROR;
+ }
+
+ mGadgetIrqPath = kProcIrqPath + single_irq.substr(0, dwc3_pos) + kSmpAffinityList;
+ break;
+ }
+
+ if (found_pos == irqs.npos) {
+ ALOGI("USB gadget doesn't start");
+ return Status::ERROR;
+ }
+
+ read_pos = found_pos + 1;
+ }
+
+ return Status::SUCCESS;
+}
+
+void currentFunctionsAppliedCallback(bool functionsApplied, void *payload) {
+ UsbGadget *gadget = (UsbGadget *)payload;
+ gadget->mCurrentUsbFunctionsApplied = functionsApplied;
+}
+
+Return<void> UsbGadget::getCurrentUsbFunctions(const sp<V1_0::IUsbGadgetCallback> &callback) {
+ Return<void> ret = callback->getCurrentUsbFunctionsCb(
+ mCurrentUsbFunctions,
+ mCurrentUsbFunctionsApplied ? Status::FUNCTIONS_APPLIED : Status::FUNCTIONS_NOT_APPLIED);
+ if (!ret.isOk())
+ ALOGE("Call to getCurrentUsbFunctionsCb failed %s", ret.description().c_str());
+
+ return Void();
+}
+
+Return<void> UsbGadget::getUsbSpeed(const sp<V1_2::IUsbGadgetCallback> &callback) {
+ std::string current_speed;
+ if (ReadFileToString(SPEED_PATH, &current_speed)) {
+ current_speed = Trim(current_speed);
+ ALOGI("current USB speed is %s", current_speed.c_str());
+ if (current_speed == "low-speed")
+ mUsbSpeed = UsbSpeed::LOWSPEED;
+ else if (current_speed == "full-speed")
+ mUsbSpeed = UsbSpeed::FULLSPEED;
+ else if (current_speed == "high-speed")
+ mUsbSpeed = UsbSpeed::HIGHSPEED;
+ else if (current_speed == "super-speed")
+ mUsbSpeed = UsbSpeed::SUPERSPEED;
+ else if (current_speed == "super-speed-plus")
+ mUsbSpeed = UsbSpeed::SUPERSPEED_10Gb;
+ else if (current_speed == "UNKNOWN")
+ mUsbSpeed = UsbSpeed::UNKNOWN;
+ else
+ mUsbSpeed = UsbSpeed::RESERVED_SPEED;
+ } else {
+ ALOGE("Fail to read current speed");
+ mUsbSpeed = UsbSpeed::UNKNOWN;
+ }
+
+ if (callback) {
+ Return<void> ret = callback->getUsbSpeedCb(mUsbSpeed);
+
+ if (!ret.isOk())
+ ALOGE("Call to getUsbSpeedCb failed %s", ret.description().c_str());
+ }
+
+ return Void();
+}
+
+V1_0::Status UsbGadget::tearDownGadget() {
+ if (resetGadget() != Status::SUCCESS)
+ return Status::ERROR;
+
+ if (monitorFfs.isMonitorRunning()) {
+ monitorFfs.reset();
+ } else {
+ ALOGI("mMonitor not running");
+ }
+ return Status::SUCCESS;
+}
+
+static V1_0::Status validateAndSetVidPid(uint64_t functions) {
+ V1_0::Status ret = Status::SUCCESS;
+ std::string vendorFunctions = getVendorFunctions();
+
+ switch (functions) {
+ case static_cast<uint64_t>(GadgetFunction::MTP):
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee1");
+ }
+ break;
+ case GadgetFunction::ADB | GadgetFunction::MTP:
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee2");
+ }
+ break;
+ case static_cast<uint64_t>(GadgetFunction::RNDIS):
+ case GadgetFunction::RNDIS | GadgetFunction::NCM:
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee3");
+ }
+ break;
+ case GadgetFunction::ADB | GadgetFunction::RNDIS:
+ case GadgetFunction::ADB | GadgetFunction::RNDIS | GadgetFunction::NCM:
+ if (vendorFunctions == "dm") {
+ ret = setVidPid("0x04e8", "0x6862");
+ } else {
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee4");
+ }
+ }
+ break;
+ case static_cast<uint64_t>(GadgetFunction::PTP):
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee5");
+ }
+ break;
+ case GadgetFunction::ADB | GadgetFunction::PTP:
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee6");
+ }
+ break;
+ case static_cast<uint64_t>(GadgetFunction::ADB):
+ if (vendorFunctions == "dm") {
+ ret = setVidPid("0x04e8", "0x6862");
+ } else if (vendorFunctions == "etr_miu") {
+ ret = setVidPid("0x18d1", "0x4ee2");
+ } else if (vendorFunctions == "uwb_acm"){
+ ret = setVidPid("0x18d1", "0x4ee2");
+ } else {
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee7");
+ }
+ }
+ break;
+ case static_cast<uint64_t>(GadgetFunction::MIDI):
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee8");
+ }
+ break;
+ case GadgetFunction::ADB | GadgetFunction::MIDI:
+ if (!(vendorFunctions == "user" || vendorFunctions == "")) {
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ } else {
+ ret = setVidPid("0x18d1", "0x4ee9");
+ }
+ break;
+ case static_cast<uint64_t>(GadgetFunction::ACCESSORY):
+ if (!(vendorFunctions == "user" || vendorFunctions == ""))
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = setVidPid("0x18d1", "0x2d00");
+ break;
+ case GadgetFunction::ADB | GadgetFunction::ACCESSORY:
+ if (!(vendorFunctions == "user" || vendorFunctions == ""))
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = setVidPid("0x18d1", "0x2d01");
+ break;
+ case static_cast<uint64_t>(GadgetFunction::AUDIO_SOURCE):
+ if (!(vendorFunctions == "user" || vendorFunctions == ""))
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = setVidPid("0x18d1", "0x2d02");
+ break;
+ case GadgetFunction::ADB | GadgetFunction::AUDIO_SOURCE:
+ if (!(vendorFunctions == "user" || vendorFunctions == ""))
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = setVidPid("0x18d1", "0x2d03");
+ break;
+ case GadgetFunction::ACCESSORY | GadgetFunction::AUDIO_SOURCE:
+ if (!(vendorFunctions == "user" || vendorFunctions == ""))
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = setVidPid("0x18d1", "0x2d04");
+ break;
+ case GadgetFunction::ADB | GadgetFunction::ACCESSORY | GadgetFunction::AUDIO_SOURCE:
+ if (!(vendorFunctions == "user" || vendorFunctions == ""))
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = setVidPid("0x18d1", "0x2d05");
+ break;
+ case static_cast<uint64_t>(GadgetFunction::NCM):
+ if (!(vendorFunctions == "user" || vendorFunctions == ""))
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = setVidPid("0x18d1", "0x4eeb");
+ break;
+ case GadgetFunction::ADB | GadgetFunction::NCM:
+ if (vendorFunctions == "dm") {
+ ret = setVidPid("0x04e8", "0x6862");
+ } else {
+ if (!(vendorFunctions == "user" || vendorFunctions == ""))
+ ALOGE("Invalid vendorFunctions set: %s", vendorFunctions.c_str());
+ ret = setVidPid("0x18d1", "0x4eec");
+ }
+ break;
+ default:
+ ALOGE("Combination not supported");
+ ret = Status::CONFIGURATION_NOT_SUPPORTED;
+ }
+ return ret;
+}
+
+Return<Status> UsbGadget::reset() {
+ ALOGI("USB Gadget reset");
+
+ if (!WriteStringToFile("none", PULLUP_PATH)) {
+ ALOGI("Gadget cannot be pulled down");
+ return Status::ERROR;
+ }
+
+ usleep(kDisconnectWaitUs);
+
+ if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) {
+ ALOGI("Gadget cannot be pulled up");
+ return Status::ERROR;
+ }
+
+ return Status::SUCCESS;
+}
+
+V1_0::Status UsbGadget::setupFunctions(uint64_t functions,
+ const sp<V1_0::IUsbGadgetCallback> &callback,
+ uint64_t timeout) {
+ bool ffsEnabled = false;
+ int i = 0;
+
+ if (addGenericAndroidFunctions(&monitorFfs, functions, &ffsEnabled, &i) !=
+ Status::SUCCESS)
+ return Status::ERROR;
+
+ std::string vendorFunctions = getVendorFunctions();
+
+ if (vendorFunctions == "dm") {
+ ALOGI("enable usbradio debug functions");
+ if ((functions & GadgetFunction::RNDIS) != 0) {
+ if (linkFunction("acm.gs6", i++))
+ return Status::ERROR;
+ if (linkFunction("dm.gs7", i++))
+ return Status::ERROR;
+ } else {
+ if (linkFunction("dm.gs7", i++))
+ return Status::ERROR;
+ if (linkFunction("acm.gs6", i++))
+ return Status::ERROR;
+ }
+ } else if (vendorFunctions == "etr_miu") {
+ ALOGI("enable etr_miu functions");
+ if (linkFunction("etr_miu.gs11", i++))
+ return Status::ERROR;
+ } else if (vendorFunctions == "uwb_acm") {
+ ALOGI("enable uwb acm function");
+ if (linkFunction("acm.uwb0", i++))
+ return Status::ERROR;
+ }
+
+ if ((functions & GadgetFunction::ADB) != 0) {
+ ffsEnabled = true;
+ if (addAdb(&monitorFfs, &i) != Status::SUCCESS)
+ return Status::ERROR;
+ }
+
+ if ((functions & GadgetFunction::NCM) != 0) {
+ ALOGI("setCurrentUsbFunctions ncm");
+ if (linkFunction("ncm.gs9", i++))
+ return Status::ERROR;
+ }
+
+ // Pull up the gadget right away when there are no ffs functions.
+ if (!ffsEnabled) {
+ if (!WriteStringToFile(kGadgetName, PULLUP_PATH))
+ return Status::ERROR;
+ mCurrentUsbFunctionsApplied = true;
+ if (callback)
+ callback->setCurrentUsbFunctionsCb(functions, Status::SUCCESS);
+ return Status::SUCCESS;
+ }
+
+ monitorFfs.registerFunctionsAppliedCallback(&currentFunctionsAppliedCallback, this);
+ // Monitors the ffs paths to pull up the gadget when descriptors are written.
+ // Also takes of the pulling up the gadget again if the userspace process
+ // dies and restarts.
+ monitorFfs.startMonitor();
+
+ if (kDebug)
+ ALOGI("Mainthread in Cv");
+
+ if (callback) {
+ bool pullup = monitorFfs.waitForPullUp(timeout);
+ Return<void> ret = callback->setCurrentUsbFunctionsCb(
+ functions, pullup ? Status::SUCCESS : Status::ERROR);
+ if (!ret.isOk())
+ ALOGE("setCurrentUsbFunctionsCb error %s", ret.description().c_str());
+ }
+
+ return Status::SUCCESS;
+}
+
+Status getI2cBusHelper(string *name) {
+ DIR *dp;
+
+ dp = opendir(kHsi2cPath);
+ if (dp != NULL) {
+ struct dirent *ep;
+
+ while ((ep = readdir(dp))) {
+ if (ep->d_type == DT_DIR) {
+ if (string::npos != string(ep->d_name).find("i2c-")) {
+ std::strtok(ep->d_name, "-");
+ *name = std::strtok(NULL, "-");
+ }
+ }
+ }
+ closedir(dp);
+ return Status::SUCCESS;
+ }
+
+ ALOGE("Failed to open %s", kHsi2cPath);
+ return Status::ERROR;
+}
+
+Return<void> UsbGadget::setCurrentUsbFunctions(uint64_t functions,
+ const sp<V1_0::IUsbGadgetCallback> &callback,
+ uint64_t timeout) {
+ std::unique_lock<std::mutex> lk(mLockSetCurrentFunction);
+ std::string current_usb_power_operation_mode, current_usb_type;
+ std::string usb_limit_sink_enable;
+
+ string accessoryCurrentLimitEnablePath, accessoryCurrentLimitPath, path;
+
+ mCurrentUsbFunctions = functions;
+ mCurrentUsbFunctionsApplied = false;
+
+ getI2cBusHelper(&path);
+ accessoryCurrentLimitPath = kI2CPath + path + "/" + kAccessoryLimitCurrent;
+ accessoryCurrentLimitEnablePath = kI2CPath + path + "/" + kAccessoryLimitCurrentEnable;
+
+ // Get the gadget IRQ number before tearDownGadget()
+ if (mGadgetIrqPath.empty())
+ getUsbGadgetIrqPath();
+
+ // Unlink the gadget and stop the monitor if running.
+ V1_0::Status status = tearDownGadget();
+ if (status != Status::SUCCESS) {
+ goto error;
+ }
+
+ ALOGI("Returned from tearDown gadget");
+
+ // Leave the gadget pulled down to give time for the host to sense disconnect.
+ usleep(kDisconnectWaitUs);
+
+ if (functions == static_cast<uint64_t>(GadgetFunction::NONE)) {
+ if (callback == NULL)
+ return Void();
+ Return<void> ret = callback->setCurrentUsbFunctionsCb(functions, Status::SUCCESS);
+ if (!ret.isOk())
+ ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.description().c_str());
+ return Void();
+ }
+
+ status = validateAndSetVidPid(functions);
+
+ if (status != Status::SUCCESS) {
+ goto error;
+ }
+
+ status = setupFunctions(functions, callback, timeout);
+ if (status != Status::SUCCESS) {
+ goto error;
+ }
+
+ if (functions & GadgetFunction::NCM) {
+ if (!mGadgetIrqPath.empty()) {
+ if (!WriteStringToFile(BIG_CORE, mGadgetIrqPath))
+ ALOGI("Cannot move gadget IRQ to big core, path:%s", mGadgetIrqPath.c_str());
+ }
+ } else {
+ if (!mGadgetIrqPath.empty()) {
+ if (!WriteStringToFile(MEDIUM_CORE, mGadgetIrqPath))
+ ALOGI("Cannot move gadget IRQ to medium core, path:%s", mGadgetIrqPath.c_str());
+ }
+ }
+
+ if (ReadFileToString(CURRENT_USB_TYPE_PATH, &current_usb_type))
+ current_usb_type = Trim(current_usb_type);
+
+ if (ReadFileToString(CURRENT_USB_POWER_OPERATION_MODE_PATH, &current_usb_power_operation_mode))
+ current_usb_power_operation_mode = Trim(current_usb_power_operation_mode);
+
+ if (functions & GadgetFunction::ACCESSORY &&
+ current_usb_type == "Unknown SDP [CDP] DCP" &&
+ (current_usb_power_operation_mode == "default" ||
+ current_usb_power_operation_mode == "1.5A")) {
+ if (!WriteStringToFile("1300000", accessoryCurrentLimitPath)) {
+ ALOGI("Write 1.3A to limit current fail");
+ } else {
+ if (!WriteStringToFile("1", accessoryCurrentLimitEnablePath)) {
+ ALOGI("Enable limit current fail");
+ }
+ }
+ } else {
+ if (!WriteStringToFile("0", accessoryCurrentLimitEnablePath))
+ ALOGI("unvote accessory limit current failed");
+ }
+
+ ALOGI("Usb Gadget setcurrent functions called successfully");
+ return Void();
+
+error:
+ ALOGI("Usb Gadget setcurrent functions failed");
+ if (callback == NULL)
+ return Void();
+ Return<void> ret = callback->setCurrentUsbFunctionsCb(functions, status);
+ if (!ret.isOk())
+ ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.description().c_str());
+ return Void();
+}
+} // namespace implementation
+} // namespace V1_2
+} // namespace gadget
+} // namespace usb
+} // namespace hardware
+} // namespace android
diff --git a/usb/gadget/UsbGadget.h b/usb/gadget/UsbGadget.h
new file mode 100644
index 00000000..96a356db
--- /dev/null
+++ b/usb/gadget/UsbGadget.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <android-base/file.h>
+#include <android-base/properties.h>
+#include <android-base/unique_fd.h>
+#include <android-base/parseint.h>
+#include <android-base/strings.h>
+#include <android/hardware/usb/gadget/1.2/IUsbGadget.h>
+#include <android/hardware/usb/gadget/1.2/types.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <pixelusb/UsbGadgetCommon.h>
+#include <sys/epoll.h>
+#include <sys/eventfd.h>
+#include <utils/Log.h>
+#include <chrono>
+#include <condition_variable>
+#include <mutex>
+#include <string>
+#include <thread>
+
+namespace android {
+namespace hardware {
+namespace usb {
+namespace gadget {
+namespace V1_2 {
+namespace implementation {
+
+using ::android::sp;
+using ::android::base::GetProperty;
+using ::android::base::SetProperty;
+using ::android::base::ParseUint;
+using ::android::base::unique_fd;
+using ::android::base::ReadFileToString;
+using ::android::base::Trim;
+using ::android::base::WriteStringToFile;
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::hardware::google::pixel::usb::addAdb;
+using ::android::hardware::google::pixel::usb::addEpollFd;
+using ::android::hardware::google::pixel::usb::getVendorFunctions;
+using ::android::hardware::google::pixel::usb::kDebug;
+using ::android::hardware::google::pixel::usb::kDisconnectWaitUs;
+using ::android::hardware::google::pixel::usb::linkFunction;
+using ::android::hardware::google::pixel::usb::MonitorFfs;
+using ::android::hardware::google::pixel::usb::resetGadget;
+using ::android::hardware::google::pixel::usb::setVidPid;
+using ::android::hardware::google::pixel::usb::unlinkFunctions;
+using ::android::hardware::usb::gadget::V1_0::Status;
+using ::android::hardware::usb::gadget::V1_0::IUsbGadgetCallback;
+using ::android::hardware::usb::gadget::V1_2::IUsbGadget;
+using ::android::hardware::usb::gadget::V1_2::GadgetFunction;
+using ::std::string;
+
+constexpr char kGadgetName[] = "11110000.dwc3";
+constexpr char kProcInterruptsPath[] = "/proc/interrupts";
+constexpr char kProcIrqPath[] = "/proc/irq/";
+constexpr char kSmpAffinityList[] = "/smp_affinity_list";
+#ifndef UDC_PATH
+#define UDC_PATH "/sys/class/udc/11110000.dwc3/"
+#endif
+constexpr char kExtconTypecState[] = "/sys/class/extcon/extcon0/cable.0/state";
+constexpr char kUsbGadgetState[] = "/sys/devices/platform/11110000.usb/dwc3_exynos_gadget_state";
+static MonitorFfs monitorFfs(kGadgetName, kExtconTypecState, kUsbGadgetState);
+
+#define SPEED_PATH UDC_PATH "current_speed"
+
+#define BIG_CORE "6"
+#define MEDIUM_CORE "4"
+
+#define POWER_SUPPLY_PATH "/sys/class/power_supply/usb/"
+#define USB_PORT0_PATH "/sys/class/typec/port0/"
+
+#define CURRENT_MAX_PATH POWER_SUPPLY_PATH "current_max"
+#define CURRENT_USB_TYPE_PATH POWER_SUPPLY_PATH "usb_type"
+#define CURRENT_USB_POWER_OPERATION_MODE_PATH USB_PORT0_PATH "power_operation_mode"
+
+struct UsbGadget : public IUsbGadget {
+ UsbGadget();
+
+ // Makes sure that only one request is processed at a time.
+ std::mutex mLockSetCurrentFunction;
+ std::string mGadgetIrqPath;
+ uint64_t mCurrentUsbFunctions;
+ bool mCurrentUsbFunctionsApplied;
+ UsbSpeed mUsbSpeed;
+
+ Return<void> setCurrentUsbFunctions(uint64_t functions,
+ const sp<V1_0::IUsbGadgetCallback> &callback,
+ uint64_t timeout) override;
+
+ Return<void> getCurrentUsbFunctions(const sp<V1_0::IUsbGadgetCallback> &callback) override;
+
+ Return<Status> reset() override;
+
+ Return<void> getUsbSpeed(const sp<V1_2::IUsbGadgetCallback> &callback) override;
+
+ private:
+ Status tearDownGadget();
+ Status getUsbGadgetIrqPath();
+ Status setupFunctions(uint64_t functions, const sp<V1_0::IUsbGadgetCallback> &callback,
+ uint64_t timeout);
+};
+
+} // namespace implementation
+} // namespace V1_2
+} // namespace gadget
+} // namespace usb
+} // namespace hardware
+} // namespace android
diff --git a/usb/gadget/android.hardware.usb.gadget-service.gs101.rc b/usb/gadget/android.hardware.usb.gadget-service.gs101.rc
new file mode 100644
index 00000000..da1a3b41
--- /dev/null
+++ b/usb/gadget/android.hardware.usb.gadget-service.gs101.rc
@@ -0,0 +1,24 @@
+service vendor.usb-gadget-hal-1-2 /vendor/bin/hw/android.hardware.usb.gadget-service.gs101
+ class hal
+ user system
+ group system shell mtp wakelock
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+
+on post-fs
+ chown root system /sys/class/typec/port0/power_role
+ chown root system /sys/class/typec/port0/data_role
+ chown root system /sys/class/typec/port0/port_type
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+ chown root system /sys/devices/platform/11110000.usb/usb_data_enabled
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_gadget_state
+ chmod 664 /sys/class/typec/port0/power_role
+ chmod 664 /sys/class/typec/port0/data_role
+ chmod 664 /sys/class/typec/port0/port_type
+ chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+ chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+ chmod 664 /sys/devices/platform/11110000.usb/usb_data_enabled
diff --git a/usb/gadget/android.hardware.usb.gadget@1.2-service.gs101.xml b/usb/gadget/android.hardware.usb.gadget@1.2-service.gs101.xml
new file mode 100644
index 00000000..8557f6ff
--- /dev/null
+++ b/usb/gadget/android.hardware.usb.gadget@1.2-service.gs101.xml
@@ -0,0 +1,11 @@
+<manifest version="1.0" type="device">
+ <hal format="hidl">
+ <name>android.hardware.usb.gadget</name>
+ <transport>hwbinder</transport>
+ <version>1.2</version>
+ <interface>
+ <name>IUsbGadget</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/usb/gadget/service_gadget.cpp b/usb/gadget/service_gadget.cpp
new file mode 100644
index 00000000..d0908ee4
--- /dev/null
+++ b/usb/gadget/service_gadget.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+#define LOG_TAG "android.hardware.usb.gadget-service.gs101"
+
+#include <hidl/HidlTransportSupport.h>
+#include "UsbGadget.h"
+
+using android::sp;
+
+// libhwbinder:
+using android::hardware::configureRpcThreadpool;
+using android::hardware::joinRpcThreadpool;
+
+// Generated HIDL files
+using android::hardware::usb::gadget::V1_2::IUsbGadget;
+using android::hardware::usb::gadget::V1_2::implementation::UsbGadget;
+
+using android::OK;
+using android::status_t;
+
+int main() {
+ android::sp<IUsbGadget> service = new UsbGadget();
+ configureRpcThreadpool(2, true /*callerWillJoin*/);
+ status_t status = service->registerAsService();
+
+ if (status != OK) {
+ ALOGE("Cannot register USB Gadget HAL service");
+ return 1;
+ }
+
+ ALOGI("USB gadget HAL Ready.");
+ joinRpcThreadpool();
+ // Under noraml cases, execution will not reach this line.
+ ALOGI("USB gadget HAL failed to join thread pool.");
+ return 1;
+}
diff --git a/usb/usb/Android.bp b/usb/usb/Android.bp
new file mode 100644
index 00000000..f0f50698
--- /dev/null
+++ b/usb/usb/Android.bp
@@ -0,0 +1,61 @@
+//
+// Copyright (C) 2021 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "device_google_gs101_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["device_google_gs101_license"],
+}
+
+cc_binary {
+ name: "android.hardware.usb-service.gs101",
+ relative_install_path: "hw",
+ init_rc: ["android.hardware.usb-service.rc"],
+ vintf_fragments: ["android.hardware.usb-service.xml"],
+ vendor: true,
+ srcs: [
+ "service.cpp",
+ "Usb.cpp",
+ ],
+ shared_libs: [
+ "libbase",
+ "libbinder",
+ "libhidlbase",
+ "liblog",
+ "libutils",
+ "libhardware",
+ "android.hardware.thermal@1.0",
+ "android.hardware.thermal@2.0",
+ "android.hardware.usb.gadget@1.0",
+ "android.hardware.usb-V1-ndk",
+ "libcutils",
+ "android.frameworks.stats-V1-ndk",
+ "pixelatoms-cpp",
+ "libbinder_ndk",
+
+ ],
+ static_libs: [
+ "libpixelusb",
+ "libpixelstats",
+ ],
+ export_shared_lib_headers: [
+ "android.frameworks.stats-V1-ndk",
+ "pixelatoms-cpp",
+ ],
+}
diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp
new file mode 100644
index 00000000..d3c5036a
--- /dev/null
+++ b/usb/usb/Usb.cpp
@@ -0,0 +1,1034 @@
+/*
+ * Copyright (C) 2021 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.
+ */
+
+#define LOG_TAG "android.hardware.usb.aidl-service"
+
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <android-base/strings.h>
+#include <assert.h>
+#include <cstring>
+#include <dirent.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <chrono>
+#include <regex>
+#include <thread>
+#include <unordered_map>
+
+#include <cutils/uevent.h>
+#include <sys/epoll.h>
+#include <utils/Errors.h>
+#include <utils/StrongPointer.h>
+
+#include "Usb.h"
+
+#include <aidl/android/frameworks/stats/IStats.h>
+#include <pixelusb/UsbGadgetCommon.h>
+#include <pixelstats/StatsHelper.h>
+
+using aidl::android::frameworks::stats::IStats;
+using android::base::GetProperty;
+using android::base::Trim;
+using android::hardware::google::pixel::getStatsService;
+using android::hardware::google::pixel::PixelAtoms::VendorUsbPortOverheat;
+using android::hardware::google::pixel::reportUsbPortOverheat;
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace usb {
+// Set by the signal handler to destroy the thread
+volatile bool destroyThread;
+
+string enabledPath;
+constexpr char kHsi2cPath[] = "/sys/devices/platform/10d50000.hsi2c";
+constexpr char kI2CPath[] = "/sys/devices/platform/10d50000.hsi2c/i2c-";
+constexpr char kContaminantDetectionPath[] = "i2c-max77759tcpc/contaminant_detection";
+constexpr char kStatusPath[] = "i2c-max77759tcpc/contaminant_detection_status";
+constexpr char kSinkLimitEnable[] = "i2c-max77759tcpc/usb_limit_sink_enable";
+constexpr char kSourceLimitEnable[] = "i2c-max77759tcpc/usb_limit_source_enable";
+constexpr char kSinkLimitCurrent[] = "i2c-max77759tcpc/usb_limit_sink_current";
+constexpr char kTypecPath[] = "/sys/class/typec";
+constexpr char kDisableContatminantDetection[] = "vendor.usb.contaminantdisable";
+constexpr char kOverheatStatsPath[] = "/sys/devices/platform/google,usbc_port_cooling_dev/";
+constexpr char kOverheatStatsDev[] = "DRIVER=google,usbc_port_cooling_dev";
+constexpr char kThermalZoneForTrip[] = "VIRTUAL-USB-THROTTLING";
+constexpr char kThermalZoneForTempReadPrimary[] = "usb_pwr_therm2";
+constexpr char kThermalZoneForTempReadSecondary1[] = "usb_pwr_therm";
+constexpr char kThermalZoneForTempReadSecondary2[] = "qi_therm";
+constexpr char kPogoUsbActive[] = "/sys/devices/platform/google,pogo/pogo_usb_active";
+constexpr char KPogoMoveDataToUsb[] = "/sys/devices/platform/google,pogo/move_data_to_usb";
+constexpr char kPowerSupplyUsbType[] = "/sys/class/power_supply/usb/usb_type";
+constexpr int kSamplingIntervalSec = 5;
+void queryVersionHelper(android::hardware::usb::Usb *usb,
+ std::vector<PortStatus> *currentPortStatus);
+
+ScopedAStatus Usb::enableUsbData(const string& in_portName, bool in_enable,
+ int64_t in_transactionId) {
+ bool result = true;
+ std::vector<PortStatus> currentPortStatus;
+ string pullup;
+
+ ALOGI("Userspace turn %s USB data signaling. opID:%ld", in_enable ? "on" : "off",
+ in_transactionId);
+
+ if (in_enable) {
+ if (!mUsbDataEnabled) {
+ if (ReadFileToString(PULLUP_PATH, &pullup)) {
+ pullup = Trim(pullup);
+ if (pullup != kGadgetName) {
+ if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) {
+ ALOGE("Gadget cannot be pulled up");
+ result = false;
+ }
+ }
+ }
+
+ if (!WriteStringToFile("1", USB_DATA_PATH)) {
+ ALOGE("Not able to turn on usb connection notification");
+ result = false;
+ }
+ }
+ } else {
+ if (ReadFileToString(PULLUP_PATH, &pullup)) {
+ pullup = Trim(pullup);
+ if (pullup == kGadgetName) {
+ if (!WriteStringToFile("none", PULLUP_PATH)) {
+ ALOGE("Gadget cannot be pulled down");
+ result = false;
+ }
+ }
+ }
+
+ if (!WriteStringToFile("1", ID_PATH)) {
+ ALOGE("Not able to turn off host mode");
+ result = false;
+ }
+
+ if (!WriteStringToFile("0", VBUS_PATH)) {
+ ALOGE("Not able to set Vbus state");
+ result = false;
+ }
+
+ if (!WriteStringToFile("0", USB_DATA_PATH)) {
+ ALOGE("Not able to turn on usb connection notification");
+ result = false;
+ }
+ }
+
+ if (result) {
+ mUsbDataEnabled = in_enable;
+ }
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyEnableUsbDataStatus(
+ in_portName, in_enable, result ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyEnableUsbDataStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+ queryVersionHelper(this, &currentPortStatus);
+
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::enableUsbDataWhileDocked(const string& in_portName,
+ int64_t in_transactionId) {
+ bool success = true;
+ bool notSupported = true;
+ std::vector<PortStatus> currentPortStatus;
+
+ ALOGI("Userspace enableUsbDataWhileDocked opID:%ld", in_transactionId);
+
+ int flags = O_RDONLY;
+ ::android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(KPogoMoveDataToUsb, flags)));
+ if (fd != -1) {
+ notSupported = false;
+ success = WriteStringToFile("1", KPogoMoveDataToUsb);
+ if (!success) {
+ ALOGE("Write to move_data_to_usb failed");
+ }
+ }
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyEnableUsbDataWhileDockedStatus(
+ in_portName, notSupported ? Status::NOT_SUPPORTED :
+ success ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyEnableUsbDataStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+ queryVersionHelper(this, &currentPortStatus);
+
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::resetUsbPort(const std::string& in_portName, int64_t in_transactionId) {
+ bool result = true;
+ std::vector<PortStatus> currentPortStatus;
+
+ ALOGI("Userspace reset USB Port. opID:%ld", in_transactionId);
+
+ if (!WriteStringToFile("none", PULLUP_PATH)) {
+ ALOGI("Gadget cannot be pulled down");
+ result = false;
+ }
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ::ndk::ScopedAStatus ret = mCallback->notifyResetUsbPortStatus(
+ in_portName, result ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyTransactionStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+
+ return ::ndk::ScopedAStatus::ok();
+}
+
+Status getI2cBusHelper(string *name) {
+ DIR *dp;
+
+ dp = opendir(kHsi2cPath);
+ if (dp != NULL) {
+ struct dirent *ep;
+
+ while ((ep = readdir(dp))) {
+ if (ep->d_type == DT_DIR) {
+ if (string::npos != string(ep->d_name).find("i2c-")) {
+ std::strtok(ep->d_name, "-");
+ *name = std::strtok(NULL, "-");
+ }
+ }
+ }
+ closedir(dp);
+ return Status::SUCCESS;
+ }
+
+ ALOGE("Failed to open %s", kHsi2cPath);
+ return Status::ERROR;
+}
+
+Status queryMoistureDetectionStatus(std::vector<PortStatus> *currentPortStatus) {
+ string enabled, status, path, DetectedPath;
+
+ (*currentPortStatus)[0].supportedContaminantProtectionModes
+ .push_back(ContaminantProtectionMode::FORCE_DISABLE);
+ (*currentPortStatus)[0].contaminantProtectionStatus = ContaminantProtectionStatus::NONE;
+ (*currentPortStatus)[0].contaminantDetectionStatus = ContaminantDetectionStatus::DISABLED;
+ (*currentPortStatus)[0].supportsEnableContaminantPresenceDetection = true;
+ (*currentPortStatus)[0].supportsEnableContaminantPresenceProtection = false;
+
+ getI2cBusHelper(&path);
+ enabledPath = kI2CPath + path + "/" + kContaminantDetectionPath;
+ if (!ReadFileToString(enabledPath, &enabled)) {
+ ALOGE("Failed to open moisture_detection_enabled");
+ return Status::ERROR;
+ }
+
+ enabled = Trim(enabled);
+ if (enabled == "1") {
+ DetectedPath = kI2CPath + path + "/" + kStatusPath;
+ if (!ReadFileToString(DetectedPath, &status)) {
+ ALOGE("Failed to open moisture_detected");
+ return Status::ERROR;
+ }
+ status = Trim(status);
+ if (status == "1") {
+ (*currentPortStatus)[0].contaminantDetectionStatus =
+ ContaminantDetectionStatus::DETECTED;
+ (*currentPortStatus)[0].contaminantProtectionStatus =
+ ContaminantProtectionStatus::FORCE_DISABLE;
+ } else {
+ (*currentPortStatus)[0].contaminantDetectionStatus =
+ ContaminantDetectionStatus::NOT_DETECTED;
+ }
+ }
+
+ ALOGI("ContaminantDetectionStatus:%d ContaminantProtectionStatus:%d",
+ (*currentPortStatus)[0].contaminantDetectionStatus,
+ (*currentPortStatus)[0].contaminantProtectionStatus);
+
+ return Status::SUCCESS;
+}
+
+string appendRoleNodeHelper(const string &portName, PortRole::Tag tag) {
+ string node("/sys/class/typec/" + portName);
+
+ switch (tag) {
+ case PortRole::dataRole:
+ return node + "/data_role";
+ case PortRole::powerRole:
+ return node + "/power_role";
+ case PortRole::mode:
+ return node + "/port_type";
+ default:
+ return "";
+ }
+}
+
+string convertRoletoString(PortRole role) {
+ if (role.getTag() == PortRole::powerRole) {
+ if (role.get<PortRole::powerRole>() == PortPowerRole::SOURCE)
+ return "source";
+ else if (role.get<PortRole::powerRole>() == PortPowerRole::SINK)
+ return "sink";
+ } else if (role.getTag() == PortRole::dataRole) {
+ if (role.get<PortRole::dataRole>() == PortDataRole::HOST)
+ return "host";
+ if (role.get<PortRole::dataRole>() == PortDataRole::DEVICE)
+ return "device";
+ } else if (role.getTag() == PortRole::mode) {
+ if (role.get<PortRole::mode>() == PortMode::UFP)
+ return "sink";
+ if (role.get<PortRole::mode>() == PortMode::DFP)
+ return "source";
+ }
+ return "none";
+}
+
+void extractRole(string *roleName) {
+ std::size_t first, last;
+
+ first = roleName->find("[");
+ last = roleName->find("]");
+
+ if (first != string::npos && last != string::npos) {
+ *roleName = roleName->substr(first + 1, last - first - 1);
+ }
+}
+
+void switchToDrp(const string &portName) {
+ string filename = appendRoleNodeHelper(string(portName.c_str()), PortRole::mode);
+ FILE *fp;
+
+ if (filename != "") {
+ fp = fopen(filename.c_str(), "w");
+ if (fp != NULL) {
+ int ret = fputs("dual", fp);
+ fclose(fp);
+ if (ret == EOF)
+ ALOGE("Fatal: Error while switching back to drp");
+ } else {
+ ALOGE("Fatal: Cannot open file to switch back to drp");
+ }
+ } else {
+ ALOGE("Fatal: invalid node type");
+ }
+}
+
+bool switchMode(const string &portName, const PortRole &in_role, struct Usb *usb) {
+ string filename = appendRoleNodeHelper(string(portName.c_str()), in_role.getTag());
+ string written;
+ FILE *fp;
+ bool roleSwitch = false;
+
+ if (filename == "") {
+ ALOGE("Fatal: invalid node type");
+ return false;
+ }
+
+ fp = fopen(filename.c_str(), "w");
+ if (fp != NULL) {
+ // Hold the lock here to prevent loosing connected signals
+ // as once the file is written the partner added signal
+ // can arrive anytime.
+ pthread_mutex_lock(&usb->mPartnerLock);
+ usb->mPartnerUp = false;
+ int ret = fputs(convertRoletoString(in_role).c_str(), fp);
+ fclose(fp);
+
+ if (ret != EOF) {
+ struct timespec to;
+ struct timespec now;
+
+ wait_again:
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ to.tv_sec = now.tv_sec + PORT_TYPE_TIMEOUT;
+ to.tv_nsec = now.tv_nsec;
+
+ int err = pthread_cond_timedwait(&usb->mPartnerCV, &usb->mPartnerLock, &to);
+ // There are no uevent signals which implies role swap timed out.
+ if (err == ETIMEDOUT) {
+ ALOGI("uevents wait timedout");
+ // Validity check.
+ } else if (!usb->mPartnerUp) {
+ goto wait_again;
+ // Role switch succeeded since usb->mPartnerUp is true.
+ } else {
+ roleSwitch = true;
+ }
+ } else {
+ ALOGI("Role switch failed while wrting to file");
+ }
+ pthread_mutex_unlock(&usb->mPartnerLock);
+ }
+
+ if (!roleSwitch)
+ switchToDrp(string(portName.c_str()));
+
+ return roleSwitch;
+}
+
+Usb::Usb()
+ : mLock(PTHREAD_MUTEX_INITIALIZER),
+ mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER),
+ mPartnerLock(PTHREAD_MUTEX_INITIALIZER),
+ mPartnerUp(false),
+ mOverheat(ZoneInfo(TemperatureType::USB_PORT, kThermalZoneForTrip,
+ ThrottlingSeverity::CRITICAL),
+ {ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadPrimary,
+ ThrottlingSeverity::NONE),
+ ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary1,
+ ThrottlingSeverity::NONE),
+ ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary2,
+ ThrottlingSeverity::NONE)}, kSamplingIntervalSec),
+ mUsbDataEnabled(true) {
+ pthread_condattr_t attr;
+ if (pthread_condattr_init(&attr)) {
+ ALOGE("pthread_condattr_init failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) {
+ ALOGE("pthread_condattr_setclock failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_cond_init(&mPartnerCV, &attr)) {
+ ALOGE("pthread_cond_init failed: %s", strerror(errno));
+ abort();
+ }
+ if (pthread_condattr_destroy(&attr)) {
+ ALOGE("pthread_condattr_destroy failed: %s", strerror(errno));
+ abort();
+ }
+}
+
+ScopedAStatus Usb::switchRole(const string& in_portName, const PortRole& in_role,
+ int64_t in_transactionId) {
+ string filename = appendRoleNodeHelper(string(in_portName.c_str()), in_role.getTag());
+ string written;
+ FILE *fp;
+ bool roleSwitch = false;
+
+ if (filename == "") {
+ ALOGE("Fatal: invalid node type");
+ return ScopedAStatus::ok();
+ }
+
+ pthread_mutex_lock(&mRoleSwitchLock);
+
+ ALOGI("filename write: %s role:%s", filename.c_str(), convertRoletoString(in_role).c_str());
+
+ if (in_role.getTag() == PortRole::mode) {
+ roleSwitch = switchMode(in_portName, in_role, this);
+ } else {
+ fp = fopen(filename.c_str(), "w");
+ if (fp != NULL) {
+ int ret = fputs(convertRoletoString(in_role).c_str(), fp);
+ fclose(fp);
+ if ((ret != EOF) && ReadFileToString(filename, &written)) {
+ written = Trim(written);
+ extractRole(&written);
+ ALOGI("written: %s", written.c_str());
+ if (written == convertRoletoString(in_role)) {
+ roleSwitch = true;
+ } else {
+ ALOGE("Role switch failed");
+ }
+ } else {
+ ALOGE("failed to update the new role");
+ }
+ } else {
+ ALOGE("fopen failed");
+ }
+ }
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyRoleSwitchStatus(
+ in_portName, in_role, roleSwitch ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("RoleSwitchStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+ pthread_mutex_unlock(&mRoleSwitchLock);
+
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::limitPowerTransfer(const string& in_portName, bool in_limit,
+ int64_t in_transactionId) {
+ bool sessionFail = false, success;
+ std::vector<PortStatus> currentPortStatus;
+ string path, sinkLimitEnablePath, currentLimitPath, sourceLimitEnablePath;
+
+ getI2cBusHelper(&path);
+ sinkLimitEnablePath = kI2CPath + path + "/" + kSinkLimitEnable;
+ sourceLimitEnablePath = kI2CPath + path + "/" + kSourceLimitEnable;
+ currentLimitPath = kI2CPath + path + "/" + kSinkLimitCurrent;
+
+ pthread_mutex_lock(&mLock);
+ if (in_limit) {
+ success = WriteStringToFile("0", currentLimitPath);
+ if (!success) {
+ ALOGE("Failed to set sink current limit");
+ sessionFail = true;
+ }
+ }
+ success = WriteStringToFile(in_limit ? "1" : "0", sinkLimitEnablePath);
+ if (!success) {
+ ALOGE("Failed to %s sink current limit: %s", in_limit ? "enable" : "disable",
+ sinkLimitEnablePath.c_str());
+ sessionFail = true;
+ }
+ success = WriteStringToFile(in_limit ? "1" : "0", sourceLimitEnablePath);
+ if (!success) {
+ ALOGE("Failed to %s source current limit: %s", in_limit ? "enable" : "disable",
+ sourceLimitEnablePath.c_str());
+ sessionFail = true;
+ }
+ ALOGI("limitPowerTransfer limit:%c opId:%ld", in_limit ? 'y' : 'n', in_transactionId);
+ if (mCallback != NULL && in_transactionId >= 0) {
+ ScopedAStatus ret = mCallback->notifyLimitPowerTransferStatus(
+ in_portName, in_limit, sessionFail ? Status::ERROR : Status::SUCCESS,
+ in_transactionId);
+ if (!ret.isOk())
+ ALOGE("limitPowerTransfer error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+
+ pthread_mutex_unlock(&mLock);
+ queryVersionHelper(this, &currentPortStatus);
+
+ return ScopedAStatus::ok();
+}
+
+Status queryPowerTransferStatus(std::vector<PortStatus> *currentPortStatus) {
+ string limitedPath, enabled, path;
+
+ getI2cBusHelper(&path);
+ limitedPath = kI2CPath + path + "/" + kSinkLimitEnable;
+ if (!ReadFileToString(limitedPath, &enabled)) {
+ ALOGE("Failed to open limit_sink_enable");
+ return Status::ERROR;
+ }
+
+ enabled = Trim(enabled);
+ (*currentPortStatus)[0].powerTransferLimited = enabled == "1";
+
+ ALOGI("powerTransferLimited:%d", (*currentPortStatus)[0].powerTransferLimited ? 1 : 0);
+ return Status::SUCCESS;
+}
+
+Status getAccessoryConnected(const string &portName, string *accessory) {
+ string filename = "/sys/class/typec/" + portName + "-partner/accessory_mode";
+
+ if (!ReadFileToString(filename, accessory)) {
+ ALOGE("getAccessoryConnected: Failed to open filesystem node: %s", filename.c_str());
+ return Status::ERROR;
+ }
+ *accessory = Trim(*accessory);
+
+ return Status::SUCCESS;
+}
+
+Status getCurrentRoleHelper(const string &portName, bool connected, PortRole *currentRole) {
+ string filename;
+ string roleName;
+ string accessory;
+
+ // Mode
+
+ if (currentRole->getTag() == PortRole::powerRole) {
+ filename = "/sys/class/typec/" + portName + "/power_role";
+ currentRole->set<PortRole::powerRole>(PortPowerRole::NONE);
+ } else if (currentRole->getTag() == PortRole::dataRole) {
+ filename = "/sys/class/typec/" + portName + "/data_role";
+ currentRole->set<PortRole::dataRole>(PortDataRole::NONE);
+ } else if (currentRole->getTag() == PortRole::mode) {
+ filename = "/sys/class/typec/" + portName + "/data_role";
+ currentRole->set<PortRole::mode>(PortMode::NONE);
+ } else {
+ return Status::ERROR;
+ }
+
+ if (!connected)
+ return Status::SUCCESS;
+
+ if (currentRole->getTag() == PortRole::mode) {
+ if (getAccessoryConnected(portName, &accessory) != Status::SUCCESS) {
+ return Status::ERROR;
+ }
+ if (accessory == "analog_audio") {
+ currentRole->set<PortRole::mode>(PortMode::AUDIO_ACCESSORY);
+ return Status::SUCCESS;
+ } else if (accessory == "debug") {
+ currentRole->set<PortRole::mode>(PortMode::DEBUG_ACCESSORY);
+ return Status::SUCCESS;
+ }
+ }
+
+ if (!ReadFileToString(filename, &roleName)) {
+ ALOGE("getCurrentRole: Failed to open filesystem node: %s", filename.c_str());
+ return Status::ERROR;
+ }
+
+ roleName = Trim(roleName);
+ extractRole(&roleName);
+
+ if (roleName == "source") {
+ currentRole->set<PortRole::powerRole>(PortPowerRole::SOURCE);
+ } else if (roleName == "sink") {
+ currentRole->set<PortRole::powerRole>(PortPowerRole::SINK);
+ } else if (roleName == "host") {
+ if (currentRole->getTag() == PortRole::dataRole)
+ currentRole->set<PortRole::dataRole>(PortDataRole::HOST);
+ else
+ currentRole->set<PortRole::mode>(PortMode::DFP);
+ } else if (roleName == "device") {
+ if (currentRole->getTag() == PortRole::dataRole)
+ currentRole->set<PortRole::dataRole>(PortDataRole::DEVICE);
+ else
+ currentRole->set<PortRole::mode>(PortMode::UFP);
+ } else if (roleName != "none") {
+ /* case for none has already been addressed.
+ * so we check if the role isn't none.
+ */
+ return Status::UNRECOGNIZED_ROLE;
+ }
+ return Status::SUCCESS;
+}
+
+Status getTypeCPortNamesHelper(std::unordered_map<string, bool> *names) {
+ DIR *dp;
+
+ dp = opendir(kTypecPath);
+ if (dp != NULL) {
+ struct dirent *ep;
+
+ while ((ep = readdir(dp))) {
+ if (ep->d_type == DT_LNK) {
+ if (string::npos == string(ep->d_name).find("-partner")) {
+ std::unordered_map<string, bool>::const_iterator portName =
+ names->find(ep->d_name);
+ if (portName == names->end()) {
+ names->insert({ep->d_name, false});
+ }
+ } else {
+ (*names)[std::strtok(ep->d_name, "-")] = true;
+ }
+ }
+ }
+ closedir(dp);
+ return Status::SUCCESS;
+ }
+
+ ALOGE("Failed to open /sys/class/typec");
+ return Status::ERROR;
+}
+
+bool canSwitchRoleHelper(const string &portName) {
+ string filename = "/sys/class/typec/" + portName + "-partner/supports_usb_power_delivery";
+ string supportsPD;
+
+ if (ReadFileToString(filename, &supportsPD)) {
+ supportsPD = Trim(supportsPD);
+ if (supportsPD == "yes") {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+Status getPortStatusHelper(android::hardware::usb::Usb *usb,
+ std::vector<PortStatus> *currentPortStatus) {
+ std::unordered_map<string, bool> names;
+ Status result = getTypeCPortNamesHelper(&names);
+ int i = -1;
+
+ if (result == Status::SUCCESS) {
+ currentPortStatus->resize(names.size());
+ for (std::pair<string, bool> port : names) {
+ i++;
+ ALOGI("%s", port.first.c_str());
+ (*currentPortStatus)[i].portName = port.first;
+
+ PortRole currentRole;
+ currentRole.set<PortRole::powerRole>(PortPowerRole::NONE);
+ if (getCurrentRoleHelper(port.first, port.second, &currentRole) == Status::SUCCESS){
+ (*currentPortStatus)[i].currentPowerRole = currentRole.get<PortRole::powerRole>();
+ } else {
+ ALOGE("Error while retrieving portNames");
+ goto done;
+ }
+
+ currentRole.set<PortRole::dataRole>(PortDataRole::NONE);
+ if (getCurrentRoleHelper(port.first, port.second, &currentRole) == Status::SUCCESS) {
+ (*currentPortStatus)[i].currentDataRole = currentRole.get<PortRole::dataRole>();
+ } else {
+ ALOGE("Error while retrieving current port role");
+ goto done;
+ }
+
+ currentRole.set<PortRole::mode>(PortMode::NONE);
+ if (getCurrentRoleHelper(port.first, port.second, &currentRole) == Status::SUCCESS) {
+ (*currentPortStatus)[i].currentMode = currentRole.get<PortRole::mode>();
+ } else {
+ ALOGE("Error while retrieving current data role");
+ goto done;
+ }
+
+ (*currentPortStatus)[i].canChangeMode = true;
+ (*currentPortStatus)[i].canChangeDataRole =
+ port.second ? canSwitchRoleHelper(port.first) : false;
+ (*currentPortStatus)[i].canChangePowerRole =
+ port.second ? canSwitchRoleHelper(port.first) : false;
+
+ (*currentPortStatus)[i].supportedModes.push_back(PortMode::DRP);
+
+ bool dataEnabled = true;
+ string pogoUsbActive = "0";
+ if (ReadFileToString(string(kPogoUsbActive), &pogoUsbActive) &&
+ stoi(Trim(pogoUsbActive)) == 1) {
+ (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::DISABLED_DOCK);
+ dataEnabled = false;
+ }
+ if (!usb->mUsbDataEnabled) {
+ (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::DISABLED_FORCE);
+ dataEnabled = false;
+ }
+ if (dataEnabled) {
+ (*currentPortStatus)[i].usbDataStatus.push_back(UsbDataStatus::ENABLED);
+ }
+
+ // When connected return powerBrickStatus
+ if (port.second) {
+ string usbType;
+ if ((*currentPortStatus)[i].currentPowerRole == PortPowerRole::SOURCE) {
+ (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::NOT_CONNECTED;
+ } else if (ReadFileToString(string(kPowerSupplyUsbType), &usbType)) {
+ if (strstr(usbType.c_str(), "[D")) {
+ (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::CONNECTED;
+ } else if (strstr(usbType.c_str(), "[U")) {
+ (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::UNKNOWN;
+ } else {
+ (*currentPortStatus)[i].powerBrickStatus =
+ PowerBrickStatus::NOT_CONNECTED;
+ }
+ } else {
+ ALOGE("Error while reading usb_type");
+ }
+ } else {
+ (*currentPortStatus)[i].powerBrickStatus = PowerBrickStatus::NOT_CONNECTED;
+ }
+
+ ALOGI("%d:%s connected:%d canChangeMode:%d canChagedata:%d canChangePower:%d "
+ "usbDataEnabled:%d",
+ i, port.first.c_str(), port.second,
+ (*currentPortStatus)[i].canChangeMode,
+ (*currentPortStatus)[i].canChangeDataRole,
+ (*currentPortStatus)[i].canChangePowerRole,
+ dataEnabled ? 1 : 0);
+ }
+
+ return Status::SUCCESS;
+ }
+done:
+ return Status::ERROR;
+}
+
+void queryVersionHelper(android::hardware::usb::Usb *usb,
+ std::vector<PortStatus> *currentPortStatus) {
+ Status status;
+ pthread_mutex_lock(&usb->mLock);
+ status = getPortStatusHelper(usb, currentPortStatus);
+ queryMoistureDetectionStatus(currentPortStatus);
+ queryPowerTransferStatus(currentPortStatus);
+ if (usb->mCallback != NULL) {
+ ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus,
+ status);
+ if (!ret.isOk())
+ ALOGE("queryPortStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGI("Notifying userspace skipped. Callback is NULL");
+ }
+ pthread_mutex_unlock(&usb->mLock);
+}
+
+ScopedAStatus Usb::queryPortStatus(int64_t in_transactionId) {
+ std::vector<PortStatus> currentPortStatus;
+
+ queryVersionHelper(this, &currentPortStatus);
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyQueryPortStatus(
+ "all", Status::SUCCESS, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyQueryPortStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+
+ return ScopedAStatus::ok();
+}
+
+ScopedAStatus Usb::enableContaminantPresenceDetection(const string& in_portName,
+ bool in_enable, int64_t in_transactionId) {
+ string disable = GetProperty(kDisableContatminantDetection, "");
+ std::vector<PortStatus> currentPortStatus;
+ bool success = true;
+
+ if (disable != "true")
+ success = WriteStringToFile(in_enable ? "1" : "0", enabledPath);
+
+ pthread_mutex_lock(&mLock);
+ if (mCallback != NULL) {
+ ScopedAStatus ret = mCallback->notifyContaminantEnabledStatus(
+ in_portName, in_enable, success ? Status::SUCCESS : Status::ERROR, in_transactionId);
+ if (!ret.isOk())
+ ALOGE("notifyContaminantEnabledStatus error %s", ret.getDescription().c_str());
+ } else {
+ ALOGE("Not notifying the userspace. Callback is not set");
+ }
+ pthread_mutex_unlock(&mLock);
+
+ queryVersionHelper(this, &currentPortStatus);
+ return ScopedAStatus::ok();
+}
+
+void report_overheat_event(android::hardware::usb::Usb *usb) {
+ VendorUsbPortOverheat overheat_info;
+ string contents;
+
+ overheat_info.set_plug_temperature_deci_c(usb->mPluggedTemperatureCelsius * 10);
+ overheat_info.set_max_temperature_deci_c(usb->mOverheat.getMaxOverheatTemperature() * 10);
+ if (ReadFileToString(string(kOverheatStatsPath) + "trip_time", &contents)) {
+ overheat_info.set_time_to_overheat_secs(stoi(Trim(contents)));
+ } else {
+ ALOGE("Unable to read trip_time");
+ return;
+ }
+ if (ReadFileToString(string(kOverheatStatsPath) + "hysteresis_time", &contents)) {
+ overheat_info.set_time_to_hysteresis_secs(stoi(Trim(contents)));
+ } else {
+ ALOGE("Unable to read hysteresis_time");
+ return;
+ }
+ if (ReadFileToString(string(kOverheatStatsPath) + "cleared_time", &contents)) {
+ overheat_info.set_time_to_inactive_secs(stoi(Trim(contents)));
+ } else {
+ ALOGE("Unable to read cleared_time");
+ return;
+ }
+
+ const shared_ptr<IStats> stats_client = getStatsService();
+ if (!stats_client) {
+ ALOGE("Unable to get AIDL Stats service");
+ } else {
+ reportUsbPortOverheat(stats_client, overheat_info);
+ }
+}
+
+struct data {
+ int uevent_fd;
+ ::aidl::android::hardware::usb::Usb *usb;
+};
+
+static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
+ char msg[UEVENT_MSG_LEN + 2];
+ char *cp;
+ int n;
+
+ n = uevent_kernel_multicast_recv(payload->uevent_fd, msg, UEVENT_MSG_LEN);
+ if (n <= 0)
+ return;
+ if (n >= UEVENT_MSG_LEN) /* overflow -- discard */
+ return;
+
+ msg[n] = '\0';
+ msg[n + 1] = '\0';
+ cp = msg;
+
+ while (*cp) {
+ if (std::regex_match(cp, std::regex("(add)(.*)(-partner)"))) {
+ ALOGI("partner added");
+ pthread_mutex_lock(&payload->usb->mPartnerLock);
+ payload->usb->mPartnerUp = true;
+ pthread_cond_signal(&payload->usb->mPartnerCV);
+ pthread_mutex_unlock(&payload->usb->mPartnerLock);
+ } else if (!strncmp(cp, "DEVTYPE=typec_", strlen("DEVTYPE=typec_")) ||
+ !strncmp(cp, "DRIVER=max77759tcpc",
+ strlen("DRIVER=max77759tcpc")) ||
+ !strncmp(cp, "DRIVER=pogo-transport",
+ strlen("DRIVER=pogo-transport")) ||
+ !strncmp(cp, "POWER_SUPPLY_NAME=usb",
+ strlen("POWER_SUPPLY_NAME=usb"))) {
+ std::vector<PortStatus> currentPortStatus;
+ queryVersionHelper(payload->usb, &currentPortStatus);
+
+ // Role switch is not in progress and port is in disconnected state
+ if (!pthread_mutex_trylock(&payload->usb->mRoleSwitchLock)) {
+ for (unsigned long i = 0; i < currentPortStatus.size(); i++) {
+ DIR *dp =
+ opendir(string("/sys/class/typec/" +
+ string(currentPortStatus[i].portName.c_str()) +
+ "-partner").c_str());
+ if (dp == NULL) {
+ switchToDrp(currentPortStatus[i].portName);
+ } else {
+ closedir(dp);
+ }
+ }
+ pthread_mutex_unlock(&payload->usb->mRoleSwitchLock);
+ }
+ break;
+ } else if (!strncmp(cp, kOverheatStatsDev, strlen(kOverheatStatsDev))) {
+ ALOGV("Overheat Cooling device suez update");
+ report_overheat_event(payload->usb);
+ }
+ /* advance to after the next \0 */
+ while (*cp++) {
+ }
+ }
+}
+
+void *work(void *param) {
+ int epoll_fd, uevent_fd;
+ struct epoll_event ev;
+ int nevents = 0;
+ struct data payload;
+
+ ALOGE("creating thread");
+
+ uevent_fd = uevent_open_socket(64 * 1024, true);
+
+ if (uevent_fd < 0) {
+ ALOGE("uevent_init: uevent_open_socket failed\n");
+ return NULL;
+ }
+
+ payload.uevent_fd = uevent_fd;
+ payload.usb = (::aidl::android::hardware::usb::Usb *)param;
+
+ fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
+
+ ev.events = EPOLLIN;
+ ev.data.ptr = (void *)uevent_event;
+
+ epoll_fd = epoll_create(64);
+ if (epoll_fd == -1) {
+ ALOGE("epoll_create failed; errno=%d", errno);
+ goto error;
+ }
+
+ if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, uevent_fd, &ev) == -1) {
+ ALOGE("epoll_ctl failed; errno=%d", errno);
+ goto error;
+ }
+
+ while (!destroyThread) {
+ struct epoll_event events[64];
+
+ nevents = epoll_wait(epoll_fd, events, 64, -1);
+ if (nevents == -1) {
+ if (errno == EINTR)
+ continue;
+ ALOGE("usb epoll_wait failed; errno=%d", errno);
+ break;
+ }
+
+ for (int n = 0; n < nevents; ++n) {
+ if (events[n].data.ptr)
+ (*(void (*)(int, struct data *payload))events[n].data.ptr)(events[n].events,
+ &payload);
+ }
+ }
+
+ ALOGI("exiting worker thread");
+error:
+ close(uevent_fd);
+
+ if (epoll_fd >= 0)
+ close(epoll_fd);
+
+ return NULL;
+}
+
+void sighandler(int sig) {
+ if (sig == SIGUSR1) {
+ destroyThread = true;
+ ALOGI("destroy set");
+ return;
+ }
+ signal(SIGUSR1, sighandler);
+}
+
+ScopedAStatus Usb::setCallback(const shared_ptr<IUsbCallback>& in_callback) {
+ pthread_mutex_lock(&mLock);
+ if ((mCallback == NULL && in_callback == NULL) ||
+ (mCallback != NULL && in_callback != NULL)) {
+ mCallback = in_callback;
+ pthread_mutex_unlock(&mLock);
+ return ScopedAStatus::ok();
+ }
+
+ mCallback = in_callback;
+ ALOGI("registering callback");
+
+ if (mCallback == NULL) {
+ if (!pthread_kill(mPoll, SIGUSR1)) {
+ pthread_join(mPoll, NULL);
+ ALOGI("pthread destroyed");
+ }
+ pthread_mutex_unlock(&mLock);
+ return ScopedAStatus::ok();
+ }
+
+ destroyThread = false;
+ signal(SIGUSR1, sighandler);
+
+ /*
+ * Create a background thread if the old callback value is NULL
+ * and being updated with a new value.
+ */
+ if (pthread_create(&mPoll, NULL, work, this)) {
+ ALOGE("pthread creation failed %d", errno);
+ mCallback = NULL;
+ }
+
+ pthread_mutex_unlock(&mLock);
+ return ScopedAStatus::ok();
+}
+
+} // namespace usb
+} // namespace hardware
+} // namespace android
+} // aidl
diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h
new file mode 100644
index 00000000..1a93e191
--- /dev/null
+++ b/usb/usb/Usb.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <android-base/file.h>
+#include <aidl/android/hardware/usb/BnUsb.h>
+#include <aidl/android/hardware/usb/BnUsbCallback.h>
+#include <pixelusb/UsbOverheatEvent.h>
+#include <utils/Log.h>
+
+#define UEVENT_MSG_LEN 2048
+// The type-c stack waits for 4.5 - 5.5 secs before declaring a port non-pd.
+// The -partner directory would not be created until this is done.
+// Having a margin of ~3 secs for the directory and other related bookeeping
+// structures created and uvent fired.
+#define PORT_TYPE_TIMEOUT 8
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace usb {
+
+using ::aidl::android::hardware::usb::IUsbCallback;
+using ::aidl::android::hardware::usb::PortRole;
+using ::android::base::ReadFileToString;
+using ::android::base::WriteStringToFile;
+using ::android::hardware::google::pixel::usb::UsbOverheatEvent;
+using ::android::hardware::google::pixel::usb::ZoneInfo;
+using ::android::hardware::thermal::V2_0::TemperatureType;
+using ::android::hardware::thermal::V2_0::ThrottlingSeverity;
+using ::android::sp;
+using ::ndk::ScopedAStatus;
+using ::std::shared_ptr;
+using ::std::string;
+
+constexpr char kGadgetName[] = "11110000.dwc3";
+#define NEW_UDC_PATH "/sys/devices/platform/11110000.usb/"
+
+#define ID_PATH NEW_UDC_PATH "dwc3_exynos_otg_id"
+#define VBUS_PATH NEW_UDC_PATH "dwc3_exynos_otg_b_sess"
+#define USB_DATA_PATH NEW_UDC_PATH "usb_data_enabled"
+
+struct Usb : public BnUsb {
+ Usb();
+
+ ScopedAStatus enableContaminantPresenceDetection(const std::string& in_portName,
+ bool in_enable, int64_t in_transactionId) override;
+ ScopedAStatus queryPortStatus(int64_t in_transactionId) override;
+ ScopedAStatus setCallback(const shared_ptr<IUsbCallback>& in_callback) override;
+ ScopedAStatus switchRole(const string& in_portName, const PortRole& in_role,
+ int64_t in_transactionId) override;
+ ScopedAStatus enableUsbData(const string& in_portName, bool in_enable,
+ int64_t in_transactionId) override;
+ ScopedAStatus enableUsbDataWhileDocked(const string& in_portName,
+ int64_t in_transactionId) override;
+ ScopedAStatus limitPowerTransfer(const string& in_portName, bool in_limit,
+ int64_t in_transactionId) override;
+ ScopedAStatus resetUsbPort(const string& in_portName, int64_t in_transactionId) override;
+
+ std::shared_ptr<::aidl::android::hardware::usb::IUsbCallback> mCallback;
+ // Protects mCallback variable
+ pthread_mutex_t mLock;
+ // Protects roleSwitch operation
+ pthread_mutex_t mRoleSwitchLock;
+ // Threads waiting for the partner to come back wait here
+ pthread_cond_t mPartnerCV;
+ // lock protecting mPartnerCV
+ pthread_mutex_t mPartnerLock;
+ // Variable to signal partner coming back online after type switch
+ bool mPartnerUp;
+
+ // Usb Overheat object for push suez event
+ UsbOverheatEvent mOverheat;
+ // Temperature when connected
+ float mPluggedTemperatureCelsius;
+ // Usb Data status
+ bool mUsbDataEnabled;
+ private:
+ pthread_t mPoll;
+};
+
+} // namespace usb
+} // namespace hardware
+} // namespace android
+} // aidl
diff --git a/usb/usb/android.hardware.usb-service.rc b/usb/usb/android.hardware.usb-service.rc
new file mode 100644
index 00000000..e052f433
--- /dev/null
+++ b/usb/usb/android.hardware.usb-service.rc
@@ -0,0 +1,69 @@
+service vendor.usb /vendor/bin/hw/android.hardware.usb-service.gs101
+ class hal
+ user system
+ group system shell wakelock
+ capabilities WAKE_ALARM BLOCK_SUSPEND
+
+on post-fs
+ chown root system /sys/class/typec/port0/power_role
+ chown root system /sys/class/typec/port0/data_role
+ chown root system /sys/class/typec/port0/port_type
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/contaminant_detection
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_accessory_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_accessory_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_accessory_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_accessory_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_accessory_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_accessory_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_accessory_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_accessory_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_current
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_source_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_source_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_source_enable
+ chown root system /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_source_enable
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+ chown root system /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+ chown root system /sys/devices/platform/11110000.usb/usb_data_enabled
+ chown root system /sys/devices/platform/google,pogo/move_data_to_usb
+ chmod 664 /sys/class/typec/port0/power_role
+ chmod 664 /sys/class/typec/port0/data_role
+ chmod 664 /sys/class/typec/port0/port_type
+ chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess
+ chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id
+ chmod 664 /sys/devices/platform/11110000.usb/usb_data_enabled
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/contaminant_detection
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/contaminant_detection
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/contaminant_detection
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/contaminant_detection
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_accessory_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_accessory_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_accessory_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_accessory_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_accessory_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_accessory_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_accessory_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_accessory_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-5/i2c-max77759tcpc/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-6/i2c-max77759tcpc/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-7/i2c-max77759tcpc/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/10d50000.hsi2c/i2c-8/i2c-max77759tcpc/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/google,pogo/move_data_to_usb
diff --git a/usb/usb/android.hardware.usb-service.xml b/usb/usb/android.hardware.usb-service.xml
new file mode 100644
index 00000000..60881948
--- /dev/null
+++ b/usb/usb/android.hardware.usb-service.xml
@@ -0,0 +1,10 @@
+<manifest version="1.0" type="device">
+ <hal format="aidl">
+ <name>android.hardware.usb</name>
+ <version>1</version>
+ <interface>
+ <name>IUsb</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+</manifest>
diff --git a/usb/usb/service.cpp b/usb/usb/service.cpp
new file mode 100644
index 00000000..2c0a5963
--- /dev/null
+++ b/usb/usb/service.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <utils/Log.h>
+
+#include "Usb.h"
+
+using ::aidl::android::hardware::usb::Usb;
+
+int main() {
+ ABinderProcess_setThreadPoolMaxThreadCount(0);
+ std::shared_ptr<Usb> usb = ndk::SharedRefBase::make<Usb>();
+
+ const std::string instance = std::string() + Usb::descriptor + "/default";
+ binder_status_t status = AServiceManager_addService(usb->asBinder().get(), instance.c_str());
+ CHECK(status == STATUS_OK);
+
+ ALOGV("AIDL USB HAL about to start");
+ ABinderProcess_joinThreadPool();
+ return -1; // Should never be reached
+}
diff --git a/uwb/calibration/UWB-calibration-am.conf b/uwb/calibration/UWB-calibration-am.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-am.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-ar.conf b/uwb/calibration/UWB-calibration-ar.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-ar.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-az.conf b/uwb/calibration/UWB-calibration-az.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-az.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-by.conf b/uwb/calibration/UWB-calibration-by.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-by.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-id.conf b/uwb/calibration/UWB-calibration-id.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-id.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-jp.conf b/uwb/calibration/UWB-calibration-jp.conf
new file mode 100644
index 00000000..ffdc4d69
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-jp.conf
@@ -0,0 +1,34 @@
+ant0.ch5.prf16.tx_power=0
+ant0.ch5.prf16.pg_delay=0
+ant0.ch5.prf64.tx_power=0
+ant0.ch5.prf64.pg_delay=0
+ant0.ch9.prf16.tx_power=0x2A2A2A2A
+ant0.ch9.prf16.pg_delay=0x20
+ant0.ch9.prf64.tx_power=0x2A2A2A2A
+ant0.ch9.prf64.pg_delay=0x20
+ant1.ch5.prf16.tx_power=0
+ant1.ch5.prf16.pg_delay=0
+ant1.ch5.prf64.tx_power=0
+ant1.ch5.prf64.pg_delay=0
+ant1.ch9.prf16.tx_power=0x2A2A2A2A
+ant1.ch9.prf16.pg_delay=0x20
+ant1.ch9.prf64.tx_power=0x2A2A2A2A
+ant1.ch9.prf64.pg_delay=0x20
+ant2.ch5.prf16.tx_power=0
+ant2.ch5.prf16.pg_delay=0
+ant2.ch5.prf64.tx_power=0
+ant2.ch5.prf64.pg_delay=0
+ant2.ch9.prf16.tx_power=0x2A2A2A2A
+ant2.ch9.prf16.pg_delay=0x20
+ant2.ch9.prf64.tx_power=0x2A2A2A2A
+ant2.ch9.prf64.pg_delay=0x20
+ant3.ch5.prf16.tx_power=0
+ant3.ch5.prf16.pg_delay=0
+ant3.ch5.prf64.tx_power=0
+ant3.ch5.prf64.pg_delay=0
+ant3.ch9.prf16.tx_power=0x2A2A2A2A
+ant3.ch9.prf16.pg_delay=0x20
+ant3.ch9.prf64.tx_power=0x2A2A2A2A
+ant3.ch9.prf64.pg_delay=0x20
+alternate_pulse_shape=0x01
+restricted_channels=0x20
diff --git a/uwb/calibration/UWB-calibration-kg.conf b/uwb/calibration/UWB-calibration-kg.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-kg.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-kz.conf b/uwb/calibration/UWB-calibration-kz.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-kz.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-np.conf b/uwb/calibration/UWB-calibration-np.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-np.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-pk.conf b/uwb/calibration/UWB-calibration-pk.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-pk.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-py.conf b/uwb/calibration/UWB-calibration-py.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-py.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-ru.conf b/uwb/calibration/UWB-calibration-ru.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-ru.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-sb.conf b/uwb/calibration/UWB-calibration-sb.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-sb.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-tj.conf b/uwb/calibration/UWB-calibration-tj.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-tj.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-tm.conf b/uwb/calibration/UWB-calibration-tm.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-tm.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-tw.conf b/uwb/calibration/UWB-calibration-tw.conf
new file mode 100644
index 00000000..68c32d6c
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-tw.conf
@@ -0,0 +1,2 @@
+alternate_pulse_shape=0x01
+restricted_channels=0x20
diff --git a/uwb/calibration/UWB-calibration-ua.conf b/uwb/calibration/UWB-calibration-ua.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-ua.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/UWB-calibration-uz.conf b/uwb/calibration/UWB-calibration-uz.conf
new file mode 100644
index 00000000..ef3e5904
--- /dev/null
+++ b/uwb/calibration/UWB-calibration-uz.conf
@@ -0,0 +1 @@
+restricted_channels=0xffff
diff --git a/uwb/calibration/country_conf_gen.sh b/uwb/calibration/country_conf_gen.sh
new file mode 100755
index 00000000..777be2d7
--- /dev/null
+++ b/uwb/calibration/country_conf_gen.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+# This script is used to generate uwb conuntry configuration file,
+# and the PRODUCT_COPY_FILES list in uwb.mk based on uwb_country.conf
+# Bug: 196073172
+
+project=("r4" "p7")
+count=1
+
+while read line ; do
+ if [[ "$line" =~ ^"*" ]]; then
+ header=${line:1}
+ elif [[ "$line" =~ ^"\"" ]]; then
+ line=$(echo ${line/,} | tr -d "\"")
+ country[count]=$(echo $line | cut -d ':' -f1)
+ code[count]=$(echo $line | cut -d ':' -f2 | tr -d " ")
+
+ if [ "$header" = "restricted_channels=0x20" ]; then
+ echo "alternate_pulse_shape=0x01" > UWB-calibration-${code[$count]}.conf
+ echo "$header" >> UWB-calibration-${code[$count]}.conf
+ else
+ echo "$header" > UWB-calibration-${code[$count]}.conf
+ fi
+ fi
+((count++))
+done < uwb_country.conf
+
+ echo "============== $var =============="
+ for var2 in ${code[@]}; do
+ echo "\$(LOCAL_UWB_CAL_DIR)/UWB-calibration-$var2.conf:\$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-$var2.conf \\"
+ done
diff --git a/uwb/calibration/init.uwb.calib.sh b/uwb/calibration/init.uwb.calib.sh
new file mode 100644
index 00000000..a604885a
--- /dev/null
+++ b/uwb/calibration/init.uwb.calib.sh
@@ -0,0 +1,57 @@
+#!/vendor/bin/sh
+if [ -z "$2" ]
+then
+ echo "usage is $0 input-calibration output_calibration"
+ exit 0
+fi
+OUTPUT_CALIB="$2"
+if [ ! -f "$OUTPUT_CALIB" ]; then
+ touch $OUTPUT_CALIB
+ chmod 0600 $OUTPUT_CALIB
+ file="$1"
+ while IFS=, read -r f1 f2
+ do
+ case $f1 in
+ "UWB_cal_tx_xtal_reg_final_value")
+ if [ $((0x$f2)) -gt 63 ]; then
+ f2=63
+ fi
+ echo 'xtal_trim=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH5_tx_ant_delay_cal_data")
+ echo 'ant0.ch5.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH5_rx_ant_delay_cal_data")
+ echo 'ant1.ch5.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH9_tx_ant_delay_cal_data")
+ echo 'ant0.ch9.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH9_rx_ant_delay_cal_data")
+ echo 'ant1.ch9.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_RX2_CH5_cal_pdoa_data")
+ # float value * 2048
+ #/vendor/bin/sh does not support "bc"
+ base=2048
+ ones=${f2%%.*}
+ dec=${f2#*.}
+ ones="$(($ones*$base))"
+ if [ ${#dec} -eq 2 ]; then
+ dec="$(($dec*$base/100))"
+ echo 'ant1.ant3.ch5.pdoa_offset='$(($ones+$dec)) >> $OUTPUT_CALIB
+ fi
+ ;;
+ "UWB_RX2_CH9_cal_pdoa_data")
+ base=2048
+ ones=${f2%%.*}
+ dec=${f2#*.}
+ ones="$(($ones*$base))"
+ if [ ${#dec} -eq 2 ]; then
+ dec="$(($dec*$base/100))"
+ echo 'ant1.ant3.ch9.pdoa_offset='$(($ones+$dec)) >> $OUTPUT_CALIB
+ fi
+ esac
+ done <"$file"
+ exit 0
+fi
diff --git a/uwb/calibration/init.uwb.calib.xtal.sh b/uwb/calibration/init.uwb.calib.xtal.sh
new file mode 100644
index 00000000..efdfd6b0
--- /dev/null
+++ b/uwb/calibration/init.uwb.calib.xtal.sh
@@ -0,0 +1,25 @@
+#!/vendor/bin/sh
+# only use xtal_trim from factory calibration
+if [ -z "$2" ]
+then
+ echo "usage is $0 input-calibration output_calibration"
+ exit 0
+fi
+OUTPUT_CALIB="$2"
+if [ ! -f "$OUTPUT_CALIB" ]; then
+ touch $OUTPUT_CALIB
+ chmod 0644 $OUTPUT_CALIB
+ file="$1"
+ while IFS=, read -r f1 f2
+ do
+ case $f1 in
+ "UWB_cal_tx_xtal_reg_final_value")
+ if [ $((0x$f2)) -gt 63 ]; then
+ f2=63
+ fi
+ echo 'xtal_trim=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ esac
+ done <"$file"
+ exit 0
+fi
diff --git a/uwb/calibration/uwb_country.conf b/uwb/calibration/uwb_country.conf
new file mode 100644
index 00000000..51dd4341
--- /dev/null
+++ b/uwb/calibration/uwb_country.conf
@@ -0,0 +1,21 @@
+*restricted_channels=0xffff
+"Argentina": "ar",
+"Armenia": "am",
+"Azerbaijan": "az",
+"Belarus": "by",
+"Indonesia": "id",
+"Kazakhstan": "kz",
+"Kyrgyzstan": "kg",
+"Nepal": "np",
+"Pakistan": "pk",
+"Paraguay": "py",
+"Russia": "ru",
+"Solomon Islands": "sb",
+"Tajikistan": "tj",
+"Turkmenistanr": "tm",
+"Ukraine": "ua",
+"Uzbekistan": "uz"
+
+*restricted_channels=0x20
+"Japan": "jp",
+"Taiwan": "tw"
diff --git a/uwb/uwb.mk b/uwb/uwb.mk
new file mode 100644
index 00000000..7984a091
--- /dev/null
+++ b/uwb/uwb.mk
@@ -0,0 +1,42 @@
+#
+# Copyright (C) 2021 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.
+
+# UWB - ultra wide band
+$(call inherit-product-if-exists, vendor/qorvo/uwb/uwb.mk)
+
+LOCAL_UWB_CAL_DIR=device/google/gs101/uwb/calibration
+
+PRODUCT_COPY_FILES += \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-jp.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-jp.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-ar.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-ar.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-am.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-am.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-az.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-az.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-by.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-by.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-id.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-id.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-kz.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-kz.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-kg.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-kg.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-np.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-np.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-pk.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-pk.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-py.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-py.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-ru.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-ru.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-sb.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-sb.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-tj.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-tj.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-tm.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-tm.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-ua.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-ua.conf \
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-uz.conf:$(TARGET_COPY_OUT_VENDOR)/etc/uwb/UWB-calibration-uz.conf \
+ $(LOCAL_UWB_CAL_DIR)/init.uwb.calib.xtal.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.uwb.calib.sh \
+
+PRODUCT_COPY_FILES += \
+ frameworks/native/data/etc/android.hardware.uwb.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.uwb.xml
diff --git a/vibrator/Android.mk b/vibrator/Android.mk
new file mode 100644
index 00000000..5b089be2
--- /dev/null
+++ b/vibrator/Android.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2020 The Android Open-Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+include $(call first-makefiles-under, $(call my-dir))
diff --git a/wifi/BoardConfig-wifi.mk b/wifi/BoardConfig-wifi.mk
new file mode 100644
index 00000000..a9dc7db6
--- /dev/null
+++ b/wifi/BoardConfig-wifi.mk
@@ -0,0 +1,33 @@
+#
+# Copyright (C) 2021 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.
+#
+
+# WiFi
+BOARD_WLAN_DEVICE := bcmdhd
+BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd
+BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd
+WPA_SUPPLICANT_VERSION := VER_0_8_X
+BOARD_WPA_SUPPLICANT_DRIVER := NL80211
+BOARD_HOSTAPD_DRIVER := NL80211
+# Wifi interface combination - {1 STA + 1 AP} or {1 STA + 1 AP_BRIDGED} or {1 STA + 1 P2P}
+# or {1 STA + 1 NAN} or {2 STA}
+WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA}, 1}, {{P2P, NAN, AP, AP_BRIDGED}, 1}}, {{{STA}, 2}}
+WIFI_FEATURE_WIFI_EXT_HAL := true
+WIFI_FEATURE_IMU_DETECTION := true
+# Avoid Wifi reset on MAC Address change
+WIFI_AVOID_IFACE_RESET_MAC_CHANGE := true
+WIFI_FEATURE_HOSTAPD_11AX := true
+BOARD_HOSTAPD_CONFIG_80211W_MFP_OPTIONAL := true
+WIFI_HIDL_UNIFIED_SUPPLICANT_SERVICE_RC_ENTRY := true
diff --git a/wifi/coex_table.xml b/wifi/coex_table.xml
new file mode 100644
index 00000000..ff31bed0
--- /dev/null
+++ b/wifi/coex_table.xml
@@ -0,0 +1,357 @@
+<table>
+ <entry>
+ <rat>LTE</rat>
+ <band>1</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>1</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>2</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ <intermodParams5g>
+ <N>-2</N>
+ <M>1</M>
+ <overlap>10</overlap>
+ </intermodParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>2</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ <intermodParams5g>
+ <N>-2</N>
+ <M>1</M>
+ <overlap>10</overlap>
+ </intermodParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>3</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ <intermodParams5g>
+ <N>-2</N>
+ <M>1</M>
+ <overlap>10</overlap>
+ </intermodParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>3</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ <intermodParams5g>
+ <N>-2</N>
+ <M>1</M>
+ <overlap>10</overlap>
+ </intermodParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>4</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ <intermodParams5g>
+ <N>-2</N>
+ <M>1</M>
+ <overlap>10</overlap>
+ </intermodParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>5</band>
+ <params>
+ <harmonicParams2g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>5</band>
+ <params>
+ <harmonicParams2g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>7</band>
+ <params>
+ <neighborThresholds>
+ <wifiVictimMhz>50</wifiVictimMhz>
+ <cellVictimMhz>50</cellVictimMhz>
+ </neighborThresholds>
+ <intermodParams2g>
+ <N>2</N>
+ <M>-1</M>
+ <overlap>10</overlap>
+ </intermodParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>7</band>
+ <params>
+ <neighborThresholds>
+ <wifiVictimMhz>50</wifiVictimMhz>
+ <cellVictimMhz>50</cellVictimMhz>
+ </neighborThresholds>
+ <intermodParams2g>
+ <N>2</N>
+ <M>-1</M>
+ <overlap>10</overlap>
+ </intermodParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>18</band>
+ <params>
+ <harmonicParams2g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>18</band>
+ <params>
+ <harmonicParams2g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>19</band>
+ <params>
+ <harmonicParams2g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>25</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ <intermodParams5g>
+ <N>-2</N>
+ <M>1</M>
+ <overlap>10</overlap>
+ </intermodParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>25</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ <intermodParams5g>
+ <N>-2</N>
+ <M>1</M>
+ <overlap>10</overlap>
+ </intermodParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>26</band>
+ <params>
+ <harmonicParams2g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>26</band>
+ <params>
+ <harmonicParams2g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>27</band>
+ <params>
+ <harmonicParams2g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams2g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>38</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>38</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>39</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>39</band>
+ <params>
+ <harmonicParams5g>
+ <N>3</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>40</band>
+ <params>
+ <neighborThresholds>
+ <wifiVictimMhz>50</wifiVictimMhz>
+ <cellVictimMhz>50</cellVictimMhz>
+ </neighborThresholds>
+ <defaultChannels>
+ <default2g>11</default2g>
+ </defaultChannels>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>40</band>
+ <params>
+ <neighborThresholds>
+ <wifiVictimMhz>50</wifiVictimMhz>
+ <cellVictimMhz>50</cellVictimMhz>
+ </neighborThresholds>
+ <defaultChannels>
+ <default2g>11</default2g>
+ </defaultChannels>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>LTE</rat>
+ <band>41</band>
+ <params>
+ <neighborThresholds>
+ <wifiVictimMhz>50</wifiVictimMhz>
+ <cellVictimMhz>50</cellVictimMhz>
+ </neighborThresholds>
+ <harmonicParams5g>
+ <N>2</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ </params>
+ </entry>
+
+ <entry>
+ <rat>NR</rat>
+ <band>41</band>
+ <params>
+ <neighborThresholds>
+ <wifiVictimMhz>50</wifiVictimMhz>
+ <cellVictimMhz>50</cellVictimMhz>
+ </neighborThresholds>
+ <harmonicParams5g>
+ <N>2</N>
+ <overlap>10</overlap>
+ </harmonicParams5g>
+ </params>
+ </entry>
+</table>
diff --git a/wifi/p2p_supplicant_overlay.conf b/wifi/p2p_supplicant_overlay.conf
new file mode 100644
index 00000000..4ec8453e
--- /dev/null
+++ b/wifi/p2p_supplicant_overlay.conf
@@ -0,0 +1,10 @@
+driver_param=use_p2p_group_interface=1p2p_device=1
+update_config=1
+eapol_version=1
+ap_scan=1
+fast_reauth=1
+pmf=1
+p2p_add_cli_chan=1
+disable_scan_offload=1
+p2p_go_vht=1
+p2p_pref_chan=124:149, 115:36
diff --git a/wifi/wpa_supplicant_overlay.conf b/wifi/wpa_supplicant_overlay.conf
new file mode 100644
index 00000000..6f274c1a
--- /dev/null
+++ b/wifi/wpa_supplicant_overlay.conf
@@ -0,0 +1,10 @@
+sae_pwe=2
+driver_param=use_p2p_group_interface=1p2p_device=1
+disable_scan_offload=1
+wowlan_triggers=any
+bss_max_count=512
+interworking=1
+hs20=1
+auto_interworking=0
+bss_no_flush_when_down=1
+btm_offload=1