Merge "NetworkStats: Avoid Division By 0"
diff --git a/OWNERS b/OWNERS
index 03cfac9..ab5bd18 100644
--- a/OWNERS
+++ b/OWNERS
@@ -23,6 +23,9 @@
 # via https://android.git.corp.google.com/All-Projects/+/refs/meta/config/rules.pl.
 per-file */api/*current.txt = *
 
+# Test mapping changes can be made by anyone
+per-file */TEST_MAPPING = *
+
 # Support bulk translation updates
 per-file */res*/values*/*.xml = byi@google.com, delphij@google.com
 
diff --git a/TestProtoLibraries.bp b/TestProtoLibraries.bp
index 513d45f..afc11bb 100644
--- a/TestProtoLibraries.bp
+++ b/TestProtoLibraries.bp
@@ -30,6 +30,6 @@
         type: "full",
     },
     errorprone: {
-        javacflags: ["-Xep:MissingOverride:OFF"], // b/72714520
+        enabled: false,
     },
 }
diff --git a/apex/media/OWNERS b/apex/media/OWNERS
index ced2fb5..73f02d3 100644
--- a/apex/media/OWNERS
+++ b/apex/media/OWNERS
@@ -1,10 +1,10 @@
-andrewlewis@google.com
-aquilescanta@google.com
-chz@google.com
+# Bug component: 1344
 hdmoon@google.com
 hkuang@google.com
 jinpark@google.com
 klhyun@google.com
 lnilsson@google.com
-marcone@google.com
 sungsoo@google.com
+
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp
index e7e9e4c..a1206f9 100644
--- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp
+++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp
@@ -93,7 +93,7 @@
                                "--idmap-path", GetIdmapPath()});
   // clang-format on
   ASSERT_THAT(result, NotNull());
-  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
+  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
 
   struct stat st;
   ASSERT_EQ(stat(GetIdmapPath().c_str(), &st), 0);
@@ -119,7 +119,7 @@
                                "--idmap-path", GetIdmapPath()});
   // clang-format on
   ASSERT_THAT(result, NotNull());
-  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
+  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
 
   // clang-format off
   result = ExecuteBinary({"idmap2",
@@ -127,14 +127,14 @@
                           "--idmap-path", GetIdmapPath()});
   // clang-format on
   ASSERT_THAT(result, NotNull());
-  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
-  ASSERT_NE(result->stdout.find(R::target::integer::literal::int1 + " -> 0x7f010000"),
+  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+  ASSERT_NE(result->stdout_str.find(R::target::integer::literal::int1 + " -> 0x7f010000"),
             std::string::npos);
-  ASSERT_NE(result->stdout.find(R::target::string::literal::str1 + " -> 0x7f020000"),
+  ASSERT_NE(result->stdout_str.find(R::target::string::literal::str1 + " -> 0x7f020000"),
             std::string::npos);
-  ASSERT_NE(result->stdout.find(R::target::string::literal::str3 + " -> 0x7f020001"),
+  ASSERT_NE(result->stdout_str.find(R::target::string::literal::str3 + " -> 0x7f020001"),
             std::string::npos);
-  ASSERT_NE(result->stdout.find(R::target::string::literal::str4 + " -> 0x7f020002"),
+  ASSERT_NE(result->stdout_str.find(R::target::string::literal::str4 + " -> 0x7f020002"),
             std::string::npos);
 
   // clang-format off
@@ -144,8 +144,8 @@
                           "--idmap-path", GetIdmapPath()});
   // clang-format on
   ASSERT_THAT(result, NotNull());
-  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
-  ASSERT_NE(result->stdout.find("00000000: 504d4449  magic"), std::string::npos);
+  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+  ASSERT_NE(result->stdout_str.find("00000000: 504d4449  magic"), std::string::npos);
 
   // clang-format off
   result = ExecuteBinary({"idmap2",
@@ -170,7 +170,7 @@
                                "--idmap-path", GetIdmapPath()});
   // clang-format on
   ASSERT_THAT(result, NotNull());
-  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
+  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
 
   // clang-format off
   result = ExecuteBinary({"idmap2",
@@ -180,9 +180,9 @@
                           "--resid", R::target::string::literal::str1});
   // clang-format on
   ASSERT_THAT(result, NotNull());
-  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
-  ASSERT_NE(result->stdout.find("overlay-1"), std::string::npos);
-  ASSERT_EQ(result->stdout.find("overlay-1-sv"), std::string::npos);
+  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+  ASSERT_NE(result->stdout_str.find("overlay-1"), std::string::npos);
+  ASSERT_EQ(result->stdout_str.find("overlay-1-sv"), std::string::npos);
 
   // clang-format off
   result = ExecuteBinary({"idmap2",
@@ -192,9 +192,9 @@
                           "--resid", "test.target:string/str1"});
   // clang-format on
   ASSERT_THAT(result, NotNull());
-  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
-  ASSERT_NE(result->stdout.find("overlay-1"), std::string::npos);
-  ASSERT_EQ(result->stdout.find("overlay-1-sv"), std::string::npos);
+  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+  ASSERT_NE(result->stdout_str.find("overlay-1"), std::string::npos);
+  ASSERT_EQ(result->stdout_str.find("overlay-1-sv"), std::string::npos);
 
   // clang-format off
   result = ExecuteBinary({"idmap2",
@@ -204,8 +204,8 @@
                           "--resid", "test.target:string/str1"});
   // clang-format on
   ASSERT_THAT(result, NotNull());
-  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
-  ASSERT_NE(result->stdout.find("overlay-1-sv"), std::string::npos);
+  ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+  ASSERT_NE(result->stdout_str.find("overlay-1-sv"), std::string::npos);
 
   unlink(GetIdmapPath().c_str());
 }
diff --git a/core/api/current.txt b/core/api/current.txt
index 64976fa..bc61d15 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -8756,6 +8756,7 @@
     field public static final int GATT_CONNECTION_CONGESTED = 143; // 0x8f
     field public static final int GATT_FAILURE = 257; // 0x101
     field public static final int GATT_INSUFFICIENT_AUTHENTICATION = 5; // 0x5
+    field public static final int GATT_INSUFFICIENT_AUTHORIZATION = 8; // 0x8
     field public static final int GATT_INSUFFICIENT_ENCRYPTION = 15; // 0xf
     field public static final int GATT_INVALID_ATTRIBUTE_LENGTH = 13; // 0xd
     field public static final int GATT_INVALID_OFFSET = 7; // 0x7
@@ -9082,6 +9083,7 @@
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionState(android.bluetooth.BluetoothDevice);
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
     field public static final int A2DP = 2; // 0x2
+    field public static final int CSIP_SET_COORDINATOR = 25; // 0x19
     field public static final String EXTRA_PREVIOUS_STATE = "android.bluetooth.profile.extra.PREVIOUS_STATE";
     field public static final String EXTRA_STATE = "android.bluetooth.profile.extra.STATE";
     field public static final int GATT = 7; // 0x7
@@ -30328,6 +30330,7 @@
     method public void close();
     method @NonNull public static android.os.SharedMemory create(@Nullable String, int) throws android.system.ErrnoException;
     method public int describeContents();
+    method @NonNull public static android.os.SharedMemory fromFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
     method public int getSize();
     method @NonNull public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException;
     method @NonNull public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException;
@@ -38093,6 +38096,7 @@
     method public final void cancelCall();
     method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
     method public abstract void onPlaceCall(@NonNull android.net.Uri, @NonNull android.telecom.PhoneAccountHandle, boolean);
+    method public void onRedirectionTimeout();
     method public final boolean onUnbind(@NonNull android.content.Intent);
     method public final void placeCallUnmodified();
     method public final void redirectCall(@NonNull android.net.Uri, @NonNull android.telecom.PhoneAccountHandle, boolean);
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index bfa5a7b..66d6124 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -132,6 +132,11 @@
     field public static final int VPN_UID = 1016; // 0x3f8
   }
 
+  public final class ServiceManager {
+    method public static boolean isDeclared(@NonNull String);
+    method @Nullable public static android.os.IBinder waitForDeclaredService(@NonNull String);
+  }
+
   public class StatsServiceManager {
     method @NonNull public android.os.StatsServiceManager.ServiceRegisterer getStatsCompanionServiceRegisterer();
     method @NonNull public android.os.StatsServiceManager.ServiceRegisterer getStatsManagerServiceRegisterer();
@@ -155,6 +160,11 @@
     method public static int getNumSignalStrengthLevels();
   }
 
+  public class SubscriptionManager {
+    method public void addSubscriptionInfoRecord(@NonNull String, @Nullable String, int, int);
+    method public void removeSubscriptionInfoRecord(@NonNull String, int);
+  }
+
   public class TelephonyManager {
     method @NonNull public static int[] getAllNetworkTypes();
   }
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index efde6f1..385c407 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -1510,6 +1510,7 @@
   public final class BluetoothDevice implements android.os.Parcelable {
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean cancelBondProcess();
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean createBondOutOfBand(int, @Nullable android.bluetooth.OobData, @Nullable android.bluetooth.OobData);
+    method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean fetchUuidsWithSdp(int);
     method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public byte[] getMetadata(int);
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getSimAccessPermission();
     method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isConnected();
@@ -1643,7 +1644,9 @@
     field @NonNull public static final android.os.ParcelUuid AVRCP_TARGET;
     field @NonNull public static final android.os.ParcelUuid BASE_UUID;
     field @NonNull public static final android.os.ParcelUuid BNEP;
+    field @NonNull public static final android.os.ParcelUuid COORDINATED_SET;
     field @NonNull public static final android.os.ParcelUuid DIP;
+    field @NonNull public static final android.os.ParcelUuid GENERIC_MEDIA_CONTROL;
     field @NonNull public static final android.os.ParcelUuid HEARING_AID;
     field @NonNull public static final android.os.ParcelUuid HFP;
     field @NonNull public static final android.os.ParcelUuid HFP_AG;
@@ -1654,6 +1657,7 @@
     field @NonNull public static final android.os.ParcelUuid LE_AUDIO;
     field @NonNull public static final android.os.ParcelUuid MAP;
     field @NonNull public static final android.os.ParcelUuid MAS;
+    field @NonNull public static final android.os.ParcelUuid MEDIA_CONTROL;
     field @NonNull public static final android.os.ParcelUuid MNS;
     field @NonNull public static final android.os.ParcelUuid NAP;
     field @NonNull public static final android.os.ParcelUuid OBEX_OBJECT_PUSH;
@@ -7766,6 +7770,7 @@
     field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
     field public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
     field public static final String NAMESPACE_INTELLIGENCE_ATTENTION = "intelligence_attention";
+    field public static final String NAMESPACE_LMKD_NATIVE = "lmkd_native";
     field public static final String NAMESPACE_MEDIA_NATIVE = "media_native";
     field public static final String NAMESPACE_NETD_NATIVE = "netd_native";
     field public static final String NAMESPACE_OTA = "ota";
diff --git a/core/java/Android.bp b/core/java/Android.bp
index 7ad5e05..eee696b 100644
--- a/core/java/Android.bp
+++ b/core/java/Android.bp
@@ -285,6 +285,23 @@
     },
 }
 
+aidl_interface {
+    name: "android.debug_aidl",
+    unstable: true,
+    srcs: [
+        "android/debug/AdbTransportType.aidl",
+        "android/debug/FingerprintAndPairDevice.aidl",
+        "android/debug/IAdbCallback.aidl",
+        "android/debug/IAdbManager.aidl",
+        "android/debug/PairDevice.aidl",
+    ],
+    backend: {
+        cpp: {
+            enabled: true,
+        },
+    },
+}
+
 // Avoid including Parcelable classes as we don't want to have two copies of
 // Parcelable cross the libraries. This is used by telephony-common (frameworks/opt/telephony)
 // and TeleService app (packages/services/Telephony).
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index ce68e08..fb9ef53 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -105,12 +105,15 @@
         String statusToken);
 
     /* Returns Map<String, Integer> from package name to visibility with all values stored for given account */
+    @SuppressWarnings(value = {"untyped-collection"})
     Map getPackagesAndVisibilityForAccount(in Account account);
+    @SuppressWarnings(value = {"untyped-collection"})
     boolean addAccountExplicitlyWithVisibility(in Account account, String password, in Bundle extras,
             in Map visibility);
     boolean setAccountVisibility(in Account a, in String packageName, int newVisibility);
     int getAccountVisibility(in Account a, in String packageName);
     /* Type may be null returns Map <Account, Integer>*/
+    @SuppressWarnings(value = {"untyped-collection"})
     Map getAccountsAndVisibilityForPackage(in String packageName, in String accountType);
 
     void registerAccountListener(in String[] accountTypes, String opPackageName);
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 3ad8b4b..d28e489 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -223,14 +223,14 @@
     void addCrossProfileIntentFilter(in ComponentName admin, in IntentFilter filter, int flags);
     void clearCrossProfileIntentFilters(in ComponentName admin);
 
-    boolean setPermittedAccessibilityServices(in ComponentName admin,in List packageList);
-    List getPermittedAccessibilityServices(in ComponentName admin);
-    List getPermittedAccessibilityServicesForUser(int userId);
+    boolean setPermittedAccessibilityServices(in ComponentName admin,in List<String> packageList);
+    List<String> getPermittedAccessibilityServices(in ComponentName admin);
+    List<String> getPermittedAccessibilityServicesForUser(int userId);
     boolean isAccessibilityServicePermittedByAdmin(in ComponentName admin, String packageName, int userId);
 
-    boolean setPermittedInputMethods(in ComponentName admin,in List packageList);
-    List getPermittedInputMethods(in ComponentName admin);
-    List getPermittedInputMethodsForCurrentUser();
+    boolean setPermittedInputMethods(in ComponentName admin,in List<String> packageList);
+    List<String> getPermittedInputMethods(in ComponentName admin);
+    List<String> getPermittedInputMethodsForCurrentUser();
     boolean isInputMethodPermittedByAdmin(in ComponentName admin, String packageName, int userId);
 
     boolean setPermittedCrossProfileNotificationListeners(in ComponentName admin, in List<String> packageList);
diff --git a/core/java/android/app/usage/UsageStats.java b/core/java/android/app/usage/UsageStats.java
index 4d73a61..6d777cf 100644
--- a/core/java/android/app/usage/UsageStats.java
+++ b/core/java/android/app/usage/UsageStats.java
@@ -171,9 +171,9 @@
         mLaunchCount = stats.mLaunchCount;
         mAppLaunchCount = stats.mAppLaunchCount;
         mLastEvent = stats.mLastEvent;
-        mActivities = stats.mActivities;
-        mForegroundServices = stats.mForegroundServices;
-        mChooserCounts = stats.mChooserCounts;
+        mActivities = stats.mActivities.clone();
+        mForegroundServices = new ArrayMap<>(stats.mForegroundServices);
+        mChooserCounts = new ArrayMap<>(stats.mChooserCounts);
     }
 
     /**
diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java
index 16413e1..4dcb3dc 100644
--- a/core/java/android/bluetooth/BluetoothA2dp.java
+++ b/core/java/android/bluetooth/BluetoothA2dp.java
@@ -946,6 +946,10 @@
     public boolean setBufferLengthMillis(@BluetoothCodecConfig.SourceCodecType int codec,
             int value) {
         if (VDBG) log("setBufferLengthMillis(" + codec + ", " + value + ")");
+        if (value < 0) {
+            Log.e(TAG, "Trying to set audio buffer length to a negative value: " + value);
+            return false;
+        }
         try {
             final IBluetoothA2dp service = getService();
             if (service != null && isEnabled()) {
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 0969ec2..38fb90d 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -1622,13 +1622,38 @@
      */
     @RequiresPermission(Manifest.permission.BLUETOOTH)
     public boolean fetchUuidsWithSdp() {
+        return fetchUuidsWithSdp(TRANSPORT_AUTO);
+    }
+
+    /**
+     * Perform a service discovery on the remote device to get the UUIDs supported with the
+     * specific transport.
+     *
+     * <p>This API is asynchronous and {@link #ACTION_UUID} intent is sent,
+     * with the UUIDs supported by the remote end. If there is an error
+     * in getting the SDP or GATT records or if the process takes a long time, or the device
+     * is bonding and we have its UUIDs cached, {@link #ACTION_UUID} intent is sent with the
+     * UUIDs that is currently present in the cache. Clients should use the {@link #getUuids}
+     * to get UUIDs if service discovery is not to be performed. If there is an ongoing bonding
+     * process, service discovery or device inquiry, the request will be queued.
+     *
+     * @param transport - provide type of transport (e.g. LE or Classic).
+     * @return False if the check fails, True if the process of initiating an ACL connection
+     * to the remote device was started or cached UUIDs will be broadcast with the specific
+     * transport.
+     *
+     * @hide
+     */
+    @SystemApi
+    @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+    public boolean fetchUuidsWithSdp(@Transport int transport) {
         final IBluetooth service = sService;
         if (service == null || !isBluetoothEnabled()) {
             Log.e(TAG, "BT not enabled. Cannot fetchUuidsWithSdp");
             return false;
         }
         try {
-            return service.fetchRemoteUuids(this);
+            return service.fetchRemoteUuids(this, transport);
         } catch (RemoteException e) {
             Log.e(TAG, "", e);
         }
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index b3a7c88..b3ccdd0 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -101,6 +101,9 @@
     /** A read or write operation was requested with an invalid offset */
     public static final int GATT_INVALID_OFFSET = 0x7;
 
+    /** Insufficient authorization for a given operation */
+    public static final int GATT_INSUFFICIENT_AUTHORIZATION = 0x8;
+
     /** A write operation exceeds the maximum length of the attribute */
     public static final int GATT_INVALID_ATTRIBUTE_LENGTH = 0xd;
 
diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java
index b76d6b8..c4649b4 100644
--- a/core/java/android/bluetooth/BluetoothProfile.java
+++ b/core/java/android/bluetooth/BluetoothProfile.java
@@ -222,12 +222,25 @@
     int VOLUME_CONTROL = 23;
 
     /**
+     * @hide
+     * Media Control Profile server
+     *
+     */
+    int MCP_SERVER = 24;
+
+    /**
+     * Coordinated Set Identification Profile set coordinator
+     *
+     */
+    int CSIP_SET_COORDINATOR = 25;
+
+    /**
      * Max profile ID. This value should be updated whenever a new profile is added to match
      * the largest value assigned to a profile.
      *
      * @hide
      */
-    int MAX_PROFILE_ID = 23;
+    int MAX_PROFILE_ID = 25;
 
     /**
      * Default priority for devices that we try to auto-connect to and
diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java
index d82cf19..7e4ee9e8 100644
--- a/core/java/android/bluetooth/BluetoothUuid.java
+++ b/core/java/android/bluetooth/BluetoothUuid.java
@@ -172,6 +172,21 @@
     /** @hide */
     @NonNull
     @SystemApi
+    public static final ParcelUuid GENERIC_MEDIA_CONTROL =
+            ParcelUuid.fromString("00001849-0000-1000-8000-00805F9B34FB");
+    /** @hide */
+    @NonNull
+    @SystemApi
+    public static final ParcelUuid MEDIA_CONTROL =
+            ParcelUuid.fromString("00001848-0000-1000-8000-00805F9B34FB");
+    /** @hide */
+    @NonNull
+    @SystemApi
+    public static final ParcelUuid COORDINATED_SET =
+            ParcelUuid.fromString("00001846-0000-1000-8000-00805F9B34FB");
+    /** @hide */
+    @NonNull
+    @SystemApi
     public static final ParcelUuid BASE_UUID =
             ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB");
 
diff --git a/core/java/android/content/OWNERS b/core/java/android/content/OWNERS
index 8ad1349..c7f92c9 100644
--- a/core/java/android/content/OWNERS
+++ b/core/java/android/content/OWNERS
@@ -1,12 +1,14 @@
 # Remain no owner because multiple modules may touch this file.
 per-file Context.java = *
 per-file ContextWrapper.java = *
-per-file Content* = varunshah@google.com, omakoto@google.com, jsharkey@google.com
+per-file Content* = file:/services/core/java/com/android/server/am/OWNERS
 per-file IntentFilter.java = toddke@google.com
 per-file IntentFilter.java = patb@google.com
+per-file IntentFilter.java = file:/services/core/java/com/android/server/am/OWNERS
 per-file Intent.java = toddke@google.com
 per-file Intent.java = patb@google.com
 per-file Intent.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Intent.java = file:/services/core/java/com/android/server/am/OWNERS
 per-file AutofillOptions* = file:/core/java/android/service/autofill/OWNERS
 per-file ContentCaptureOptions* = file:/core/java/android/service/contentcapture/OWNERS
 per-file LocusId* = file:/core/java/android/service/contentcapture/OWNERS
diff --git a/core/java/android/content/om/IOverlayManager.aidl b/core/java/android/content/om/IOverlayManager.aidl
index 0b950b4..11ea16f 100644
--- a/core/java/android/content/om/IOverlayManager.aidl
+++ b/core/java/android/content/om/IOverlayManager.aidl
@@ -39,7 +39,7 @@
      *         requested user, an empty map is returned.
      */
     @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
-    Map getAllOverlays(in int userId);
+    Map<String, List<OverlayInfo>> getAllOverlays(in int userId);
 
     /**
      * Returns information about all overlays for the given target package for
@@ -51,7 +51,7 @@
      * @return A list of OverlayInfo objects; if no overlays exist for the
      *         requested package, an empty list is returned.
      */
-    List getOverlayInfosForTarget(in String targetPackageName, in int userId);
+    List<OverlayInfo> getOverlayInfosForTarget(in String targetPackageName, in int userId);
 
     /**
      * Returns information about the overlay with the given package name for the
diff --git a/core/java/android/debug/FingerprintAndPairDevice.aidl b/core/java/android/debug/FingerprintAndPairDevice.aidl
new file mode 100644
index 0000000..b439e14
--- /dev/null
+++ b/core/java/android/debug/FingerprintAndPairDevice.aidl
@@ -0,0 +1,28 @@
+/*
+ * 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 android.debug;
+
+import android.debug.PairDevice;
+
+/**
+ * @see {@link android.debug.IAdbManager#getPairedDevices()}
+ * @hide
+ */
+parcelable FingerprintAndPairDevice {
+    String keyFingerprint;
+    PairDevice device;
+}
\ No newline at end of file
diff --git a/core/java/android/debug/IAdbCallback.aidl b/core/java/android/debug/IAdbCallback.aidl
new file mode 100644
index 0000000..9c8f1cf
--- /dev/null
+++ b/core/java/android/debug/IAdbCallback.aidl
@@ -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 android.debug;
+
+import android.debug.AdbTransportType;
+
+/**
+ * Callback interface of {@link android.debug.IAdbCallbackManager}.
+ *
+ * @hide
+ */
+oneway interface IAdbCallback {
+    /**
+     * On debugging enabled, service providing IAdbManager calls this function.
+     */
+    void onDebuggingChanged(boolean enabled, AdbTransportType type);
+}
diff --git a/core/java/android/debug/IAdbManager.aidl b/core/java/android/debug/IAdbManager.aidl
index aea7633..314c405 100644
--- a/core/java/android/debug/IAdbManager.aidl
+++ b/core/java/android/debug/IAdbManager.aidl
@@ -16,6 +16,9 @@
 
 package android.debug;
 
+import android.debug.FingerprintAndPairDevice;
+import android.debug.IAdbCallback;
+
 /**
  * Interface to communicate remotely with the {@code AdbService} in the system server.
  *
@@ -58,9 +61,10 @@
     void denyWirelessDebugging();
 
     /**
-     * Returns a Map<String, PairDevice> with the key fingerprint mapped to the device information.
+     * Returns an array of NamedPairDevice with the key fingerprint mapped to the device
+     * information.
      */
-    Map getPairedDevices();
+    FingerprintAndPairDevice[] getPairedDevices();
 
     /**
      * Unpair the device identified by the key fingerprint it uses.
@@ -108,4 +112,14 @@
      * QR code.
      */
     boolean isAdbWifiQrSupported();
+
+    /**
+     * Register callback for ADB debugging changed notification.
+     */
+    void registerCallback(IAdbCallback callback);
+
+    /**
+     * Unregister callback for ADB debugging changed notification.
+     */
+    void unregisterCallback(IAdbCallback callback);
 }
diff --git a/core/java/android/hardware/biometrics/OWNERS b/core/java/android/hardware/biometrics/OWNERS
index 2065ffa..0b4d9d9 100644
--- a/core/java/android/hardware/biometrics/OWNERS
+++ b/core/java/android/hardware/biometrics/OWNERS
@@ -1,8 +1,3 @@
 # Bug component: 879035
 
-curtislb@google.com
-ilyamaty@google.com
-jaggies@google.com
-joshmccloskey@google.com
-kchyn@google.com
-
+include /services/core/java/com/android/server/biometrics/OWNERS
diff --git a/core/java/android/hardware/radio/ITuner.aidl b/core/java/android/hardware/radio/ITuner.aidl
index 429f1f3..7bf234b 100644
--- a/core/java/android/hardware/radio/ITuner.aidl
+++ b/core/java/android/hardware/radio/ITuner.aidl
@@ -80,14 +80,14 @@
     void setConfigFlag(int flag, boolean value);
 
     /**
-     * @param parameters Vendor-specific key-value pairs, must be Map<String, String>
-     * @return Vendor-specific key-value pairs, must be Map<String, String>
+     * @param parameters Vendor-specific key-value pairs
+     * @return Vendor-specific key-value pairs
      */
-    Map setParameters(in Map parameters);
+    Map<String, String> setParameters(in Map<String, String> parameters);
 
     /**
      * @param keys Parameter keys to fetch
-     * @return Vendor-specific key-value pairs, must be Map<String, String>
+     * @return Vendor-specific key-value pairs
      */
-    Map getParameters(in List<String> keys);
+    Map<String, String> getParameters(in List<String> keys);
 }
diff --git a/core/java/android/hardware/radio/ITunerCallback.aidl b/core/java/android/hardware/radio/ITunerCallback.aidl
index b32daa5..f98947b 100644
--- a/core/java/android/hardware/radio/ITunerCallback.aidl
+++ b/core/java/android/hardware/radio/ITunerCallback.aidl
@@ -36,7 +36,7 @@
     void onProgramListUpdated(in ProgramList.Chunk chunk);
 
     /**
-     * @param parameters Vendor-specific key-value pairs, must be Map<String, String>
+     * @param parameters Vendor-specific key-value pairs
      */
-    void onParametersUpdated(in Map parameters);
+    void onParametersUpdated(in Map<String, String> parameters);
 }
diff --git a/core/java/android/hardware/radio/TunerCallbackAdapter.java b/core/java/android/hardware/radio/TunerCallbackAdapter.java
index beff0f7..e3f7001 100644
--- a/core/java/android/hardware/radio/TunerCallbackAdapter.java
+++ b/core/java/android/hardware/radio/TunerCallbackAdapter.java
@@ -220,7 +220,7 @@
     }
 
     @Override
-    public void onParametersUpdated(Map parameters) {
+    public void onParametersUpdated(Map<String, String> parameters) {
         mHandler.post(() -> mCallback.onParametersUpdated(parameters));
     }
 }
diff --git a/core/java/android/net/PacProxyManager.java b/core/java/android/net/PacProxyManager.java
index 8f7ad8c..da79634 100644
--- a/core/java/android/net/PacProxyManager.java
+++ b/core/java/android/net/PacProxyManager.java
@@ -94,7 +94,7 @@
     }
 
     /**
-     * Updates the PAC Proxy Installer with current Proxy information.
+     * Updates the PAC Proxy Service with current Proxy information.
      */
     @RequiresPermission(anyOf = {
             android.Manifest.permission.NETWORK_STACK,
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java
index 1692921f..6da02f5 100644
--- a/core/java/android/os/BaseBundle.java
+++ b/core/java/android/os/BaseBundle.java
@@ -31,6 +31,7 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Set;
+import java.util.function.Supplier;
 
 /**
  * A mapping from String keys to values of various types. In most cases, you
@@ -38,7 +39,8 @@
  * {@link PersistableBundle} subclass.
  */
 public class BaseBundle {
-    private static final String TAG = "Bundle";
+    /** @hide */
+    protected static final String TAG = "Bundle";
     static final boolean DEBUG = false;
 
     // Keep them in sync with frameworks/native/libs/binder/PersistableBundle.cpp.
@@ -95,7 +97,7 @@
     Parcel mParcelledData = null;
 
     /**
-     * Whether {@link #mParcelledData} was generated by native coed or not.
+     * Whether {@link #mParcelledData} was generated by native code or not.
      */
     private boolean mParcelledByNative;
 
@@ -198,7 +200,7 @@
         if (size == 0) {
             return null;
         }
-        Object o = mMap.valueAt(0);
+        Object o = getValueAt(0);
         try {
             return (String) o;
         } catch (ClassCastException e) {
@@ -229,7 +231,12 @@
      * using the currently assigned class loader.
      */
     @UnsupportedAppUsage
-    /* package */ void unparcel() {
+    final void unparcel() {
+        unparcel(/* itemwise */ false);
+    }
+
+    /** Deserializes the underlying data and each item if {@code itemwise} is true. */
+    final void unparcel(boolean itemwise) {
         synchronized (this) {
             final Parcel source = mParcelledData;
             if (source != null) {
@@ -241,9 +248,42 @@
                             + ": no parcelled data");
                 }
             }
+            if (itemwise) {
+                for (int i = 0, n = mMap.size(); i < n; i++) {
+                    // Triggers deserialization of i-th item, if needed
+                    getValueAt(i);
+                }
+            }
         }
     }
 
+    /**
+     * Returns the value for key {@code key}.
+     *
+     * @hide
+     */
+    final Object getValue(String key) {
+        int i = mMap.indexOfKey(key);
+        return (i >= 0) ? getValueAt(i) : null;
+    }
+
+    /**
+     * Returns the value for a certain position in the array map.
+     *
+     * @hide
+     */
+    final Object getValueAt(int i) {
+        Object object = mMap.valueAt(i);
+        if (object instanceof Supplier<?>) {
+            Supplier<?> supplier = (Supplier<?>) object;
+            synchronized (this) {
+                object = supplier.get();
+            }
+            mMap.setValueAt(i, object);
+        }
+        return object;
+    }
+
     private void initializeFromParcelLocked(@NonNull Parcel parcelledData, boolean recycleParcel,
             boolean parcelledByNative) {
         if (LOG_DEFUSABLE && sShouldDefuse && (mFlags & FLAG_DEFUSABLE) == 0) {
@@ -282,15 +322,8 @@
             map.ensureCapacity(count);
         }
         try {
-            if (parcelledByNative) {
-                // If it was parcelled by native code, then the array map keys aren't sorted
-                // by their hash codes, so use the safe (slow) one.
-                parcelledData.readArrayMapSafelyInternal(map, count, mClassLoader);
-            } else {
-                // If parcelled by Java, we know the contents are sorted properly,
-                // so we can use ArrayMap.append().
-                parcelledData.readArrayMapInternal(map, count, mClassLoader);
-            }
+            recycleParcel &= parcelledData.readArrayMap(map, count, !parcelledByNative,
+                    /* lazy */ true, mClassLoader);
         } catch (BadParcelableException e) {
             if (sShouldDefuse) {
                 Log.w(TAG, "Failed to parse Bundle, but defusing quietly", e);
@@ -342,7 +375,7 @@
 
     /** @hide */
     ArrayMap<String, Object> getMap() {
-        unparcel();
+        unparcel(/* itemwise */ true);
         return mMap;
     }
 
@@ -400,7 +433,12 @@
     }
 
     /**
-     * @hide This kind-of does an equality comparison.  Kind-of.
+     * Performs a loose equality check, which means there can be false negatives but if the method
+     * returns true than both objects are guaranteed to be equal.
+     *
+     * The point is that this method is a light-weight check in performance terms.
+     *
+     * @hide
      */
     public boolean kindofEquals(BaseBundle other) {
         if (other == null) {
@@ -415,6 +453,12 @@
         } else if (isParcelled()) {
             return mParcelledData.compareData(other.mParcelledData) == 0;
         } else {
+            // Following semantic above of failing in case we get a serialized value vs a
+            // deserialized one, we'll compare the map. If a certain element hasn't been
+            // deserialized yet, it's a Supplier (or more specifically a LazyValue, but let's
+            // pretend we don't know that here :P), we'll use that element's equality comparison as
+            // map naturally does. That will takes care of comparing the payload if needed (see
+            // Parcel.readLazyValue() for details).
             return mMap.equals(other.mMap);
         }
     }
@@ -453,7 +497,7 @@
                     final int N = fromMap.size();
                     mMap = new ArrayMap<>(N);
                     for (int i = 0; i < N; i++) {
-                        mMap.append(fromMap.keyAt(i), deepCopyValue(fromMap.valueAt(i)));
+                        mMap.append(fromMap.keyAt(i), deepCopyValue(from.getValueAt(i)));
                     }
                 }
             } else {
@@ -526,7 +570,7 @@
     @Nullable
     public Object get(String key) {
         unparcel();
-        return mMap.get(key);
+        return getValue(key);
     }
 
     /**
@@ -1001,7 +1045,7 @@
      */
     char getChar(String key, char defaultValue) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return defaultValue;
         }
@@ -1266,7 +1310,7 @@
     @Nullable
     Serializable getSerializable(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1289,7 +1333,7 @@
     @Nullable
     ArrayList<Integer> getIntegerArrayList(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1312,7 +1356,7 @@
     @Nullable
     ArrayList<String> getStringArrayList(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1335,7 +1379,7 @@
     @Nullable
     ArrayList<CharSequence> getCharSequenceArrayList(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1404,7 +1448,7 @@
     @Nullable
     short[] getShortArray(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1427,7 +1471,7 @@
     @Nullable
     char[] getCharArray(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1496,7 +1540,7 @@
     @Nullable
     float[] getFloatArray(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1585,7 +1629,7 @@
     void writeToParcelInner(Parcel parcel, int flags) {
         // If the parcel has a read-write helper, we can't just copy the blob, so unparcel it first.
         if (parcel.hasReadWriteHelper()) {
-            unparcel();
+            unparcel(/* itemwise */ true);
         }
         // Keep implementation in sync with writeToParcel() in
         // frameworks/native/libs/binder/PersistableBundle.cpp.
@@ -1660,10 +1704,13 @@
         }
 
         if (parcel.hasReadWriteHelper()) {
-            // If the parcel has a read-write helper, then we can't lazily-unparcel it, so just
-            // unparcel right away.
+            // If the parcel has a read-write helper, it's better to deserialize immediately
+            // otherwise the helper would have to either maintain valid state long after the bundle
+            // had been constructed with parcel or to make sure they trigger deserialization of the
+            // bundle immediately; neither of which is obvious.
             synchronized (this) {
                 initializeFromParcelLocked(parcel, /*recycleParcel=*/ false, isNativeBundle);
+                unparcel(/* itemwise */ true);
             }
             return;
         }
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
index 1c1f5c0..5626bde 100644
--- a/core/java/android/os/Bundle.java
+++ b/core/java/android/os/Bundle.java
@@ -330,47 +330,9 @@
                 // It's been unparcelled, so we need to walk the map
                 for (int i=mMap.size()-1; i>=0; i--) {
                     Object obj = mMap.valueAt(i);
-                    if (obj instanceof Parcelable) {
-                        if ((((Parcelable)obj).describeContents()
-                                & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
-                            fdFound = true;
-                            break;
-                        }
-                    } else if (obj instanceof Parcelable[]) {
-                        Parcelable[] array = (Parcelable[]) obj;
-                        for (int n = array.length - 1; n >= 0; n--) {
-                            Parcelable p = array[n];
-                            if (p != null && ((p.describeContents()
-                                    & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
-                                fdFound = true;
-                                break;
-                            }
-                        }
-                    } else if (obj instanceof SparseArray) {
-                        SparseArray<? extends Parcelable> array =
-                                (SparseArray<? extends Parcelable>) obj;
-                        for (int n = array.size() - 1; n >= 0; n--) {
-                            Parcelable p = array.valueAt(n);
-                            if (p != null && (p.describeContents()
-                                    & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
-                                fdFound = true;
-                                break;
-                            }
-                        }
-                    } else if (obj instanceof ArrayList) {
-                        ArrayList array = (ArrayList) obj;
-                        // an ArrayList here might contain either Strings or
-                        // Parcelables; only look inside for Parcelables
-                        if (!array.isEmpty() && (array.get(0) instanceof Parcelable)) {
-                            for (int n = array.size() - 1; n >= 0; n--) {
-                                Parcelable p = (Parcelable) array.get(n);
-                                if (p != null && ((p.describeContents()
-                                        & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
-                                    fdFound = true;
-                                    break;
-                                }
-                            }
-                        }
+                    if (Parcel.hasFileDescriptors(obj)) {
+                        fdFound = true;
+                        break;
                     }
                 }
             }
@@ -391,7 +353,7 @@
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public Bundle filterValues() {
-        unparcel();
+        unparcel(/* itemwise */ true);
         Bundle bundle = this;
         if (mMap != null) {
             ArrayMap<String, Object> map = mMap;
@@ -972,7 +934,7 @@
     @Nullable
     public Bundle getBundle(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -999,7 +961,7 @@
     @Nullable
     public <T extends Parcelable> T getParcelable(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1026,7 +988,7 @@
     @Nullable
     public Parcelable[] getParcelableArray(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1053,7 +1015,7 @@
     @Nullable
     public <T extends Parcelable> ArrayList<T> getParcelableArrayList(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1077,7 +1039,7 @@
     @Nullable
     public <T extends Parcelable> SparseArray<T> getSparseParcelableArray(@Nullable String key) {
         unparcel();
-        Object o = mMap.get(key);
+        Object o = getValue(key);
         if (o == null) {
             return null;
         }
@@ -1300,7 +1262,7 @@
     public void writeToParcel(Parcel parcel, int flags) {
         final boolean oldAllowFds = parcel.pushAllowFds((mFlags & FLAG_ALLOW_FDS) != 0);
         try {
-            super.writeToParcelInner(parcel, flags);
+            writeToParcelInner(parcel, flags);
         } finally {
             parcel.restoreAllowFds(oldAllowFds);
         }
@@ -1312,7 +1274,7 @@
      * @param parcel The parcel to overwrite this bundle from.
      */
     public void readFromParcel(Parcel parcel) {
-        super.readFromParcelInner(parcel);
+        readFromParcelInner(parcel);
         mFlags = FLAG_ALLOW_FDS;
         maybePrefillHasFds();
     }
diff --git a/core/java/android/os/DropBoxManager.java b/core/java/android/os/DropBoxManager.java
index fd576c9..d701676 100644
--- a/core/java/android/os/DropBoxManager.java
+++ b/core/java/android/os/DropBoxManager.java
@@ -30,6 +30,7 @@
 
 import com.android.internal.os.IDropBoxManagerService;
 
+import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.Closeable;
 import java.io.File;
@@ -234,7 +235,8 @@
             } else {
                 return null;
             }
-            return (mFlags & IS_GZIPPED) != 0 ? new GZIPInputStream(is) : is;
+            return (mFlags & IS_GZIPPED) != 0
+                ? new GZIPInputStream(new BufferedInputStream(is)) : is;
         }
 
         public static final @android.annotation.NonNull Parcelable.Creator<Entry> CREATOR = new Parcelable.Creator() {
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 6acdcc4..575eb37 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -26,6 +26,7 @@
 import android.util.ArraySet;
 import android.util.ExceptionUtils;
 import android.util.Log;
+import android.util.MathUtils;
 import android.util.Size;
 import android.util.SizeF;
 import android.util.Slog;
@@ -56,7 +57,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
+import java.util.function.Supplier;
 
 /**
  * Container for a message (data and object references) that can
@@ -649,6 +652,65 @@
     }
 
     /**
+     * Check if the object used in {@link #readValue(ClassLoader)} / {@link #writeValue(Object)}
+     * has file descriptors.
+     *
+     * <p>For most cases, it will use the self-reported {@link Parcelable#describeContents()} method
+     * for that.
+     *
+     * @throws IllegalArgumentException if you provide any object not supported by above methods.
+     *         Most notably, if you pass {@link Parcel}, this method will throw, for that check
+     *         {@link Parcel#hasFileDescriptors()}
+     *
+     * @hide
+     */
+    public static boolean hasFileDescriptors(Object value) {
+        getValueType(value); // Will throw if value is not supported
+        if (value instanceof LazyValue) {
+            return ((LazyValue) value).hasFileDescriptors();
+        } else if (value instanceof Parcelable) {
+            if ((((Parcelable) value).describeContents()
+                    & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
+                return true;
+            }
+        } else if (value instanceof Parcelable[]) {
+            Parcelable[] array = (Parcelable[]) value;
+            for (int n = array.length - 1; n >= 0; n--) {
+                Parcelable p = array[n];
+                if (p != null && ((p.describeContents()
+                        & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
+                    return true;
+                }
+            }
+        } else if (value instanceof SparseArray<?>) {
+            SparseArray<?> array = (SparseArray<?>) value;
+            for (int n = array.size() - 1; n >= 0; n--) {
+                Object object = array.valueAt(n);
+                if (object instanceof Parcelable) {
+                    Parcelable p = (Parcelable) object;
+                    if (p != null && (p.describeContents()
+                            & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
+                        return true;
+                    }
+                }
+            }
+        } else if (value instanceof ArrayList<?>) {
+            ArrayList<?> array = (ArrayList<?>) value;
+            for (int n = array.size() - 1; n >= 0; n--) {
+                Object object = array.get(n);
+                if (object instanceof Parcelable) {
+                    Parcelable p = (Parcelable) object;
+                    if (p != null && ((p.describeContents()
+                            & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
      * Store or read an IBinder interface token in the parcel at the current
      * {@link #dataPosition}.  This is used to validate that the marshalled
      * transaction is intended for the target interface.
@@ -1795,108 +1857,206 @@
      * should be used).</p>
      */
     public final void writeValue(@Nullable Object v) {
+        if (v instanceof LazyValue) {
+            LazyValue value = (LazyValue) v;
+            value.writeToParcel(this);
+            return;
+        }
+        int type = getValueType(v);
+        writeInt(type);
+        if (isLengthPrefixed(type)) {
+            // Length
+            int length = dataPosition();
+            writeInt(-1); // Placeholder
+            // Object
+            int start = dataPosition();
+            writeValue(type, v);
+            int end = dataPosition();
+            // Backpatch length
+            setDataPosition(length);
+            writeInt(end - start);
+            setDataPosition(end);
+        } else {
+            writeValue(type, v);
+        }
+    }
+
+    /** @hide */
+    public static int getValueType(@Nullable Object v) {
         if (v == null) {
-            writeInt(VAL_NULL);
+            return VAL_NULL;
         } else if (v instanceof String) {
-            writeInt(VAL_STRING);
-            writeString((String) v);
+            return VAL_STRING;
         } else if (v instanceof Integer) {
-            writeInt(VAL_INTEGER);
-            writeInt((Integer) v);
+            return VAL_INTEGER;
         } else if (v instanceof Map) {
-            writeInt(VAL_MAP);
-            writeMap((Map) v);
+            return VAL_MAP;
         } else if (v instanceof Bundle) {
             // Must be before Parcelable
-            writeInt(VAL_BUNDLE);
-            writeBundle((Bundle) v);
+            return VAL_BUNDLE;
         } else if (v instanceof PersistableBundle) {
-            writeInt(VAL_PERSISTABLEBUNDLE);
-            writePersistableBundle((PersistableBundle) v);
+            // Must be before Parcelable
+            return VAL_PERSISTABLEBUNDLE;
+        } else if (v instanceof SizeF) {
+            // Must be before Parcelable
+            return VAL_SIZEF;
         } else if (v instanceof Parcelable) {
             // IMPOTANT: cases for classes that implement Parcelable must
-            // come before the Parcelable case, so that their specific VAL_*
+            // come before the Parcelable case, so that their speci fic VAL_*
             // types will be written.
-            writeInt(VAL_PARCELABLE);
-            writeParcelable((Parcelable) v, 0);
+            return VAL_PARCELABLE;
         } else if (v instanceof Short) {
-            writeInt(VAL_SHORT);
-            writeInt(((Short) v).intValue());
+            return VAL_SHORT;
         } else if (v instanceof Long) {
-            writeInt(VAL_LONG);
-            writeLong((Long) v);
+            return VAL_LONG;
         } else if (v instanceof Float) {
-            writeInt(VAL_FLOAT);
-            writeFloat((Float) v);
+            return VAL_FLOAT;
         } else if (v instanceof Double) {
-            writeInt(VAL_DOUBLE);
-            writeDouble((Double) v);
+            return VAL_DOUBLE;
         } else if (v instanceof Boolean) {
-            writeInt(VAL_BOOLEAN);
-            writeInt((Boolean) v ? 1 : 0);
+            return VAL_BOOLEAN;
         } else if (v instanceof CharSequence) {
             // Must be after String
-            writeInt(VAL_CHARSEQUENCE);
-            writeCharSequence((CharSequence) v);
+            return VAL_CHARSEQUENCE;
         } else if (v instanceof List) {
-            writeInt(VAL_LIST);
-            writeList((List) v);
+            return VAL_LIST;
         } else if (v instanceof SparseArray) {
-            writeInt(VAL_SPARSEARRAY);
-            writeSparseArray((SparseArray) v);
+            return VAL_SPARSEARRAY;
         } else if (v instanceof boolean[]) {
-            writeInt(VAL_BOOLEANARRAY);
-            writeBooleanArray((boolean[]) v);
+            return VAL_BOOLEANARRAY;
         } else if (v instanceof byte[]) {
-            writeInt(VAL_BYTEARRAY);
-            writeByteArray((byte[]) v);
+            return VAL_BYTEARRAY;
         } else if (v instanceof String[]) {
-            writeInt(VAL_STRINGARRAY);
-            writeStringArray((String[]) v);
+            return VAL_STRINGARRAY;
         } else if (v instanceof CharSequence[]) {
             // Must be after String[] and before Object[]
-            writeInt(VAL_CHARSEQUENCEARRAY);
-            writeCharSequenceArray((CharSequence[]) v);
+            return VAL_CHARSEQUENCEARRAY;
         } else if (v instanceof IBinder) {
-            writeInt(VAL_IBINDER);
-            writeStrongBinder((IBinder) v);
+            return VAL_IBINDER;
         } else if (v instanceof Parcelable[]) {
-            writeInt(VAL_PARCELABLEARRAY);
-            writeParcelableArray((Parcelable[]) v, 0);
+            return VAL_PARCELABLEARRAY;
         } else if (v instanceof int[]) {
-            writeInt(VAL_INTARRAY);
-            writeIntArray((int[]) v);
+            return VAL_INTARRAY;
         } else if (v instanceof long[]) {
-            writeInt(VAL_LONGARRAY);
-            writeLongArray((long[]) v);
+            return VAL_LONGARRAY;
         } else if (v instanceof Byte) {
-            writeInt(VAL_BYTE);
-            writeInt((Byte) v);
+            return VAL_BYTE;
         } else if (v instanceof Size) {
-            writeInt(VAL_SIZE);
-            writeSize((Size) v);
-        } else if (v instanceof SizeF) {
-            writeInt(VAL_SIZEF);
-            writeSizeF((SizeF) v);
+            return VAL_SIZE;
         } else if (v instanceof double[]) {
-            writeInt(VAL_DOUBLEARRAY);
-            writeDoubleArray((double[]) v);
+            return VAL_DOUBLEARRAY;
         } else {
             Class<?> clazz = v.getClass();
             if (clazz.isArray() && clazz.getComponentType() == Object.class) {
                 // Only pure Object[] are written here, Other arrays of non-primitive types are
                 // handled by serialization as this does not record the component type.
-                writeInt(VAL_OBJECTARRAY);
-                writeArray((Object[]) v);
+                return VAL_OBJECTARRAY;
             } else if (v instanceof Serializable) {
                 // Must be last
-                writeInt(VAL_SERIALIZABLE);
-                writeSerializable((Serializable) v);
+                return VAL_SERIALIZABLE;
             } else {
-                throw new RuntimeException("Parcel: unable to marshal value " + v);
+                throw new IllegalArgumentException("Parcel: unknown type for value " + v);
             }
         }
     }
+    /**
+     * Writes value {@code v} in the parcel. This does NOT write the int representing the type
+     * first.
+     *
+     * @hide
+     */
+    public void writeValue(int type, @Nullable Object v) {
+        switch (type) {
+            case VAL_NULL:
+                break;
+            case VAL_STRING:
+                writeString((String) v);
+                break;
+            case VAL_INTEGER:
+                writeInt((Integer) v);
+                break;
+            case VAL_MAP:
+                writeMap((Map) v);
+                break;
+            case VAL_BUNDLE:
+                writeBundle((Bundle) v);
+                break;
+            case VAL_PERSISTABLEBUNDLE:
+                writePersistableBundle((PersistableBundle) v);
+                break;
+            case VAL_PARCELABLE:
+                writeParcelable((Parcelable) v, 0);
+                break;
+            case VAL_SHORT:
+                writeInt(((Short) v).intValue());
+                break;
+            case VAL_LONG:
+                writeLong((Long) v);
+                break;
+            case VAL_FLOAT:
+                writeFloat((Float) v);
+                break;
+            case VAL_DOUBLE:
+                writeDouble((Double) v);
+                break;
+            case VAL_BOOLEAN:
+                writeInt((Boolean) v ? 1 : 0);
+                break;
+            case VAL_CHARSEQUENCE:
+                writeCharSequence((CharSequence) v);
+                break;
+            case VAL_LIST:
+                writeList((List) v);
+                break;
+            case VAL_SPARSEARRAY:
+                writeSparseArray((SparseArray) v);
+                break;
+            case VAL_BOOLEANARRAY:
+                writeBooleanArray((boolean[]) v);
+                break;
+            case VAL_BYTEARRAY:
+                writeByteArray((byte[]) v);
+                break;
+            case VAL_STRINGARRAY:
+                writeStringArray((String[]) v);
+                break;
+            case VAL_CHARSEQUENCEARRAY:
+                writeCharSequenceArray((CharSequence[]) v);
+                break;
+            case VAL_IBINDER:
+                writeStrongBinder((IBinder) v);
+                break;
+            case VAL_PARCELABLEARRAY:
+                writeParcelableArray((Parcelable[]) v, 0);
+                break;
+            case VAL_INTARRAY:
+                writeIntArray((int[]) v);
+                break;
+            case VAL_LONGARRAY:
+                writeLongArray((long[]) v);
+                break;
+            case VAL_BYTE:
+                writeInt((Byte) v);
+                break;
+            case VAL_SIZE:
+                writeSize((Size) v);
+                break;
+            case VAL_SIZEF:
+                writeSizeF((SizeF) v);
+                break;
+            case VAL_DOUBLEARRAY:
+                writeDoubleArray((double[]) v);
+                break;
+            case VAL_OBJECTARRAY:
+                writeArray((Object[]) v);
+                break;
+            case VAL_SERIALIZABLE:
+                writeSerializable((Serializable) v);
+                break;
+            default:
+                throw new RuntimeException("Parcel: unable to marshal value " + v);
+        }
+    }
 
     /**
      * Flatten the name of the class of the Parcelable and its contents
@@ -3167,7 +3327,180 @@
     @Nullable
     public final Object readValue(@Nullable ClassLoader loader) {
         int type = readInt();
+        final Object object;
+        if (isLengthPrefixed(type)) {
+            int length = readInt();
+            int start = dataPosition();
+            object = readValue(type, loader);
+            int actual = dataPosition() - start;
+            if (actual != length) {
+                Log.w(TAG,
+                        "Unparcelling of " + object + " of type " + Parcel.valueTypeToString(type)
+                                + "  consumed " + actual + " bytes, but " + length + " expected.");
+            }
+        } else {
+            object = readValue(type, loader);
+        }
+        return object;
+    }
 
+    /**
+     * This will return a {@link Supplier} for length-prefixed types that deserializes the object
+     * when {@link Supplier#get()} is called, for other types it will return the object itself.
+     *
+     * <p>After calling {@link Supplier#get()} the parcel cursor will not change. Note that you
+     * shouldn't recycle the parcel, not at least until all objects have been retrieved. No
+     * synchronization attempts are made.
+     *
+     * </p>The supplier returned implements {@link #equals(Object)} and {@link #hashCode()}. Two
+     * suppliers are equal if either of the following is true:
+     * <ul>
+     *   <li>{@link Supplier#get()} has been called on both and both objects returned are equal.
+     *   <li>{@link Supplier#get()} hasn't been called on either one and everything below is true:
+     *   <ul>
+     *       <li>The {@code loader} parameters used to retrieve each are equal.
+     *       <li>They both have the same type.
+     *       <li>They have the same payload length.
+     *       <li>Their binary content is the same.
+     *   </ul>
+     * </ul>
+     *
+     * @hide
+     */
+    @Nullable
+    public Object readLazyValue(@Nullable ClassLoader loader) {
+        int start = dataPosition();
+        int type = readInt();
+        if (isLengthPrefixed(type)) {
+            int length = readInt();
+            setDataPosition(MathUtils.addOrThrow(dataPosition(), length));
+            return new LazyValue(this, start, length, type, loader);
+        } else {
+            return readValue(type, loader);
+        }
+    }
+
+    private static final class LazyValue implements Supplier<Object> {
+        private final int mPosition;
+        private final int mLength;
+        private final int mType;
+        @Nullable private final ClassLoader mLoader;
+        @Nullable private Parcel mSource;
+        @Nullable private Object mObject;
+        @Nullable private Parcel mValueParcel;
+
+        LazyValue(Parcel source, int position, int length, int type, @Nullable ClassLoader loader) {
+            mSource = source;
+            mPosition = position;
+            mLength = length;
+            mType = type;
+            mLoader = loader;
+        }
+
+        @Override
+        public Object get() {
+            if (mObject == null) {
+                int restore = mSource.dataPosition();
+                try {
+                    mSource.setDataPosition(mPosition);
+                    mObject = mSource.readValue(mLoader);
+                } finally {
+                    mSource.setDataPosition(restore);
+                }
+                mSource = null;
+                if (mValueParcel != null) {
+                    mValueParcel.recycle();
+                    mValueParcel = null;
+                }
+            }
+            return mObject;
+        }
+
+        public void writeToParcel(Parcel out) {
+            if (mObject == null) {
+                int restore = mSource.dataPosition();
+                try {
+                    mSource.setDataPosition(mPosition);
+                    out.writeInt(mSource.readInt()); // Type
+                    out.writeInt(mSource.readInt()); // Length
+                    out.appendFrom(mSource, mSource.dataPosition(), mLength);
+                } finally {
+                    mSource.setDataPosition(restore);
+                }
+            } else {
+                out.writeValue(mObject);
+            }
+        }
+
+        public boolean hasFileDescriptors() {
+            return getValueParcel().hasFileDescriptors();
+        }
+
+        @Override
+        public String toString() {
+            return mObject == null
+                    ? "Supplier{" + valueTypeToString(mType) + "@" + mPosition + "+" + mLength + '}'
+                    : "Supplier{" + mObject + "}";
+        }
+
+        /**
+         * We're checking if the *lazy value* is equal to another one, not if the *object*
+         * represented by the lazy value is equal to the other one. So, if there are two lazy values
+         * and one of them has been deserialized but the other hasn't this will always return false.
+         */
+        @Override
+        public boolean equals(Object other) {
+            if (this == other) {
+                return true;
+            }
+            if (!(other instanceof LazyValue)) {
+                return false;
+            }
+            LazyValue value = (LazyValue) other;
+            // Check if they are either both serialized or both deserialized
+            if ((mObject == null) != (value.mObject == null)) {
+                return false;
+            }
+            // If both are deserialized, compare the live objects
+            if (mObject != null) {
+                return mObject.equals(value.mObject);
+            }
+            // Better safely fail here since this could mean we get different objects
+            if (!Objects.equals(mLoader, value.mLoader)) {
+                return false;
+            }
+            // Otherwise compare metadata prior to comparing payload
+            if (mType != value.mType || mLength != value.mLength) {
+                return false;
+            }
+            // Finally we compare the payload
+            return getValueParcel().compareData(value.getValueParcel()) == 0;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mObject, mLoader, mType, mLength);
+        }
+
+        /** This extracts the parcel section responsible for the object and returns it. */
+        private Parcel getValueParcel() {
+            if (mValueParcel == null) {
+                mValueParcel = Parcel.obtain();
+                // mLength is the length of object representation, excluding the type and length.
+                // mPosition is the position of the entire value container, right before the type.
+                // So, we add 4 bytes for the type + 4 bytes for the length written.
+                mValueParcel.appendFrom(mSource, mPosition, mLength + 8);
+            }
+            return mValueParcel;
+        }
+    }
+
+    /**
+     * Reads a value from the parcel of type {@code type}. Does NOT read the int representing the
+     * type first.
+     */
+    @Nullable
+    private Object readValue(int type, @Nullable ClassLoader loader) {
         switch (type) {
         case VAL_NULL:
             return null;
@@ -3266,6 +3599,20 @@
         }
     }
 
+    private boolean isLengthPrefixed(int type) {
+        switch (type) {
+            case VAL_PARCELABLE:
+            case VAL_PARCELABLEARRAY:
+            case VAL_LIST:
+            case VAL_SPARSEARRAY:
+            case VAL_BUNDLE:
+            case VAL_SERIALIZABLE:
+                return true;
+            default:
+                return false;
+        }
+    }
+
     /**
      * Read and return a new Parcelable from the parcel.  The given class loader
      * will be used to load any enclosed Parcelables.  If it is null, the default
@@ -3564,49 +3911,49 @@
         }
     }
 
-    /* package */ void readArrayMapInternal(@NonNull ArrayMap outVal, int N,
-            @Nullable ClassLoader loader) {
-        if (DEBUG_ARRAY_MAP) {
-            RuntimeException here =  new RuntimeException("here");
-            here.fillInStackTrace();
-            Log.d(TAG, "Reading " + N + " ArrayMap entries", here);
-        }
-        int startPos;
-        while (N > 0) {
-            if (DEBUG_ARRAY_MAP) startPos = dataPosition();
-            String key = readString();
-            Object value = readValue(loader);
-            if (DEBUG_ARRAY_MAP) Log.d(TAG, "  Read #" + (N-1) + " "
-                    + (dataPosition()-startPos) + " bytes: key=0x"
-                    + Integer.toHexString((key != null ? key.hashCode() : 0)) + " " + key);
-            outVal.append(key, value);
-            N--;
-        }
-        outVal.validate();
+    /* package */ void readArrayMapInternal(@NonNull ArrayMap<? super String, Object> outVal,
+            int size, @Nullable ClassLoader loader) {
+        readArrayMap(outVal, size, /* sorted */ true, /* lazy */ false, loader);
     }
 
-    /* package */ void readArrayMapSafelyInternal(@NonNull ArrayMap outVal, int N,
-            @Nullable ClassLoader loader) {
-        if (DEBUG_ARRAY_MAP) {
-            RuntimeException here =  new RuntimeException("here");
-            here.fillInStackTrace();
-            Log.d(TAG, "Reading safely " + N + " ArrayMap entries", here);
-        }
-        while (N > 0) {
+    /**
+     * Reads a map into {@code map}.
+     *
+     * @param sorted Whether the keys are sorted by their hashes, if so we use an optimized path.
+     * @param lazy   Whether to populate the map with lazy {@link Supplier} objects for
+     *               length-prefixed values. See {@link Parcel#readLazyValue(ClassLoader)} for more
+     *               details.
+     * @return whether the parcel can be recycled or not.
+     * @hide
+     */
+    boolean readArrayMap(ArrayMap<? super String, Object> map, int size, boolean sorted,
+            boolean lazy, @Nullable ClassLoader loader) {
+        boolean recycle = true;
+        while (size > 0) {
             String key = readString();
-            if (DEBUG_ARRAY_MAP) Log.d(TAG, "  Read safe #" + (N-1) + ": key=0x"
-                    + (key != null ? key.hashCode() : 0) + " " + key);
-            Object value = readValue(loader);
-            outVal.put(key, value);
-            N--;
+            Object value = (lazy) ? readLazyValue(loader) : readValue(loader);
+            if (value instanceof LazyValue) {
+                recycle = false;
+            }
+            if (sorted) {
+                map.append(key, value);
+            } else {
+                map.put(key, value);
+            }
+            size--;
         }
+        if (sorted) {
+            map.validate();
+        }
+        return recycle;
     }
 
     /**
      * @hide For testing only.
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public void readArrayMap(@NonNull ArrayMap outVal, @Nullable ClassLoader loader) {
+    public void readArrayMap(@NonNull ArrayMap<? super String, Object> outVal,
+            @Nullable ClassLoader loader) {
         final int N = readInt();
         if (N < 0) {
             return;
@@ -3691,4 +4038,38 @@
     public long getBlobAshmemSize() {
         return nativeGetBlobAshmemSize(mNativePtr);
     }
+
+    private static String valueTypeToString(int type) {
+        switch (type) {
+            case VAL_NULL: return "VAL_NULL";
+            case VAL_INTEGER: return "VAL_INTEGER";
+            case VAL_MAP: return "VAL_MAP";
+            case VAL_BUNDLE: return "VAL_BUNDLE";
+            case VAL_PERSISTABLEBUNDLE: return "VAL_PERSISTABLEBUNDLE";
+            case VAL_PARCELABLE: return "VAL_PARCELABLE";
+            case VAL_SHORT: return "VAL_SHORT";
+            case VAL_LONG: return "VAL_LONG";
+            case VAL_FLOAT: return "VAL_FLOAT";
+            case VAL_DOUBLE: return "VAL_DOUBLE";
+            case VAL_BOOLEAN: return "VAL_BOOLEAN";
+            case VAL_CHARSEQUENCE: return "VAL_CHARSEQUENCE";
+            case VAL_LIST: return "VAL_LIST";
+            case VAL_SPARSEARRAY: return "VAL_SPARSEARRAY";
+            case VAL_BOOLEANARRAY: return "VAL_BOOLEANARRAY";
+            case VAL_BYTEARRAY: return "VAL_BYTEARRAY";
+            case VAL_STRINGARRAY: return "VAL_STRINGARRAY";
+            case VAL_CHARSEQUENCEARRAY: return "VAL_CHARSEQUENCEARRAY";
+            case VAL_IBINDER: return "VAL_IBINDER";
+            case VAL_PARCELABLEARRAY: return "VAL_PARCELABLEARRAY";
+            case VAL_INTARRAY: return "VAL_INTARRAY";
+            case VAL_LONGARRAY: return "VAL_LONGARRAY";
+            case VAL_BYTE: return "VAL_BYTE";
+            case VAL_SIZE: return "VAL_SIZE";
+            case VAL_SIZEF: return "VAL_SIZEF";
+            case VAL_DOUBLEARRAY: return "VAL_DOUBLEARRAY";
+            case VAL_OBJECTARRAY: return "VAL_OBJECTARRAY";
+            case VAL_SERIALIZABLE: return "VAL_SERIALIZABLE";
+            default: return "UNKNOWN(" + type + ")";
+        }
+    }
 }
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java
index f853e67..06a2c87 100644
--- a/core/java/android/os/ServiceManager.java
+++ b/core/java/android/os/ServiceManager.java
@@ -17,6 +17,8 @@
 package android.os;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.util.ArrayMap;
 import android.util.Log;
@@ -28,6 +30,7 @@
 import java.util.Map;
 
 /** @hide */
+@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
 public final class ServiceManager {
     private static final String TAG = "ServiceManager";
     private static final Object sLock = new Object();
@@ -98,10 +101,12 @@
         int COUNT = GET_SERVICE + 1;
     }
 
+    /** @hide */
     public static final StatLogger sStatLogger = new StatLogger(new String[] {
             "getService()",
     });
 
+    /** @hide */
     @UnsupportedAppUsage
     public ServiceManager() {
     }
@@ -123,6 +128,7 @@
      *
      * @param name the name of the service to get
      * @return a reference to the service, or <code>null</code> if the service doesn't exist
+     * @hide
      */
     @UnsupportedAppUsage
     public static IBinder getService(String name) {
@@ -160,6 +166,7 @@
      *
      * @param name the name of the new service
      * @param service the service object
+     * @hide
      */
     @UnsupportedAppUsage
     public static void addService(String name, IBinder service) {
@@ -174,6 +181,7 @@
      * @param service the service object
      * @param allowIsolated set to true to allow isolated sandboxed processes
      * to access this service
+     * @hide
      */
     @UnsupportedAppUsage
     public static void addService(String name, IBinder service, boolean allowIsolated) {
@@ -189,6 +197,7 @@
      * @param allowIsolated set to true to allow isolated sandboxed processes
      * @param dumpPriority supported dump priority levels as a bitmask
      * to access this service
+     * @hide
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public static void addService(String name, IBinder service, boolean allowIsolated,
@@ -203,6 +212,7 @@
     /**
      * Retrieve an existing service called @a name from the
      * service manager.  Non-blocking.
+     * @hide
      */
     @UnsupportedAppUsage
     public static IBinder checkService(String name) {
@@ -239,6 +249,7 @@
      *
      * @return true if the service is declared somewhere (eg. VINTF manifest) and
      * waitForService should always be able to return the service.
+     * @hide
      */
     public static String[] getDeclaredInstances(@NonNull String iface) {
         try {
@@ -256,8 +267,13 @@
      * will wait for it to be ready.
      *
      * @return {@code null} only if there are permission problems or fatal errors.
+     * @hide
      */
-    public static native IBinder waitForService(@NonNull String name);
+    public static IBinder waitForService(@NonNull String name) {
+        return Binder.allowBlocking(waitForServiceNative(name));
+    }
+
+    private static native IBinder waitForServiceNative(@NonNull String name);
 
     /**
      * Returns the specified service from the service manager, if declared.
@@ -267,8 +283,10 @@
      *
      * @return {@code null} if the service is not declared in the manifest, or if there are
      * permission problems, or if there are fatal errors.
+     * @hide
      */
-    public static IBinder waitForDeclaredService(@NonNull String name) {
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    @Nullable public static IBinder waitForDeclaredService(@NonNull String name) {
         return isDeclared(name) ? waitForService(name) : null;
     }
 
@@ -276,6 +294,7 @@
      * Return a list of all currently running services.
      * @return an array of all currently running services, or <code>null</code> in
      * case of an exception
+     * @hide
      */
     @UnsupportedAppUsage
     public static String[] listServices() {
diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java
index 136e3de..46eb2ec 100644
--- a/core/java/android/os/SharedMemory.java
+++ b/core/java/android/os/SharedMemory.java
@@ -93,6 +93,26 @@
         }
     }
 
+    /**
+     * Creates an instance from existing shared memory passed as {@link ParcelFileDescriptor}.
+     *
+     * <p> The {@code fd} should be a shared memory created from
+       {@code SharedMemory or ASharedMemory}. This can be useful when shared memory is passed as
+       file descriptor through JNI or binder service implemented in cpp.
+     * <p> Note that newly created {@code SharedMemory} takes ownership of passed {@code fd} and
+     * the original {@code fd} becomes detached (Check {@link ParcelFileDescriptor#detachFd()}).
+     * If the caller wants to use the file descriptor after the call, the caller should duplicate
+     * the file descriptor (Check {@link ParcelFileDescriptor#dup()}) and pass the duped version
+     * instead.
+     *
+     * @param fd File descriptor of shared memory passed as {@link ParcelFileDescriptor}.
+     */
+    public static @NonNull SharedMemory fromFileDescriptor(@NonNull ParcelFileDescriptor fd) {
+        FileDescriptor f = new FileDescriptor();
+        f.setInt$(fd.detachFd());
+        return new SharedMemory(f);
+    }
+
     private static final int PROT_MASK = OsConstants.PROT_READ | OsConstants.PROT_WRITE
             | OsConstants.PROT_EXEC | OsConstants.PROT_NONE;
 
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index bd84c84..c89f4f5 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -201,6 +201,14 @@
             "intelligence_content_suggestions";
 
     /**
+     * Namespace for all lmkd related features.
+     *
+     * @hide
+     */
+    @SystemApi
+    public static final String NAMESPACE_LMKD_NATIVE = "lmkd_native";
+
+    /**
      * Namespace for all media native related features.
      *
      * @hide
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 0e02af2..cd52db4 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -33,13 +33,11 @@
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import android.os.ServiceSpecificException;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.Trace;
 import android.os.UserHandle;
 import android.os.ZygoteProcess;
-import android.os.storage.StorageManager;
 import android.provider.DeviceConfig;
 import android.security.keystore2.AndroidKeyStoreProvider;
 import android.system.ErrnoException;
@@ -58,7 +56,6 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.Preconditions;
 
-import dalvik.system.DexFile;
 import dalvik.system.VMRuntime;
 import dalvik.system.ZygoteHooks;
 
@@ -517,7 +514,6 @@
 
         final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
         if (systemServerClasspath != null) {
-            performSystemServerDexOpt(systemServerClasspath);
             // Capturing profiles is only supported for debug or eng builds since selinux normally
             // prevents it.
             if (shouldProfileSystemServer() && (Build.IS_USERDEBUG || Build.IS_ENG)) {
@@ -659,95 +655,6 @@
     }
 
     /**
-     * Performs dex-opt on the elements of {@code classPath}, if needed. We choose the instruction
-     * set of the current runtime.
-     */
-    private static void performSystemServerDexOpt(String classPath) {
-        final String[] classPathElements = classPath.split(":");
-        final String instructionSet = VMRuntime.getRuntime().vmInstructionSet();
-
-        String classPathForElement = "";
-        for (String classPathElement : classPathElements) {
-            // We default to the verify filter because the compilation will happen on /data and
-            // system server cannot load executable code outside /system.
-            String systemServerFilter = SystemProperties.get(
-                    "dalvik.vm.systemservercompilerfilter", "verify");
-
-            String classLoaderContext =
-                        getSystemServerClassLoaderContext(classPathForElement);
-            int dexoptNeeded;
-            try {
-                dexoptNeeded = DexFile.getDexOptNeeded(
-                        classPathElement, instructionSet, systemServerFilter,
-                        classLoaderContext, false /* newProfile */, false /* downgrade */);
-            } catch (FileNotFoundException ignored) {
-                // Do not add to the classpath.
-                Log.w(TAG, "Missing classpath element for system server: " + classPathElement);
-                continue;
-            } catch (IOException e) {
-                // Not fully clear what to do here as we don't know the cause of the
-                // IO exception. Add to the classpath to be conservative, but don't
-                // attempt to compile it.
-                Log.w(TAG, "Error checking classpath element for system server: "
-                        + classPathElement, e);
-                dexoptNeeded = DexFile.NO_DEXOPT_NEEDED;
-            }
-
-            if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
-                final String packageName = "*";
-                final String outputPath = null;
-                final int dexFlags = 0;
-                final String uuid = StorageManager.UUID_PRIVATE_INTERNAL;
-                final String seInfo = null;
-                final int targetSdkVersion = 0;  // SystemServer targets the system's SDK version
-                // Wait for installd to be made available
-                IInstalld installd = IInstalld.Stub.asInterface(
-                        ServiceManager.waitForService("installd"));
-
-                try {
-                    installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName,
-                            instructionSet, dexoptNeeded, outputPath, dexFlags, systemServerFilter,
-                            uuid, classLoaderContext, seInfo, false /* downgrade */,
-                            targetSdkVersion, /*profileName*/ null, /*dexMetadataPath*/ null,
-                            "server-dexopt");
-                } catch (RemoteException | ServiceSpecificException e) {
-                    // Ignore (but log), we need this on the classpath for fallback mode.
-                    Log.w(TAG, "Failed compiling classpath element for system server: "
-                            + classPathElement, e);
-                }
-            }
-
-            classPathForElement = encodeSystemServerClassPath(
-                    classPathForElement, classPathElement);
-        }
-    }
-
-    /**
-     * Encodes the system server class loader context in a format that is accepted by dexopt. This
-     * assumes the system server is always loaded with a {@link dalvik.system.PathClassLoader}.
-     *
-     * Note that ideally we would use the {@code DexoptUtils} to compute this. However we have no
-     * dependency here on the server so we hard code the logic again.
-     */
-    private static String getSystemServerClassLoaderContext(String classPath) {
-        return classPath == null ? "PCL[]" : "PCL[" + classPath + "]";
-    }
-
-    /**
-     * Encodes the class path in a format accepted by dexopt.
-     *
-     * @param classPath  The old class path (may be empty).
-     * @param newElement  The new class path elements
-     * @return The class path encoding resulted from appending {@code newElement} to {@code
-     * classPath}.
-     */
-    private static String encodeSystemServerClassPath(String classPath, String newElement) {
-        return (classPath == null || classPath.isEmpty())
-                ? newElement
-                : classPath + ":" + newElement;
-    }
-
-    /**
      * Prepare the arguments and forks for the system server process.
      *
      * @return A {@code Runnable} that provides an entrypoint into system_server code in the child
diff --git a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
index b90722c..09bb327 100644
--- a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
+++ b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
@@ -62,6 +62,7 @@
     void onActiveDataSubIdChanged(in int subId);
     void onRadioPowerStateChanged(in int state);
     void onCallAttributesChanged(in CallAttributes callAttributes);
+    @SuppressWarnings(value={"untyped-collection"})
     void onEmergencyNumberListChanged(in Map emergencyNumberList);
     void onOutgoingEmergencyCall(in EmergencyNumber placedEmergencyNumber, int subscriptionId);
     void onOutgoingEmergencySms(in EmergencyNumber sentEmergencyNumber, int subscriptionId);
diff --git a/core/java/com/android/internal/util/OWNERS b/core/java/com/android/internal/util/OWNERS
index 5b68159..100a605d 100644
--- a/core/java/com/android/internal/util/OWNERS
+++ b/core/java/com/android/internal/util/OWNERS
@@ -1,6 +1,7 @@
 per-file AsyncChannel* = lorenzo@google.com, satk@google.com, etancohen@google.com
 per-file MessageUtils*, Protocol*, RingBuffer*, TokenBucket* = jchalard@google.com, lorenzo@google.com, satk@google.com
 per-file *Notification* = file:/services/core/java/com/android/server/notification/OWNERS
+per-file *ContrastColor* = file:/services/core/java/com/android/server/notification/OWNERS
 per-file Protocol* = etancohen@google.com, lorenzo@google.com
 per-file State* = jchalard@google.com, lorenzo@google.com, satk@google.com
 per-file DataClass* = eugenesusla@google.com
\ No newline at end of file
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index 59e95c9..1132422 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -546,13 +546,14 @@
         if (!isSystemProcess()) {
             return;
         }
-        // Read configuration of libs from apex module.
+        // Read configuration of features and libs from apex module.
+        int apexPermissionFlag = ALLOW_LIBS | ALLOW_FEATURES;
         // TODO: Use a solid way to filter apex module folders?
         for (File f: FileUtils.listFilesOrEmpty(Environment.getApexDirectory())) {
             if (f.isFile() || f.getPath().contains("@")) {
                 continue;
             }
-            readPermissions(Environment.buildPath(f, "etc", "permissions"), ALLOW_LIBS);
+            readPermissions(Environment.buildPath(f, "etc", "permissions"), apexPermissionFlag);
         }
     }
 
diff --git a/core/jni/android_os_ServiceManager.cpp b/core/jni/android_os_ServiceManager.cpp
index c747949..d642d0e 100644
--- a/core/jni/android_os_ServiceManager.cpp
+++ b/core/jni/android_os_ServiceManager.cpp
@@ -29,11 +29,8 @@
 
 // Native because we have a client-side wait in waitForService() and we do not
 // want an unnecessary second copy of it.
-static jobject android_os_ServiceManager_waitForService(
-        JNIEnv *env,
-        jclass /* clazzObj */,
-        jstring serviceNameObj) {
-
+static jobject android_os_ServiceManager_waitForServiceNative(JNIEnv* env, jclass /* clazzObj */,
+                                                              jstring serviceNameObj) {
     const jchar* serviceName = env->GetStringCritical(serviceNameObj, nullptr);
     if (!serviceName) {
         jniThrowNullPointerException(env, nullptr);
@@ -55,12 +52,9 @@
 // ----------------------------------------------------------------------------
 
 static const JNINativeMethod method_table[] = {
-     /* name, signature, funcPtr */
-    {
-        "waitForService",
-        "(Ljava/lang/String;)Landroid/os/IBinder;",
-        (void*)android_os_ServiceManager_waitForService
-    },
+        /* name, signature, funcPtr */
+        {"waitForServiceNative", "(Ljava/lang/String;)Landroid/os/IBinder;",
+         (void*)android_os_ServiceManager_waitForServiceNative},
 };
 
 int register_android_os_ServiceManager(JNIEnv* env) {
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index 6374305..ff9e27f 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -263,8 +263,12 @@
         sprintf(proc_path, "/proc/%d/cmdline", pid);
         fd = open(proc_path, O_RDONLY | O_CLOEXEC);
         if (fd >= 0) {
-            int rc = read(fd, cmdline, sizeof(cmdline)-1);
-            cmdline[rc] = 0;
+            ssize_t rc = read(fd, cmdline, sizeof(cmdline) - 1);
+            if (rc < 0) {
+                ALOGE("read /proc/%d/cmdline (%s)", pid, strerror(errno));
+            } else {
+                cmdline[rc] = 0;
+            }
             close(fd);
         }
 
diff --git a/core/jni/com_android_internal_content_om_OverlayConfig.cpp b/core/jni/com_android_internal_content_om_OverlayConfig.cpp
index 6aa7c10..b37269c 100644
--- a/core/jni/com_android_internal_content_om_OverlayConfig.cpp
+++ b/core/jni/com_android_internal_content_om_OverlayConfig.cpp
@@ -73,13 +73,13 @@
   }
 
   if (result->status != 0) {
-    LOG(ERROR) << "idmap2: " << result->stderr;
-    return nullptr;
+      LOG(ERROR) << "idmap2: " << result->stderr_str;
+      return nullptr;
   }
 
   // Return the paths of the idmaps created or updated during the idmap invocation.
   std::vector<std::string> idmap_paths;
-  std::istringstream input(result->stdout);
+  std::istringstream input(result->stdout_str);
   std::string path;
   while (std::getline(input, path)) {
     idmap_paths.push_back(path);
diff --git a/core/tests/coretests/src/com/android/internal/util/OWNERS b/core/tests/coretests/src/com/android/internal/util/OWNERS
new file mode 100644
index 0000000..d832745
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/util/OWNERS
@@ -0,0 +1,2 @@
+per-file *Notification* = file:/services/core/java/com/android/server/notification/OWNERS
+per-file *ContrastColor* = file:/services/core/java/com/android/server/notification/OWNERS
\ No newline at end of file
diff --git a/keystore/java/android/security/GenerateRkpKey.java b/keystore/java/android/security/GenerateRkpKey.java
index 053bec74..2e54e63 100644
--- a/keystore/java/android/security/GenerateRkpKey.java
+++ b/keystore/java/android/security/GenerateRkpKey.java
@@ -25,6 +25,8 @@
 import android.util.Log;
 
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -88,7 +90,8 @@
         }
         intent.setComponent(comp);
         mCountDownLatch = new CountDownLatch(1);
-        if (!mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE)) {
+        Executor executor = Executors.newCachedThreadPool();
+        if (!mContext.bindService(intent, Context.BIND_AUTO_CREATE, executor, mConnection)) {
             throw new RemoteException("Failed to bind to GenerateRkpKeyService");
         }
         try {
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKey.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKey.java
index 5619585..b24a22d 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKey.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKey.java
@@ -102,11 +102,9 @@
         final int prime = 31;
         int result = 1;
 
-        result = prime * result + ((mDescriptor == null) ? 0 : mDescriptor.hashCode());
+        result = prime * result + getClass().hashCode();
         result = prime * result + (int) (mKeyId >>> 32);
         result = prime * result + (int) (mKeyId & 0xffffffff);
-        result = prime * result + ((mAuthorizations == null) ? 0 : mAuthorizations.hashCode());
-        result = prime * result + ((mAlgorithm == null) ? 0 : mAlgorithm.hashCode());
         return result;
     }
 
@@ -122,10 +120,6 @@
             return false;
         }
         AndroidKeyStoreKey other = (AndroidKeyStoreKey) obj;
-        if (mKeyId != other.mKeyId) {
-            return false;
-        }
-
-        return true;
+        return mKeyId == other.mKeyId;
     }
 }
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStorePublicKey.java b/keystore/java/android/security/keystore2/AndroidKeyStorePublicKey.java
index db3e567..4842984 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStorePublicKey.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStorePublicKey.java
@@ -23,6 +23,7 @@
 import android.system.keystore2.KeyMetadata;
 
 import java.security.PublicKey;
+import java.util.Objects;
 
 /**
  * {@link PublicKey} backed by Android Keystore.
@@ -75,9 +76,14 @@
         if (!super.equals(obj)) {
             return false;
         }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        return true;
+
+        /*
+         * getClass().equals(ojb.getClass()) is implied by the call to super.equals() above. This
+         * means we can cast obj to AndroidKeyStorePublicKey here.
+         */
+        final AndroidKeyStorePublicKey other = (AndroidKeyStorePublicKey) obj;
+
+        return Objects.equals(mCertificate, other.mCertificate) && Objects.equals(mCertificateChain,
+                other.mCertificateChain);
     }
 }
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
index f3cfcf1..67358c4 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
@@ -579,7 +579,7 @@
         //
         // Note: mNamespace == KeyProperties.NAMESPACE_APPLICATION implies that the target domain
         // is Domain.APP and Domain.SELINUX is the target domain otherwise.
-        if (alias != descriptor.alias
+        if (!alias.equals(descriptor.alias)
                 || descriptor.domain != targetDomain
                 || (descriptor.domain == Domain.SELINUX && descriptor.nspace != targetNamespace)) {
             throw new KeyStoreException("Can only replace keys with same alias: " + alias
diff --git a/libs/androidfw/LocaleDataTables.cpp b/libs/androidfw/LocaleDataTables.cpp
index 8a10599..2c3567a 100644
--- a/libs/androidfw/LocaleDataTables.cpp
+++ b/libs/androidfw/LocaleDataTables.cpp
@@ -1,37 +1,37 @@
 // Auto-generated by ./tools/localedata/extract_icu_data.py
 
 const char SCRIPT_CODES[][4] = {
-    /* 0  */ {'A', 'h', 'o', 'm'},
-    /* 1  */ {'A', 'r', 'a', 'b'},
-    /* 2  */ {'A', 'r', 'm', 'i'},
-    /* 3  */ {'A', 'r', 'm', 'n'},
-    /* 4  */ {'A', 'v', 's', 't'},
-    /* 5  */ {'B', 'a', 'm', 'u'},
-    /* 6  */ {'B', 'a', 's', 's'},
-    /* 7  */ {'B', 'e', 'n', 'g'},
-    /* 8  */ {'B', 'r', 'a', 'h'},
-    /* 9  */ {'C', 'a', 'k', 'm'},
-    /* 10 */ {'C', 'a', 'n', 's'},
-    /* 11 */ {'C', 'a', 'r', 'i'},
-    /* 12 */ {'C', 'h', 'a', 'm'},
-    /* 13 */ {'C', 'h', 'e', 'r'},
-    /* 14 */ {'C', 'h', 'r', 's'},
-    /* 15 */ {'C', 'o', 'p', 't'},
-    /* 16 */ {'C', 'p', 'r', 't'},
-    /* 17 */ {'C', 'y', 'r', 'l'},
-    /* 18 */ {'D', 'e', 'v', 'a'},
-    /* 19 */ {'E', 'g', 'y', 'p'},
-    /* 20 */ {'E', 't', 'h', 'i'},
-    /* 21 */ {'G', 'e', 'o', 'r'},
-    /* 22 */ {'G', 'o', 'n', 'g'},
-    /* 23 */ {'G', 'o', 'n', 'm'},
-    /* 24 */ {'G', 'o', 't', 'h'},
-    /* 25 */ {'G', 'r', 'e', 'k'},
-    /* 26 */ {'G', 'u', 'j', 'r'},
-    /* 27 */ {'G', 'u', 'r', 'u'},
-    /* 28 */ {'H', 'a', 'n', 's'},
-    /* 29 */ {'H', 'a', 'n', 't'},
-    /* 30 */ {'H', 'a', 't', 'r'},
+    /* 0  */ {'A', 'g', 'h', 'b'},
+    /* 1  */ {'A', 'h', 'o', 'm'},
+    /* 2  */ {'A', 'r', 'a', 'b'},
+    /* 3  */ {'A', 'r', 'm', 'i'},
+    /* 4  */ {'A', 'r', 'm', 'n'},
+    /* 5  */ {'A', 'v', 's', 't'},
+    /* 6  */ {'B', 'a', 'm', 'u'},
+    /* 7  */ {'B', 'a', 's', 's'},
+    /* 8  */ {'B', 'e', 'n', 'g'},
+    /* 9  */ {'B', 'r', 'a', 'h'},
+    /* 10 */ {'C', 'a', 'k', 'm'},
+    /* 11 */ {'C', 'a', 'n', 's'},
+    /* 12 */ {'C', 'a', 'r', 'i'},
+    /* 13 */ {'C', 'h', 'a', 'm'},
+    /* 14 */ {'C', 'h', 'e', 'r'},
+    /* 15 */ {'C', 'h', 'r', 's'},
+    /* 16 */ {'C', 'o', 'p', 't'},
+    /* 17 */ {'C', 'p', 'r', 't'},
+    /* 18 */ {'C', 'y', 'r', 'l'},
+    /* 19 */ {'D', 'e', 'v', 'a'},
+    /* 20 */ {'E', 'g', 'y', 'p'},
+    /* 21 */ {'E', 't', 'h', 'i'},
+    /* 22 */ {'G', 'e', 'o', 'r'},
+    /* 23 */ {'G', 'o', 'n', 'g'},
+    /* 24 */ {'G', 'o', 'n', 'm'},
+    /* 25 */ {'G', 'o', 't', 'h'},
+    /* 26 */ {'G', 'r', 'e', 'k'},
+    /* 27 */ {'G', 'u', 'j', 'r'},
+    /* 28 */ {'G', 'u', 'r', 'u'},
+    /* 29 */ {'H', 'a', 'n', 's'},
+    /* 30 */ {'H', 'a', 'n', 't'},
     /* 31 */ {'H', 'e', 'b', 'r'},
     /* 32 */ {'H', 'l', 'u', 'w'},
     /* 33 */ {'H', 'm', 'n', 'g'},
@@ -55,52 +55,53 @@
     /* 51 */ {'L', 'y', 'd', 'i'},
     /* 52 */ {'M', 'a', 'n', 'd'},
     /* 53 */ {'M', 'a', 'n', 'i'},
-    /* 54 */ {'M', 'e', 'r', 'c'},
-    /* 55 */ {'M', 'l', 'y', 'm'},
-    /* 56 */ {'M', 'o', 'n', 'g'},
-    /* 57 */ {'M', 'r', 'o', 'o'},
-    /* 58 */ {'M', 'y', 'm', 'r'},
-    /* 59 */ {'N', 'a', 'r', 'b'},
-    /* 60 */ {'N', 'k', 'o', 'o'},
-    /* 61 */ {'N', 's', 'h', 'u'},
-    /* 62 */ {'O', 'g', 'a', 'm'},
-    /* 63 */ {'O', 'l', 'c', 'k'},
-    /* 64 */ {'O', 'r', 'k', 'h'},
-    /* 65 */ {'O', 'r', 'y', 'a'},
-    /* 66 */ {'O', 's', 'g', 'e'},
-    /* 67 */ {'P', 'a', 'u', 'c'},
-    /* 68 */ {'P', 'h', 'l', 'i'},
-    /* 69 */ {'P', 'h', 'n', 'x'},
-    /* 70 */ {'P', 'l', 'r', 'd'},
-    /* 71 */ {'P', 'r', 't', 'i'},
-    /* 72 */ {'R', 'u', 'n', 'r'},
-    /* 73 */ {'S', 'a', 'm', 'r'},
-    /* 74 */ {'S', 'a', 'r', 'b'},
-    /* 75 */ {'S', 'a', 'u', 'r'},
-    /* 76 */ {'S', 'g', 'n', 'w'},
-    /* 77 */ {'S', 'i', 'n', 'h'},
-    /* 78 */ {'S', 'o', 'g', 'd'},
-    /* 79 */ {'S', 'o', 'r', 'a'},
-    /* 80 */ {'S', 'o', 'y', 'o'},
-    /* 81 */ {'S', 'y', 'r', 'c'},
-    /* 82 */ {'T', 'a', 'l', 'e'},
-    /* 83 */ {'T', 'a', 'l', 'u'},
-    /* 84 */ {'T', 'a', 'm', 'l'},
-    /* 85 */ {'T', 'a', 'n', 'g'},
-    /* 86 */ {'T', 'a', 'v', 't'},
-    /* 87 */ {'T', 'e', 'l', 'u'},
-    /* 88 */ {'T', 'f', 'n', 'g'},
-    /* 89 */ {'T', 'h', 'a', 'a'},
-    /* 90 */ {'T', 'h', 'a', 'i'},
-    /* 91 */ {'T', 'i', 'b', 't'},
-    /* 92 */ {'U', 'g', 'a', 'r'},
-    /* 93 */ {'V', 'a', 'i', 'i'},
-    /* 94 */ {'W', 'c', 'h', 'o'},
-    /* 95 */ {'X', 'p', 'e', 'o'},
-    /* 96 */ {'X', 's', 'u', 'x'},
-    /* 97 */ {'Y', 'i', 'i', 'i'},
-    /* 98 */ {'~', '~', '~', 'A'},
-    /* 99 */ {'~', '~', '~', 'B'},
+    /* 54 */ {'M', 'e', 'd', 'f'},
+    /* 55 */ {'M', 'e', 'r', 'c'},
+    /* 56 */ {'M', 'l', 'y', 'm'},
+    /* 57 */ {'M', 'o', 'n', 'g'},
+    /* 58 */ {'M', 'r', 'o', 'o'},
+    /* 59 */ {'M', 'y', 'm', 'r'},
+    /* 60 */ {'N', 'a', 'r', 'b'},
+    /* 61 */ {'N', 'k', 'o', 'o'},
+    /* 62 */ {'N', 's', 'h', 'u'},
+    /* 63 */ {'O', 'g', 'a', 'm'},
+    /* 64 */ {'O', 'l', 'c', 'k'},
+    /* 65 */ {'O', 'r', 'k', 'h'},
+    /* 66 */ {'O', 'r', 'y', 'a'},
+    /* 67 */ {'O', 's', 'g', 'e'},
+    /* 68 */ {'P', 'a', 'u', 'c'},
+    /* 69 */ {'P', 'h', 'l', 'i'},
+    /* 70 */ {'P', 'h', 'n', 'x'},
+    /* 71 */ {'P', 'l', 'r', 'd'},
+    /* 72 */ {'P', 'r', 't', 'i'},
+    /* 73 */ {'R', 'u', 'n', 'r'},
+    /* 74 */ {'S', 'a', 'm', 'r'},
+    /* 75 */ {'S', 'a', 'r', 'b'},
+    /* 76 */ {'S', 'a', 'u', 'r'},
+    /* 77 */ {'S', 'g', 'n', 'w'},
+    /* 78 */ {'S', 'i', 'n', 'h'},
+    /* 79 */ {'S', 'o', 'g', 'd'},
+    /* 80 */ {'S', 'o', 'r', 'a'},
+    /* 81 */ {'S', 'o', 'y', 'o'},
+    /* 82 */ {'S', 'y', 'r', 'c'},
+    /* 83 */ {'T', 'a', 'l', 'e'},
+    /* 84 */ {'T', 'a', 'l', 'u'},
+    /* 85 */ {'T', 'a', 'm', 'l'},
+    /* 86 */ {'T', 'a', 'n', 'g'},
+    /* 87 */ {'T', 'a', 'v', 't'},
+    /* 88 */ {'T', 'e', 'l', 'u'},
+    /* 89 */ {'T', 'f', 'n', 'g'},
+    /* 90 */ {'T', 'h', 'a', 'a'},
+    /* 91 */ {'T', 'h', 'a', 'i'},
+    /* 92 */ {'T', 'i', 'b', 't'},
+    /* 93 */ {'U', 'g', 'a', 'r'},
+    /* 94 */ {'V', 'a', 'i', 'i'},
+    /* 95 */ {'W', 'c', 'h', 'o'},
+    /* 96 */ {'X', 'p', 'e', 'o'},
+    /* 97 */ {'X', 's', 'u', 'x'},
+    /* 98 */ {'Y', 'i', 'i', 'i'},
+    /* 99 */ {'~', '~', '~', 'A'},
+    /* 100 */ {'~', '~', '~', 'B'},
 };
 
 
@@ -109,9 +110,9 @@
     {0xA0000000u, 46u}, // aai -> Latn
     {0xA8000000u, 46u}, // aak -> Latn
     {0xD0000000u, 46u}, // aau -> Latn
-    {0x61620000u, 17u}, // ab -> Cyrl
+    {0x61620000u, 18u}, // ab -> Cyrl
     {0xA0200000u, 46u}, // abi -> Latn
-    {0xC0200000u, 17u}, // abq -> Cyrl
+    {0xC0200000u, 18u}, // abq -> Cyrl
     {0xC4200000u, 46u}, // abr -> Latn
     {0xCC200000u, 46u}, // abt -> Latn
     {0xE0200000u, 46u}, // aby -> Latn
@@ -121,11 +122,11 @@
     {0x80600000u, 46u}, // ada -> Latn
     {0x90600000u, 46u}, // ade -> Latn
     {0xA4600000u, 46u}, // adj -> Latn
-    {0xBC600000u, 91u}, // adp -> Tibt
-    {0xE0600000u, 17u}, // ady -> Cyrl
+    {0xBC600000u, 92u}, // adp -> Tibt
+    {0xE0600000u, 18u}, // ady -> Cyrl
     {0xE4600000u, 46u}, // adz -> Latn
-    {0x61650000u,  4u}, // ae -> Avst
-    {0x84800000u,  1u}, // aeb -> Arab
+    {0x61650000u,  5u}, // ae -> Avst
+    {0x84800000u,  2u}, // aeb -> Arab
     {0xE0800000u, 46u}, // aey -> Latn
     {0x61660000u, 46u}, // af -> Latn
     {0x88C00000u, 46u}, // agc -> Latn
@@ -136,15 +137,15 @@
     {0xC0C00000u, 46u}, // agq -> Latn
     {0x80E00000u, 46u}, // aha -> Latn
     {0xACE00000u, 46u}, // ahl -> Latn
-    {0xB8E00000u,  0u}, // aho -> Ahom
+    {0xB8E00000u,  1u}, // aho -> Ahom
     {0x99200000u, 46u}, // ajg -> Latn
     {0x616B0000u, 46u}, // ak -> Latn
-    {0xA9400000u, 96u}, // akk -> Xsux
+    {0xA9400000u, 97u}, // akk -> Xsux
     {0x81600000u, 46u}, // ala -> Latn
     {0xA1600000u, 46u}, // ali -> Latn
     {0xB5600000u, 46u}, // aln -> Latn
-    {0xCD600000u, 17u}, // alt -> Cyrl
-    {0x616D0000u, 20u}, // am -> Ethi
+    {0xCD600000u, 18u}, // alt -> Cyrl
+    {0x616D0000u, 21u}, // am -> Ethi
     {0xB1800000u, 46u}, // amm -> Latn
     {0xB5800000u, 46u}, // amn -> Latn
     {0xB9800000u, 46u}, // amo -> Latn
@@ -157,25 +158,25 @@
     {0xA5C00000u, 46u}, // aoj -> Latn
     {0xB1C00000u, 46u}, // aom -> Latn
     {0xE5C00000u, 46u}, // aoz -> Latn
-    {0x89E00000u,  1u}, // apc -> Arab
-    {0x8DE00000u,  1u}, // apd -> Arab
+    {0x89E00000u,  2u}, // apc -> Arab
+    {0x8DE00000u,  2u}, // apd -> Arab
     {0x91E00000u, 46u}, // ape -> Latn
     {0xC5E00000u, 46u}, // apr -> Latn
     {0xC9E00000u, 46u}, // aps -> Latn
     {0xE5E00000u, 46u}, // apz -> Latn
-    {0x61720000u,  1u}, // ar -> Arab
-    {0x61725842u, 99u}, // ar-XB -> ~~~B
-    {0x8A200000u,  2u}, // arc -> Armi
+    {0x61720000u,  2u}, // ar -> Arab
+    {0x61725842u, 100u}, // ar-XB -> ~~~B
+    {0x8A200000u,  3u}, // arc -> Armi
     {0x9E200000u, 46u}, // arh -> Latn
     {0xB6200000u, 46u}, // arn -> Latn
     {0xBA200000u, 46u}, // aro -> Latn
-    {0xC2200000u,  1u}, // arq -> Arab
-    {0xCA200000u,  1u}, // ars -> Arab
-    {0xE2200000u,  1u}, // ary -> Arab
-    {0xE6200000u,  1u}, // arz -> Arab
-    {0x61730000u,  7u}, // as -> Beng
+    {0xC2200000u,  2u}, // arq -> Arab
+    {0xCA200000u,  2u}, // ars -> Arab
+    {0xE2200000u,  2u}, // ary -> Arab
+    {0xE6200000u,  2u}, // arz -> Arab
+    {0x61730000u,  8u}, // as -> Beng
     {0x82400000u, 46u}, // asa -> Latn
-    {0x92400000u, 76u}, // ase -> Sgnw
+    {0x92400000u, 77u}, // ase -> Sgnw
     {0x9A400000u, 46u}, // asg -> Latn
     {0xBA400000u, 46u}, // aso -> Latn
     {0xCE400000u, 46u}, // ast -> Latn
@@ -183,29 +184,29 @@
     {0x9A600000u, 46u}, // atg -> Latn
     {0xA6600000u, 46u}, // atj -> Latn
     {0xE2800000u, 46u}, // auy -> Latn
-    {0x61760000u, 17u}, // av -> Cyrl
-    {0xAEA00000u,  1u}, // avl -> Arab
+    {0x61760000u, 18u}, // av -> Cyrl
+    {0xAEA00000u,  2u}, // avl -> Arab
     {0xB6A00000u, 46u}, // avn -> Latn
     {0xCEA00000u, 46u}, // avt -> Latn
     {0xD2A00000u, 46u}, // avu -> Latn
-    {0x82C00000u, 18u}, // awa -> Deva
+    {0x82C00000u, 19u}, // awa -> Deva
     {0x86C00000u, 46u}, // awb -> Latn
     {0xBAC00000u, 46u}, // awo -> Latn
     {0xDEC00000u, 46u}, // awx -> Latn
     {0x61790000u, 46u}, // ay -> Latn
     {0x87000000u, 46u}, // ayb -> Latn
     {0x617A0000u, 46u}, // az -> Latn
-    {0x617A4951u,  1u}, // az-IQ -> Arab
-    {0x617A4952u,  1u}, // az-IR -> Arab
-    {0x617A5255u, 17u}, // az-RU -> Cyrl
-    {0x62610000u, 17u}, // ba -> Cyrl
-    {0xAC010000u,  1u}, // bal -> Arab
+    {0x617A4951u,  2u}, // az-IQ -> Arab
+    {0x617A4952u,  2u}, // az-IR -> Arab
+    {0x617A5255u, 18u}, // az-RU -> Cyrl
+    {0x62610000u, 18u}, // ba -> Cyrl
+    {0xAC010000u,  2u}, // bal -> Arab
     {0xB4010000u, 46u}, // ban -> Latn
-    {0xBC010000u, 18u}, // bap -> Deva
+    {0xBC010000u, 19u}, // bap -> Deva
     {0xC4010000u, 46u}, // bar -> Latn
     {0xC8010000u, 46u}, // bas -> Latn
     {0xD4010000u, 46u}, // bav -> Latn
-    {0xDC010000u,  5u}, // bax -> Bamu
+    {0xDC010000u,  6u}, // bax -> Bamu
     {0x80210000u, 46u}, // bba -> Latn
     {0x84210000u, 46u}, // bbb -> Latn
     {0x88210000u, 46u}, // bbc -> Latn
@@ -219,31 +220,31 @@
     {0xB0410000u, 46u}, // bcm -> Latn
     {0xB4410000u, 46u}, // bcn -> Latn
     {0xB8410000u, 46u}, // bco -> Latn
-    {0xC0410000u, 20u}, // bcq -> Ethi
+    {0xC0410000u, 21u}, // bcq -> Ethi
     {0xD0410000u, 46u}, // bcu -> Latn
     {0x8C610000u, 46u}, // bdd -> Latn
-    {0x62650000u, 17u}, // be -> Cyrl
+    {0x62650000u, 18u}, // be -> Cyrl
     {0x94810000u, 46u}, // bef -> Latn
     {0x9C810000u, 46u}, // beh -> Latn
-    {0xA4810000u,  1u}, // bej -> Arab
+    {0xA4810000u,  2u}, // bej -> Arab
     {0xB0810000u, 46u}, // bem -> Latn
     {0xCC810000u, 46u}, // bet -> Latn
     {0xD8810000u, 46u}, // bew -> Latn
     {0xDC810000u, 46u}, // bex -> Latn
     {0xE4810000u, 46u}, // bez -> Latn
     {0x8CA10000u, 46u}, // bfd -> Latn
-    {0xC0A10000u, 84u}, // bfq -> Taml
-    {0xCCA10000u,  1u}, // bft -> Arab
-    {0xE0A10000u, 18u}, // bfy -> Deva
-    {0x62670000u, 17u}, // bg -> Cyrl
-    {0x88C10000u, 18u}, // bgc -> Deva
-    {0xB4C10000u,  1u}, // bgn -> Arab
-    {0xDCC10000u, 25u}, // bgx -> Grek
-    {0x84E10000u, 18u}, // bhb -> Deva
+    {0xC0A10000u, 85u}, // bfq -> Taml
+    {0xCCA10000u,  2u}, // bft -> Arab
+    {0xE0A10000u, 19u}, // bfy -> Deva
+    {0x62670000u, 18u}, // bg -> Cyrl
+    {0x88C10000u, 19u}, // bgc -> Deva
+    {0xB4C10000u,  2u}, // bgn -> Arab
+    {0xDCC10000u, 26u}, // bgx -> Grek
+    {0x84E10000u, 19u}, // bhb -> Deva
     {0x98E10000u, 46u}, // bhg -> Latn
-    {0xA0E10000u, 18u}, // bhi -> Deva
+    {0xA0E10000u, 19u}, // bhi -> Deva
     {0xACE10000u, 46u}, // bhl -> Latn
-    {0xB8E10000u, 18u}, // bho -> Deva
+    {0xB8E10000u, 19u}, // bho -> Deva
     {0xE0E10000u, 46u}, // bhy -> Latn
     {0x62690000u, 46u}, // bi -> Latn
     {0x85010000u, 46u}, // bib -> Latn
@@ -254,8 +255,8 @@
     {0xB9010000u, 46u}, // bio -> Latn
     {0xC1010000u, 46u}, // biq -> Latn
     {0x9D210000u, 46u}, // bjh -> Latn
-    {0xA1210000u, 20u}, // bji -> Ethi
-    {0xA5210000u, 18u}, // bjj -> Deva
+    {0xA1210000u, 21u}, // bji -> Ethi
+    {0xA5210000u, 19u}, // bjj -> Deva
     {0xB5210000u, 46u}, // bjn -> Latn
     {0xB9210000u, 46u}, // bjo -> Latn
     {0xC5210000u, 46u}, // bjr -> Latn
@@ -266,39 +267,39 @@
     {0xC1410000u, 46u}, // bkq -> Latn
     {0xD1410000u, 46u}, // bku -> Latn
     {0xD5410000u, 46u}, // bkv -> Latn
-    {0xCD610000u, 86u}, // blt -> Tavt
+    {0xCD610000u, 87u}, // blt -> Tavt
     {0x626D0000u, 46u}, // bm -> Latn
     {0x9D810000u, 46u}, // bmh -> Latn
     {0xA9810000u, 46u}, // bmk -> Latn
     {0xC1810000u, 46u}, // bmq -> Latn
     {0xD1810000u, 46u}, // bmu -> Latn
-    {0x626E0000u,  7u}, // bn -> Beng
+    {0x626E0000u,  8u}, // bn -> Beng
     {0x99A10000u, 46u}, // bng -> Latn
     {0xB1A10000u, 46u}, // bnm -> Latn
     {0xBDA10000u, 46u}, // bnp -> Latn
-    {0x626F0000u, 91u}, // bo -> Tibt
+    {0x626F0000u, 92u}, // bo -> Tibt
     {0xA5C10000u, 46u}, // boj -> Latn
     {0xB1C10000u, 46u}, // bom -> Latn
     {0xB5C10000u, 46u}, // bon -> Latn
-    {0xE1E10000u,  7u}, // bpy -> Beng
+    {0xE1E10000u,  8u}, // bpy -> Beng
     {0x8A010000u, 46u}, // bqc -> Latn
-    {0xA2010000u,  1u}, // bqi -> Arab
+    {0xA2010000u,  2u}, // bqi -> Arab
     {0xBE010000u, 46u}, // bqp -> Latn
     {0xD6010000u, 46u}, // bqv -> Latn
     {0x62720000u, 46u}, // br -> Latn
-    {0x82210000u, 18u}, // bra -> Deva
-    {0x9E210000u,  1u}, // brh -> Arab
-    {0xDE210000u, 18u}, // brx -> Deva
+    {0x82210000u, 19u}, // bra -> Deva
+    {0x9E210000u,  2u}, // brh -> Arab
+    {0xDE210000u, 19u}, // brx -> Deva
     {0xE6210000u, 46u}, // brz -> Latn
     {0x62730000u, 46u}, // bs -> Latn
     {0xA6410000u, 46u}, // bsj -> Latn
-    {0xC2410000u,  6u}, // bsq -> Bass
+    {0xC2410000u,  7u}, // bsq -> Bass
     {0xCA410000u, 46u}, // bss -> Latn
-    {0xCE410000u, 20u}, // bst -> Ethi
+    {0xCE410000u, 21u}, // bst -> Ethi
     {0xBA610000u, 46u}, // bto -> Latn
     {0xCE610000u, 46u}, // btt -> Latn
-    {0xD6610000u, 18u}, // btv -> Deva
-    {0x82810000u, 17u}, // bua -> Cyrl
+    {0xD6610000u, 19u}, // btv -> Deva
+    {0x82810000u, 18u}, // bua -> Cyrl
     {0x8A810000u, 46u}, // buc -> Latn
     {0x8E810000u, 46u}, // bud -> Latn
     {0x9A810000u, 46u}, // bug -> Latn
@@ -312,7 +313,7 @@
     {0xC6C10000u, 46u}, // bwr -> Latn
     {0x9EE10000u, 46u}, // bxh -> Latn
     {0x93010000u, 46u}, // bye -> Latn
-    {0xB7010000u, 20u}, // byn -> Ethi
+    {0xB7010000u, 21u}, // byn -> Ethi
     {0xC7010000u, 46u}, // byr -> Latn
     {0xCB010000u, 46u}, // bys -> Latn
     {0xD7010000u, 46u}, // byv -> Latn
@@ -327,44 +328,44 @@
     {0xB4020000u, 46u}, // can -> Latn
     {0xA4220000u, 46u}, // cbj -> Latn
     {0x9C420000u, 46u}, // cch -> Latn
-    {0xBC420000u,  9u}, // ccp -> Cakm
-    {0x63650000u, 17u}, // ce -> Cyrl
+    {0xBC420000u, 10u}, // ccp -> Cakm
+    {0x63650000u, 18u}, // ce -> Cyrl
     {0x84820000u, 46u}, // ceb -> Latn
     {0x80A20000u, 46u}, // cfa -> Latn
     {0x98C20000u, 46u}, // cgg -> Latn
     {0x63680000u, 46u}, // ch -> Latn
     {0xA8E20000u, 46u}, // chk -> Latn
-    {0xB0E20000u, 17u}, // chm -> Cyrl
+    {0xB0E20000u, 18u}, // chm -> Cyrl
     {0xB8E20000u, 46u}, // cho -> Latn
     {0xBCE20000u, 46u}, // chp -> Latn
-    {0xC4E20000u, 13u}, // chr -> Cher
+    {0xC4E20000u, 14u}, // chr -> Cher
     {0x89020000u, 46u}, // cic -> Latn
-    {0x81220000u,  1u}, // cja -> Arab
-    {0xB1220000u, 12u}, // cjm -> Cham
+    {0x81220000u,  2u}, // cja -> Arab
+    {0xB1220000u, 13u}, // cjm -> Cham
     {0xD5220000u, 46u}, // cjv -> Latn
-    {0x85420000u,  1u}, // ckb -> Arab
+    {0x85420000u,  2u}, // ckb -> Arab
     {0xAD420000u, 46u}, // ckl -> Latn
     {0xB9420000u, 46u}, // cko -> Latn
     {0xE1420000u, 46u}, // cky -> Latn
     {0x81620000u, 46u}, // cla -> Latn
     {0x91820000u, 46u}, // cme -> Latn
-    {0x99820000u, 80u}, // cmg -> Soyo
+    {0x99820000u, 81u}, // cmg -> Soyo
     {0x636F0000u, 46u}, // co -> Latn
-    {0xBDC20000u, 15u}, // cop -> Copt
+    {0xBDC20000u, 16u}, // cop -> Copt
     {0xC9E20000u, 46u}, // cps -> Latn
-    {0x63720000u, 10u}, // cr -> Cans
-    {0x9E220000u, 17u}, // crh -> Cyrl
-    {0xA6220000u, 10u}, // crj -> Cans
-    {0xAA220000u, 10u}, // crk -> Cans
-    {0xAE220000u, 10u}, // crl -> Cans
-    {0xB2220000u, 10u}, // crm -> Cans
+    {0x63720000u, 11u}, // cr -> Cans
+    {0x9E220000u, 18u}, // crh -> Cyrl
+    {0xA6220000u, 11u}, // crj -> Cans
+    {0xAA220000u, 11u}, // crk -> Cans
+    {0xAE220000u, 11u}, // crl -> Cans
+    {0xB2220000u, 11u}, // crm -> Cans
     {0xCA220000u, 46u}, // crs -> Latn
     {0x63730000u, 46u}, // cs -> Latn
     {0x86420000u, 46u}, // csb -> Latn
-    {0xDA420000u, 10u}, // csw -> Cans
-    {0x8E620000u, 67u}, // ctd -> Pauc
-    {0x63750000u, 17u}, // cu -> Cyrl
-    {0x63760000u, 17u}, // cv -> Cyrl
+    {0xDA420000u, 11u}, // csw -> Cans
+    {0x8E620000u, 68u}, // ctd -> Pauc
+    {0x63750000u, 18u}, // cu -> Cyrl
+    {0x63760000u, 18u}, // cv -> Cyrl
     {0x63790000u, 46u}, // cy -> Latn
     {0x64610000u, 46u}, // da -> Latn
     {0x8C030000u, 46u}, // dad -> Latn
@@ -372,11 +373,11 @@
     {0x98030000u, 46u}, // dag -> Latn
     {0x9C030000u, 46u}, // dah -> Latn
     {0xA8030000u, 46u}, // dak -> Latn
-    {0xC4030000u, 17u}, // dar -> Cyrl
+    {0xC4030000u, 18u}, // dar -> Cyrl
     {0xD4030000u, 46u}, // dav -> Latn
     {0x8C230000u, 46u}, // dbd -> Latn
     {0xC0230000u, 46u}, // dbq -> Latn
-    {0x88430000u,  1u}, // dcc -> Arab
+    {0x88430000u,  2u}, // dcc -> Arab
     {0xB4630000u, 46u}, // ddn -> Latn
     {0x64650000u, 46u}, // de -> Latn
     {0x8C830000u, 46u}, // ded -> Latn
@@ -384,53 +385,54 @@
     {0x80C30000u, 46u}, // dga -> Latn
     {0x9CC30000u, 46u}, // dgh -> Latn
     {0xA0C30000u, 46u}, // dgi -> Latn
-    {0xACC30000u,  1u}, // dgl -> Arab
+    {0xACC30000u,  2u}, // dgl -> Arab
     {0xC4C30000u, 46u}, // dgr -> Latn
     {0xE4C30000u, 46u}, // dgz -> Latn
     {0x81030000u, 46u}, // dia -> Latn
     {0x91230000u, 46u}, // dje -> Latn
+    {0x95830000u, 54u}, // dmf -> Medf
     {0xA5A30000u, 46u}, // dnj -> Latn
     {0x85C30000u, 46u}, // dob -> Latn
-    {0xA1C30000u, 18u}, // doi -> Deva
+    {0xA1C30000u, 19u}, // doi -> Deva
     {0xBDC30000u, 46u}, // dop -> Latn
     {0xD9C30000u, 46u}, // dow -> Latn
-    {0x9E230000u, 56u}, // drh -> Mong
+    {0x9E230000u, 57u}, // drh -> Mong
     {0xA2230000u, 46u}, // dri -> Latn
-    {0xCA230000u, 20u}, // drs -> Ethi
+    {0xCA230000u, 21u}, // drs -> Ethi
     {0x86430000u, 46u}, // dsb -> Latn
     {0xB2630000u, 46u}, // dtm -> Latn
     {0xBE630000u, 46u}, // dtp -> Latn
     {0xCA630000u, 46u}, // dts -> Latn
-    {0xE2630000u, 18u}, // dty -> Deva
+    {0xE2630000u, 19u}, // dty -> Deva
     {0x82830000u, 46u}, // dua -> Latn
     {0x8A830000u, 46u}, // duc -> Latn
     {0x8E830000u, 46u}, // dud -> Latn
     {0x9A830000u, 46u}, // dug -> Latn
-    {0x64760000u, 89u}, // dv -> Thaa
+    {0x64760000u, 90u}, // dv -> Thaa
     {0x82A30000u, 46u}, // dva -> Latn
     {0xDAC30000u, 46u}, // dww -> Latn
     {0xBB030000u, 46u}, // dyo -> Latn
     {0xD3030000u, 46u}, // dyu -> Latn
-    {0x647A0000u, 91u}, // dz -> Tibt
+    {0x647A0000u, 92u}, // dz -> Tibt
     {0x9B230000u, 46u}, // dzg -> Latn
     {0xD0240000u, 46u}, // ebu -> Latn
     {0x65650000u, 46u}, // ee -> Latn
     {0xA0A40000u, 46u}, // efi -> Latn
     {0xACC40000u, 46u}, // egl -> Latn
-    {0xE0C40000u, 19u}, // egy -> Egyp
+    {0xE0C40000u, 20u}, // egy -> Egyp
     {0x81440000u, 46u}, // eka -> Latn
     {0xE1440000u, 37u}, // eky -> Kali
-    {0x656C0000u, 25u}, // el -> Grek
+    {0x656C0000u, 26u}, // el -> Grek
     {0x81840000u, 46u}, // ema -> Latn
     {0xA1840000u, 46u}, // emi -> Latn
     {0x656E0000u, 46u}, // en -> Latn
-    {0x656E5841u, 98u}, // en-XA -> ~~~A
+    {0x656E5841u, 99u}, // en-XA -> ~~~A
     {0xB5A40000u, 46u}, // enn -> Latn
     {0xC1A40000u, 46u}, // enq -> Latn
     {0x656F0000u, 46u}, // eo -> Latn
     {0xA2240000u, 46u}, // eri -> Latn
     {0x65730000u, 46u}, // es -> Latn
-    {0x9A440000u, 23u}, // esg -> Gonm
+    {0x9A440000u, 24u}, // esg -> Gonm
     {0xD2440000u, 46u}, // esu -> Latn
     {0x65740000u, 46u}, // et -> Latn
     {0xC6640000u, 46u}, // etr -> Latn
@@ -441,7 +443,7 @@
     {0xBAC40000u, 46u}, // ewo -> Latn
     {0xCEE40000u, 46u}, // ext -> Latn
     {0x83240000u, 46u}, // eza -> Latn
-    {0x66610000u,  1u}, // fa -> Arab
+    {0x66610000u,  2u}, // fa -> Arab
     {0x80050000u, 46u}, // faa -> Latn
     {0x84050000u, 46u}, // fab -> Latn
     {0x98050000u, 46u}, // fag -> Latn
@@ -451,7 +453,7 @@
     {0xA0A50000u, 46u}, // ffi -> Latn
     {0xB0A50000u, 46u}, // ffm -> Latn
     {0x66690000u, 46u}, // fi -> Latn
-    {0x81050000u,  1u}, // fia -> Arab
+    {0x81050000u,  2u}, // fia -> Arab
     {0xAD050000u, 46u}, // fil -> Latn
     {0xCD050000u, 46u}, // fit -> Latn
     {0x666A0000u, 46u}, // fj -> Latn
@@ -468,7 +470,7 @@
     {0xBE250000u, 46u}, // frp -> Latn
     {0xC6250000u, 46u}, // frr -> Latn
     {0xCA250000u, 46u}, // frs -> Latn
-    {0x86850000u,  1u}, // fub -> Arab
+    {0x86850000u,  2u}, // fub -> Arab
     {0x8E850000u, 46u}, // fud -> Latn
     {0x92850000u, 46u}, // fue -> Latn
     {0x96850000u, 46u}, // fuf -> Latn
@@ -486,14 +488,14 @@
     {0x9C060000u, 46u}, // gah -> Latn
     {0xA4060000u, 46u}, // gaj -> Latn
     {0xB0060000u, 46u}, // gam -> Latn
-    {0xB4060000u, 28u}, // gan -> Hans
+    {0xB4060000u, 29u}, // gan -> Hans
     {0xD8060000u, 46u}, // gaw -> Latn
     {0xE0060000u, 46u}, // gay -> Latn
     {0x80260000u, 46u}, // gba -> Latn
     {0x94260000u, 46u}, // gbf -> Latn
-    {0xB0260000u, 18u}, // gbm -> Deva
+    {0xB0260000u, 19u}, // gbm -> Deva
     {0xE0260000u, 46u}, // gby -> Latn
-    {0xE4260000u,  1u}, // gbz -> Arab
+    {0xE4260000u,  2u}, // gbz -> Arab
     {0xC4460000u, 46u}, // gcr -> Latn
     {0x67640000u, 46u}, // gd -> Latn
     {0x90660000u, 46u}, // gde -> Latn
@@ -502,38 +504,38 @@
     {0x84860000u, 46u}, // geb -> Latn
     {0xA4860000u, 46u}, // gej -> Latn
     {0xAC860000u, 46u}, // gel -> Latn
-    {0xE4860000u, 20u}, // gez -> Ethi
+    {0xE4860000u, 21u}, // gez -> Ethi
     {0xA8A60000u, 46u}, // gfk -> Latn
-    {0xB4C60000u, 18u}, // ggn -> Deva
+    {0xB4C60000u, 19u}, // ggn -> Deva
     {0xC8E60000u, 46u}, // ghs -> Latn
     {0xAD060000u, 46u}, // gil -> Latn
     {0xB1060000u, 46u}, // gim -> Latn
-    {0xA9260000u,  1u}, // gjk -> Arab
+    {0xA9260000u,  2u}, // gjk -> Arab
     {0xB5260000u, 46u}, // gjn -> Latn
-    {0xD1260000u,  1u}, // gju -> Arab
+    {0xD1260000u,  2u}, // gju -> Arab
     {0xB5460000u, 46u}, // gkn -> Latn
     {0xBD460000u, 46u}, // gkp -> Latn
     {0x676C0000u, 46u}, // gl -> Latn
-    {0xA9660000u,  1u}, // glk -> Arab
+    {0xA9660000u,  2u}, // glk -> Arab
     {0xB1860000u, 46u}, // gmm -> Latn
-    {0xD5860000u, 20u}, // gmv -> Ethi
+    {0xD5860000u, 21u}, // gmv -> Ethi
     {0x676E0000u, 46u}, // gn -> Latn
     {0x8DA60000u, 46u}, // gnd -> Latn
     {0x99A60000u, 46u}, // gng -> Latn
     {0x8DC60000u, 46u}, // god -> Latn
-    {0x95C60000u, 20u}, // gof -> Ethi
+    {0x95C60000u, 21u}, // gof -> Ethi
     {0xA1C60000u, 46u}, // goi -> Latn
-    {0xB1C60000u, 18u}, // gom -> Deva
-    {0xB5C60000u, 87u}, // gon -> Telu
+    {0xB1C60000u, 19u}, // gom -> Deva
+    {0xB5C60000u, 88u}, // gon -> Telu
     {0xC5C60000u, 46u}, // gor -> Latn
     {0xC9C60000u, 46u}, // gos -> Latn
-    {0xCDC60000u, 24u}, // got -> Goth
+    {0xCDC60000u, 25u}, // got -> Goth
     {0x86260000u, 46u}, // grb -> Latn
-    {0x8A260000u, 16u}, // grc -> Cprt
-    {0xCE260000u,  7u}, // grt -> Beng
+    {0x8A260000u, 17u}, // grc -> Cprt
+    {0xCE260000u,  8u}, // grt -> Beng
     {0xDA260000u, 46u}, // grw -> Latn
     {0xDA460000u, 46u}, // gsw -> Latn
-    {0x67750000u, 26u}, // gu -> Gujr
+    {0x67750000u, 27u}, // gu -> Gujr
     {0x86860000u, 46u}, // gub -> Latn
     {0x8A860000u, 46u}, // guc -> Latn
     {0x8E860000u, 46u}, // gud -> Latn
@@ -543,25 +545,25 @@
     {0xE6860000u, 46u}, // guz -> Latn
     {0x67760000u, 46u}, // gv -> Latn
     {0x96A60000u, 46u}, // gvf -> Latn
-    {0xC6A60000u, 18u}, // gvr -> Deva
+    {0xC6A60000u, 19u}, // gvr -> Deva
     {0xCAA60000u, 46u}, // gvs -> Latn
-    {0x8AC60000u,  1u}, // gwc -> Arab
+    {0x8AC60000u,  2u}, // gwc -> Arab
     {0xA2C60000u, 46u}, // gwi -> Latn
-    {0xCEC60000u,  1u}, // gwt -> Arab
+    {0xCEC60000u,  2u}, // gwt -> Arab
     {0xA3060000u, 46u}, // gyi -> Latn
     {0x68610000u, 46u}, // ha -> Latn
-    {0x6861434Du,  1u}, // ha-CM -> Arab
-    {0x68615344u,  1u}, // ha-SD -> Arab
+    {0x6861434Du,  2u}, // ha-CM -> Arab
+    {0x68615344u,  2u}, // ha-SD -> Arab
     {0x98070000u, 46u}, // hag -> Latn
-    {0xA8070000u, 28u}, // hak -> Hans
+    {0xA8070000u, 29u}, // hak -> Hans
     {0xB0070000u, 46u}, // ham -> Latn
     {0xD8070000u, 46u}, // haw -> Latn
-    {0xE4070000u,  1u}, // haz -> Arab
+    {0xE4070000u,  2u}, // haz -> Arab
     {0x84270000u, 46u}, // hbb -> Latn
-    {0xE0670000u, 20u}, // hdy -> Ethi
+    {0xE0670000u, 21u}, // hdy -> Ethi
     {0x68650000u, 31u}, // he -> Hebr
     {0xE0E70000u, 46u}, // hhy -> Latn
-    {0x68690000u, 18u}, // hi -> Deva
+    {0x68690000u, 19u}, // hi -> Deva
     {0x81070000u, 46u}, // hia -> Latn
     {0x95070000u, 46u}, // hif -> Latn
     {0x99070000u, 46u}, // hig -> Latn
@@ -569,24 +571,24 @@
     {0xAD070000u, 46u}, // hil -> Latn
     {0x81670000u, 46u}, // hla -> Latn
     {0xD1670000u, 32u}, // hlu -> Hluw
-    {0x8D870000u, 70u}, // hmd -> Plrd
+    {0x8D870000u, 71u}, // hmd -> Plrd
     {0xCD870000u, 46u}, // hmt -> Latn
-    {0x8DA70000u,  1u}, // hnd -> Arab
-    {0x91A70000u, 18u}, // hne -> Deva
+    {0x8DA70000u,  2u}, // hnd -> Arab
+    {0x91A70000u, 19u}, // hne -> Deva
     {0xA5A70000u, 33u}, // hnj -> Hmng
     {0xB5A70000u, 46u}, // hnn -> Latn
-    {0xB9A70000u,  1u}, // hno -> Arab
+    {0xB9A70000u,  2u}, // hno -> Arab
     {0x686F0000u, 46u}, // ho -> Latn
-    {0x89C70000u, 18u}, // hoc -> Deva
-    {0xA5C70000u, 18u}, // hoj -> Deva
+    {0x89C70000u, 19u}, // hoc -> Deva
+    {0xA5C70000u, 19u}, // hoj -> Deva
     {0xCDC70000u, 46u}, // hot -> Latn
     {0x68720000u, 46u}, // hr -> Latn
     {0x86470000u, 46u}, // hsb -> Latn
-    {0xB6470000u, 28u}, // hsn -> Hans
+    {0xB6470000u, 29u}, // hsn -> Hans
     {0x68740000u, 46u}, // ht -> Latn
     {0x68750000u, 46u}, // hu -> Latn
     {0xA2870000u, 46u}, // hui -> Latn
-    {0x68790000u,  3u}, // hy -> Armn
+    {0x68790000u,  4u}, // hy -> Armn
     {0x687A0000u, 46u}, // hz -> Latn
     {0x69610000u, 46u}, // ia -> Latn
     {0xB4080000u, 46u}, // ian -> Latn
@@ -604,7 +606,7 @@
     {0x69670000u, 46u}, // ig -> Latn
     {0x84C80000u, 46u}, // igb -> Latn
     {0x90C80000u, 46u}, // ige -> Latn
-    {0x69690000u, 97u}, // ii -> Yiii
+    {0x69690000u, 98u}, // ii -> Yiii
     {0xA5280000u, 46u}, // ijj -> Latn
     {0x696B0000u, 46u}, // ik -> Latn
     {0xA9480000u, 46u}, // ikk -> Latn
@@ -614,13 +616,13 @@
     {0xB9680000u, 46u}, // ilo -> Latn
     {0xB9880000u, 46u}, // imo -> Latn
     {0x696E0000u, 46u}, // in -> Latn
-    {0x9DA80000u, 17u}, // inh -> Cyrl
+    {0x9DA80000u, 18u}, // inh -> Cyrl
     {0x696F0000u, 46u}, // io -> Latn
     {0xD1C80000u, 46u}, // iou -> Latn
     {0xA2280000u, 46u}, // iri -> Latn
     {0x69730000u, 46u}, // is -> Latn
     {0x69740000u, 46u}, // it -> Latn
-    {0x69750000u, 10u}, // iu -> Cans
+    {0x69750000u, 11u}, // iu -> Cans
     {0x69770000u, 31u}, // iw -> Hebr
     {0xB2C80000u, 46u}, // iwm -> Latn
     {0xCAC80000u, 46u}, // iws -> Latn
@@ -638,13 +640,13 @@
     {0x6A690000u, 31u}, // ji -> Hebr
     {0x85090000u, 46u}, // jib -> Latn
     {0x89890000u, 46u}, // jmc -> Latn
-    {0xAD890000u, 18u}, // jml -> Deva
+    {0xAD890000u, 19u}, // jml -> Deva
     {0x82290000u, 46u}, // jra -> Latn
     {0xCE890000u, 46u}, // jut -> Latn
     {0x6A760000u, 46u}, // jv -> Latn
     {0x6A770000u, 46u}, // jw -> Latn
-    {0x6B610000u, 21u}, // ka -> Geor
-    {0x800A0000u, 17u}, // kaa -> Cyrl
+    {0x6B610000u, 22u}, // ka -> Geor
+    {0x800A0000u, 18u}, // kaa -> Cyrl
     {0x840A0000u, 46u}, // kab -> Latn
     {0x880A0000u, 46u}, // kac -> Latn
     {0x8C0A0000u, 46u}, // kad -> Latn
@@ -652,37 +654,37 @@
     {0xA40A0000u, 46u}, // kaj -> Latn
     {0xB00A0000u, 46u}, // kam -> Latn
     {0xB80A0000u, 46u}, // kao -> Latn
-    {0x8C2A0000u, 17u}, // kbd -> Cyrl
+    {0x8C2A0000u, 18u}, // kbd -> Cyrl
     {0xB02A0000u, 46u}, // kbm -> Latn
     {0xBC2A0000u, 46u}, // kbp -> Latn
     {0xC02A0000u, 46u}, // kbq -> Latn
     {0xDC2A0000u, 46u}, // kbx -> Latn
-    {0xE02A0000u,  1u}, // kby -> Arab
+    {0xE02A0000u,  2u}, // kby -> Arab
     {0x984A0000u, 46u}, // kcg -> Latn
     {0xA84A0000u, 46u}, // kck -> Latn
     {0xAC4A0000u, 46u}, // kcl -> Latn
     {0xCC4A0000u, 46u}, // kct -> Latn
     {0x906A0000u, 46u}, // kde -> Latn
-    {0x9C6A0000u,  1u}, // kdh -> Arab
+    {0x9C6A0000u,  2u}, // kdh -> Arab
     {0xAC6A0000u, 46u}, // kdl -> Latn
-    {0xCC6A0000u, 90u}, // kdt -> Thai
+    {0xCC6A0000u, 91u}, // kdt -> Thai
     {0x808A0000u, 46u}, // kea -> Latn
     {0xB48A0000u, 46u}, // ken -> Latn
     {0xE48A0000u, 46u}, // kez -> Latn
     {0xB8AA0000u, 46u}, // kfo -> Latn
-    {0xC4AA0000u, 18u}, // kfr -> Deva
-    {0xE0AA0000u, 18u}, // kfy -> Deva
+    {0xC4AA0000u, 19u}, // kfr -> Deva
+    {0xE0AA0000u, 19u}, // kfy -> Deva
     {0x6B670000u, 46u}, // kg -> Latn
     {0x90CA0000u, 46u}, // kge -> Latn
     {0x94CA0000u, 46u}, // kgf -> Latn
     {0xBCCA0000u, 46u}, // kgp -> Latn
     {0x80EA0000u, 46u}, // kha -> Latn
-    {0x84EA0000u, 83u}, // khb -> Talu
-    {0xB4EA0000u, 18u}, // khn -> Deva
+    {0x84EA0000u, 84u}, // khb -> Talu
+    {0xB4EA0000u, 19u}, // khn -> Deva
     {0xC0EA0000u, 46u}, // khq -> Latn
     {0xC8EA0000u, 46u}, // khs -> Latn
-    {0xCCEA0000u, 58u}, // kht -> Mymr
-    {0xD8EA0000u,  1u}, // khw -> Arab
+    {0xCCEA0000u, 59u}, // kht -> Mymr
+    {0xD8EA0000u,  2u}, // khw -> Arab
     {0xE4EA0000u, 46u}, // khz -> Latn
     {0x6B690000u, 46u}, // ki -> Latn
     {0xA50A0000u, 46u}, // kij -> Latn
@@ -693,11 +695,11 @@
     {0x992A0000u, 45u}, // kjg -> Laoo
     {0xC92A0000u, 46u}, // kjs -> Latn
     {0xE12A0000u, 46u}, // kjy -> Latn
-    {0x6B6B0000u, 17u}, // kk -> Cyrl
-    {0x6B6B4146u,  1u}, // kk-AF -> Arab
-    {0x6B6B434Eu,  1u}, // kk-CN -> Arab
-    {0x6B6B4952u,  1u}, // kk-IR -> Arab
-    {0x6B6B4D4Eu,  1u}, // kk-MN -> Arab
+    {0x6B6B0000u, 18u}, // kk -> Cyrl
+    {0x6B6B4146u,  2u}, // kk-AF -> Arab
+    {0x6B6B434Eu,  2u}, // kk-CN -> Arab
+    {0x6B6B4952u,  2u}, // kk-IR -> Arab
+    {0x6B6B4D4Eu,  2u}, // kk-MN -> Arab
     {0x894A0000u, 46u}, // kkc -> Latn
     {0xA54A0000u, 46u}, // kkj -> Latn
     {0x6B6C0000u, 46u}, // kl -> Latn
@@ -716,8 +718,8 @@
     {0x95AA0000u, 46u}, // knf -> Latn
     {0xBDAA0000u, 46u}, // knp -> Latn
     {0x6B6F0000u, 43u}, // ko -> Kore
-    {0xA1CA0000u, 17u}, // koi -> Cyrl
-    {0xA9CA0000u, 18u}, // kok -> Deva
+    {0xA1CA0000u, 18u}, // koi -> Cyrl
+    {0xA9CA0000u, 19u}, // kok -> Deva
     {0xADCA0000u, 46u}, // kol -> Latn
     {0xC9CA0000u, 46u}, // kos -> Latn
     {0xE5CA0000u, 46u}, // koz -> Latn
@@ -729,58 +731,58 @@
     {0x860A0000u, 46u}, // kqb -> Latn
     {0x960A0000u, 46u}, // kqf -> Latn
     {0xCA0A0000u, 46u}, // kqs -> Latn
-    {0xE20A0000u, 20u}, // kqy -> Ethi
+    {0xE20A0000u, 21u}, // kqy -> Ethi
     {0x6B720000u, 46u}, // kr -> Latn
-    {0x8A2A0000u, 17u}, // krc -> Cyrl
+    {0x8A2A0000u, 18u}, // krc -> Cyrl
     {0xA22A0000u, 46u}, // kri -> Latn
     {0xA62A0000u, 46u}, // krj -> Latn
     {0xAE2A0000u, 46u}, // krl -> Latn
     {0xCA2A0000u, 46u}, // krs -> Latn
-    {0xD22A0000u, 18u}, // kru -> Deva
-    {0x6B730000u,  1u}, // ks -> Arab
+    {0xD22A0000u, 19u}, // kru -> Deva
+    {0x6B730000u,  2u}, // ks -> Arab
     {0x864A0000u, 46u}, // ksb -> Latn
     {0x8E4A0000u, 46u}, // ksd -> Latn
     {0x964A0000u, 46u}, // ksf -> Latn
     {0x9E4A0000u, 46u}, // ksh -> Latn
     {0xA64A0000u, 46u}, // ksj -> Latn
     {0xC64A0000u, 46u}, // ksr -> Latn
-    {0x866A0000u, 20u}, // ktb -> Ethi
+    {0x866A0000u, 21u}, // ktb -> Ethi
     {0xB26A0000u, 46u}, // ktm -> Latn
     {0xBA6A0000u, 46u}, // kto -> Latn
     {0xC66A0000u, 46u}, // ktr -> Latn
     {0x6B750000u, 46u}, // ku -> Latn
-    {0x6B754952u,  1u}, // ku-IR -> Arab
-    {0x6B754C42u,  1u}, // ku-LB -> Arab
+    {0x6B754952u,  2u}, // ku-IR -> Arab
+    {0x6B754C42u,  2u}, // ku-LB -> Arab
     {0x868A0000u, 46u}, // kub -> Latn
     {0x8E8A0000u, 46u}, // kud -> Latn
     {0x928A0000u, 46u}, // kue -> Latn
     {0xA68A0000u, 46u}, // kuj -> Latn
-    {0xB28A0000u, 17u}, // kum -> Cyrl
+    {0xB28A0000u, 18u}, // kum -> Cyrl
     {0xB68A0000u, 46u}, // kun -> Latn
     {0xBE8A0000u, 46u}, // kup -> Latn
     {0xCA8A0000u, 46u}, // kus -> Latn
-    {0x6B760000u, 17u}, // kv -> Cyrl
+    {0x6B760000u, 18u}, // kv -> Cyrl
     {0x9AAA0000u, 46u}, // kvg -> Latn
     {0xC6AA0000u, 46u}, // kvr -> Latn
-    {0xDEAA0000u,  1u}, // kvx -> Arab
+    {0xDEAA0000u,  2u}, // kvx -> Arab
     {0x6B770000u, 46u}, // kw -> Latn
     {0xA6CA0000u, 46u}, // kwj -> Latn
     {0xBACA0000u, 46u}, // kwo -> Latn
     {0xC2CA0000u, 46u}, // kwq -> Latn
     {0x82EA0000u, 46u}, // kxa -> Latn
-    {0x8AEA0000u, 20u}, // kxc -> Ethi
+    {0x8AEA0000u, 21u}, // kxc -> Ethi
     {0x92EA0000u, 46u}, // kxe -> Latn
-    {0xAEEA0000u, 18u}, // kxl -> Deva
-    {0xB2EA0000u, 90u}, // kxm -> Thai
-    {0xBEEA0000u,  1u}, // kxp -> Arab
+    {0xAEEA0000u, 19u}, // kxl -> Deva
+    {0xB2EA0000u, 91u}, // kxm -> Thai
+    {0xBEEA0000u,  2u}, // kxp -> Arab
     {0xDAEA0000u, 46u}, // kxw -> Latn
     {0xE6EA0000u, 46u}, // kxz -> Latn
-    {0x6B790000u, 17u}, // ky -> Cyrl
-    {0x6B79434Eu,  1u}, // ky-CN -> Arab
+    {0x6B790000u, 18u}, // ky -> Cyrl
+    {0x6B79434Eu,  2u}, // ky-CN -> Arab
     {0x6B795452u, 46u}, // ky-TR -> Latn
     {0x930A0000u, 46u}, // kye -> Latn
     {0xDF0A0000u, 46u}, // kyx -> Latn
-    {0x9F2A0000u,  1u}, // kzh -> Arab
+    {0x9F2A0000u,  2u}, // kzh -> Arab
     {0xA72A0000u, 46u}, // kzj -> Latn
     {0xC72A0000u, 46u}, // kzr -> Latn
     {0xCF2A0000u, 46u}, // kzt -> Latn
@@ -788,15 +790,15 @@
     {0x840B0000u, 48u}, // lab -> Lina
     {0x8C0B0000u, 31u}, // lad -> Hebr
     {0x980B0000u, 46u}, // lag -> Latn
-    {0x9C0B0000u,  1u}, // lah -> Arab
+    {0x9C0B0000u,  2u}, // lah -> Arab
     {0xA40B0000u, 46u}, // laj -> Latn
     {0xC80B0000u, 46u}, // las -> Latn
     {0x6C620000u, 46u}, // lb -> Latn
-    {0x902B0000u, 17u}, // lbe -> Cyrl
+    {0x902B0000u, 18u}, // lbe -> Cyrl
     {0xD02B0000u, 46u}, // lbu -> Latn
     {0xD82B0000u, 46u}, // lbw -> Latn
     {0xB04B0000u, 46u}, // lcm -> Latn
-    {0xBC4B0000u, 90u}, // lcp -> Thai
+    {0xBC4B0000u, 91u}, // lcp -> Thai
     {0x846B0000u, 46u}, // ldb -> Latn
     {0x8C8B0000u, 46u}, // led -> Latn
     {0x908B0000u, 46u}, // lee -> Latn
@@ -804,23 +806,23 @@
     {0xBC8B0000u, 47u}, // lep -> Lepc
     {0xC08B0000u, 46u}, // leq -> Latn
     {0xD08B0000u, 46u}, // leu -> Latn
-    {0xE48B0000u, 17u}, // lez -> Cyrl
+    {0xE48B0000u, 18u}, // lez -> Cyrl
     {0x6C670000u, 46u}, // lg -> Latn
     {0x98CB0000u, 46u}, // lgg -> Latn
     {0x6C690000u, 46u}, // li -> Latn
     {0x810B0000u, 46u}, // lia -> Latn
     {0x8D0B0000u, 46u}, // lid -> Latn
-    {0x950B0000u, 18u}, // lif -> Deva
+    {0x950B0000u, 19u}, // lif -> Deva
     {0x990B0000u, 46u}, // lig -> Latn
     {0x9D0B0000u, 46u}, // lih -> Latn
     {0xA50B0000u, 46u}, // lij -> Latn
     {0xC90B0000u, 49u}, // lis -> Lisu
     {0xBD2B0000u, 46u}, // ljp -> Latn
-    {0xA14B0000u,  1u}, // lki -> Arab
+    {0xA14B0000u,  2u}, // lki -> Arab
     {0xCD4B0000u, 46u}, // lkt -> Latn
     {0x916B0000u, 46u}, // lle -> Latn
     {0xB56B0000u, 46u}, // lln -> Latn
-    {0xB58B0000u, 87u}, // lmn -> Telu
+    {0xB58B0000u, 88u}, // lmn -> Telu
     {0xB98B0000u, 46u}, // lmo -> Latn
     {0xBD8B0000u, 46u}, // lmp -> Latn
     {0x6C6E0000u, 46u}, // ln -> Latn
@@ -833,25 +835,25 @@
     {0xC5CB0000u, 46u}, // lor -> Latn
     {0xC9CB0000u, 46u}, // los -> Latn
     {0xE5CB0000u, 46u}, // loz -> Latn
-    {0x8A2B0000u,  1u}, // lrc -> Arab
+    {0x8A2B0000u,  2u}, // lrc -> Arab
     {0x6C740000u, 46u}, // lt -> Latn
     {0x9A6B0000u, 46u}, // ltg -> Latn
     {0x6C750000u, 46u}, // lu -> Latn
     {0x828B0000u, 46u}, // lua -> Latn
     {0xBA8B0000u, 46u}, // luo -> Latn
     {0xE28B0000u, 46u}, // luy -> Latn
-    {0xE68B0000u,  1u}, // luz -> Arab
+    {0xE68B0000u,  2u}, // luz -> Arab
     {0x6C760000u, 46u}, // lv -> Latn
-    {0xAECB0000u, 90u}, // lwl -> Thai
-    {0x9F2B0000u, 28u}, // lzh -> Hans
+    {0xAECB0000u, 91u}, // lwl -> Thai
+    {0x9F2B0000u, 29u}, // lzh -> Hans
     {0xE72B0000u, 46u}, // lzz -> Latn
     {0x8C0C0000u, 46u}, // mad -> Latn
     {0x940C0000u, 46u}, // maf -> Latn
-    {0x980C0000u, 18u}, // mag -> Deva
-    {0xA00C0000u, 18u}, // mai -> Deva
+    {0x980C0000u, 19u}, // mag -> Deva
+    {0xA00C0000u, 19u}, // mai -> Deva
     {0xA80C0000u, 46u}, // mak -> Latn
     {0xB40C0000u, 46u}, // man -> Latn
-    {0xB40C474Eu, 60u}, // man-GN -> Nkoo
+    {0xB40C474Eu, 61u}, // man-GN -> Nkoo
     {0xC80C0000u, 46u}, // mas -> Latn
     {0xD80C0000u, 46u}, // maw -> Latn
     {0xE40C0000u, 46u}, // maz -> Latn
@@ -866,12 +868,12 @@
     {0xC44C0000u, 46u}, // mcr -> Latn
     {0xD04C0000u, 46u}, // mcu -> Latn
     {0x806C0000u, 46u}, // mda -> Latn
-    {0x906C0000u,  1u}, // mde -> Arab
-    {0x946C0000u, 17u}, // mdf -> Cyrl
+    {0x906C0000u,  2u}, // mde -> Arab
+    {0x946C0000u, 18u}, // mdf -> Cyrl
     {0x9C6C0000u, 46u}, // mdh -> Latn
     {0xA46C0000u, 46u}, // mdj -> Latn
     {0xC46C0000u, 46u}, // mdr -> Latn
-    {0xDC6C0000u, 20u}, // mdx -> Ethi
+    {0xDC6C0000u, 21u}, // mdx -> Ethi
     {0x8C8C0000u, 46u}, // med -> Latn
     {0x908C0000u, 46u}, // mee -> Latn
     {0xA88C0000u, 46u}, // mek -> Latn
@@ -879,7 +881,7 @@
     {0xC48C0000u, 46u}, // mer -> Latn
     {0xCC8C0000u, 46u}, // met -> Latn
     {0xD08C0000u, 46u}, // meu -> Latn
-    {0x80AC0000u,  1u}, // mfa -> Arab
+    {0x80AC0000u,  2u}, // mfa -> Arab
     {0x90AC0000u, 46u}, // mfe -> Latn
     {0xB4AC0000u, 46u}, // mfn -> Latn
     {0xB8AC0000u, 46u}, // mfo -> Latn
@@ -888,7 +890,7 @@
     {0x9CCC0000u, 46u}, // mgh -> Latn
     {0xACCC0000u, 46u}, // mgl -> Latn
     {0xB8CC0000u, 46u}, // mgo -> Latn
-    {0xBCCC0000u, 18u}, // mgp -> Deva
+    {0xBCCC0000u, 19u}, // mgp -> Deva
     {0xE0CC0000u, 46u}, // mgy -> Latn
     {0x6D680000u, 46u}, // mh -> Latn
     {0xA0EC0000u, 46u}, // mhi -> Latn
@@ -896,26 +898,25 @@
     {0x6D690000u, 46u}, // mi -> Latn
     {0x950C0000u, 46u}, // mif -> Latn
     {0xB50C0000u, 46u}, // min -> Latn
-    {0xC90C0000u, 30u}, // mis -> Hatr
     {0xD90C0000u, 46u}, // miw -> Latn
-    {0x6D6B0000u, 17u}, // mk -> Cyrl
-    {0xA14C0000u,  1u}, // mki -> Arab
+    {0x6D6B0000u, 18u}, // mk -> Cyrl
+    {0xA14C0000u,  2u}, // mki -> Arab
     {0xAD4C0000u, 46u}, // mkl -> Latn
     {0xBD4C0000u, 46u}, // mkp -> Latn
     {0xD94C0000u, 46u}, // mkw -> Latn
-    {0x6D6C0000u, 55u}, // ml -> Mlym
+    {0x6D6C0000u, 56u}, // ml -> Mlym
     {0x916C0000u, 46u}, // mle -> Latn
     {0xBD6C0000u, 46u}, // mlp -> Latn
     {0xC96C0000u, 46u}, // mls -> Latn
     {0xB98C0000u, 46u}, // mmo -> Latn
     {0xD18C0000u, 46u}, // mmu -> Latn
     {0xDD8C0000u, 46u}, // mmx -> Latn
-    {0x6D6E0000u, 17u}, // mn -> Cyrl
-    {0x6D6E434Eu, 56u}, // mn-CN -> Mong
+    {0x6D6E0000u, 18u}, // mn -> Cyrl
+    {0x6D6E434Eu, 57u}, // mn-CN -> Mong
     {0x81AC0000u, 46u}, // mna -> Latn
     {0x95AC0000u, 46u}, // mnf -> Latn
-    {0xA1AC0000u,  7u}, // mni -> Beng
-    {0xD9AC0000u, 58u}, // mnw -> Mymr
+    {0xA1AC0000u,  8u}, // mni -> Beng
+    {0xD9AC0000u, 59u}, // mnw -> Mymr
     {0x6D6F0000u, 46u}, // mo -> Latn
     {0x81CC0000u, 46u}, // moa -> Latn
     {0x91CC0000u, 46u}, // moe -> Latn
@@ -927,39 +928,39 @@
     {0xCDEC0000u, 46u}, // mpt -> Latn
     {0xDDEC0000u, 46u}, // mpx -> Latn
     {0xAE0C0000u, 46u}, // mql -> Latn
-    {0x6D720000u, 18u}, // mr -> Deva
-    {0x8E2C0000u, 18u}, // mrd -> Deva
-    {0xA62C0000u, 17u}, // mrj -> Cyrl
-    {0xBA2C0000u, 57u}, // mro -> Mroo
+    {0x6D720000u, 19u}, // mr -> Deva
+    {0x8E2C0000u, 19u}, // mrd -> Deva
+    {0xA62C0000u, 18u}, // mrj -> Cyrl
+    {0xBA2C0000u, 58u}, // mro -> Mroo
     {0x6D730000u, 46u}, // ms -> Latn
-    {0x6D734343u,  1u}, // ms-CC -> Arab
+    {0x6D734343u,  2u}, // ms-CC -> Arab
     {0x6D740000u, 46u}, // mt -> Latn
     {0x8A6C0000u, 46u}, // mtc -> Latn
     {0x966C0000u, 46u}, // mtf -> Latn
     {0xA26C0000u, 46u}, // mti -> Latn
-    {0xC66C0000u, 18u}, // mtr -> Deva
+    {0xC66C0000u, 19u}, // mtr -> Deva
     {0x828C0000u, 46u}, // mua -> Latn
     {0xC68C0000u, 46u}, // mur -> Latn
     {0xCA8C0000u, 46u}, // mus -> Latn
     {0x82AC0000u, 46u}, // mva -> Latn
     {0xB6AC0000u, 46u}, // mvn -> Latn
-    {0xE2AC0000u,  1u}, // mvy -> Arab
+    {0xE2AC0000u,  2u}, // mvy -> Arab
     {0xAACC0000u, 46u}, // mwk -> Latn
-    {0xC6CC0000u, 18u}, // mwr -> Deva
+    {0xC6CC0000u, 19u}, // mwr -> Deva
     {0xD6CC0000u, 46u}, // mwv -> Latn
     {0xDACC0000u, 34u}, // mww -> Hmnp
     {0x8AEC0000u, 46u}, // mxc -> Latn
     {0xB2EC0000u, 46u}, // mxm -> Latn
-    {0x6D790000u, 58u}, // my -> Mymr
+    {0x6D790000u, 59u}, // my -> Mymr
     {0xAB0C0000u, 46u}, // myk -> Latn
-    {0xB30C0000u, 20u}, // mym -> Ethi
-    {0xD70C0000u, 17u}, // myv -> Cyrl
+    {0xB30C0000u, 21u}, // mym -> Ethi
+    {0xD70C0000u, 18u}, // myv -> Cyrl
     {0xDB0C0000u, 46u}, // myw -> Latn
     {0xDF0C0000u, 46u}, // myx -> Latn
     {0xE70C0000u, 52u}, // myz -> Mand
     {0xAB2C0000u, 46u}, // mzk -> Latn
     {0xB32C0000u, 46u}, // mzm -> Latn
-    {0xB72C0000u,  1u}, // mzn -> Arab
+    {0xB72C0000u,  2u}, // mzn -> Arab
     {0xBF2C0000u, 46u}, // mzp -> Latn
     {0xDB2C0000u, 46u}, // mzw -> Latn
     {0xE72C0000u, 46u}, // mzz -> Latn
@@ -967,7 +968,7 @@
     {0x880D0000u, 46u}, // nac -> Latn
     {0x940D0000u, 46u}, // naf -> Latn
     {0xA80D0000u, 46u}, // nak -> Latn
-    {0xB40D0000u, 28u}, // nan -> Hans
+    {0xB40D0000u, 29u}, // nan -> Hans
     {0xBC0D0000u, 46u}, // nap -> Latn
     {0xC00D0000u, 46u}, // naq -> Latn
     {0xC80D0000u, 46u}, // nas -> Latn
@@ -981,9 +982,9 @@
     {0x6E640000u, 46u}, // nd -> Latn
     {0x886D0000u, 46u}, // ndc -> Latn
     {0xC86D0000u, 46u}, // nds -> Latn
-    {0x6E650000u, 18u}, // ne -> Deva
+    {0x6E650000u, 19u}, // ne -> Deva
     {0x848D0000u, 46u}, // neb -> Latn
-    {0xD88D0000u, 18u}, // new -> Deva
+    {0xD88D0000u, 19u}, // new -> Deva
     {0xDC8D0000u, 46u}, // nex -> Latn
     {0xC4AD0000u, 46u}, // nfr -> Latn
     {0x6E670000u, 46u}, // ng -> Latn
@@ -1011,17 +1012,17 @@
     {0x9DAD0000u, 46u}, // nnh -> Latn
     {0xA9AD0000u, 46u}, // nnk -> Latn
     {0xB1AD0000u, 46u}, // nnm -> Latn
-    {0xBDAD0000u, 94u}, // nnp -> Wcho
+    {0xBDAD0000u, 95u}, // nnp -> Wcho
     {0x6E6F0000u, 46u}, // no -> Latn
     {0x8DCD0000u, 44u}, // nod -> Lana
-    {0x91CD0000u, 18u}, // noe -> Deva
-    {0xB5CD0000u, 72u}, // non -> Runr
+    {0x91CD0000u, 19u}, // noe -> Deva
+    {0xB5CD0000u, 73u}, // non -> Runr
     {0xBDCD0000u, 46u}, // nop -> Latn
     {0xD1CD0000u, 46u}, // nou -> Latn
-    {0xBA0D0000u, 60u}, // nqo -> Nkoo
+    {0xBA0D0000u, 61u}, // nqo -> Nkoo
     {0x6E720000u, 46u}, // nr -> Latn
     {0x862D0000u, 46u}, // nrb -> Latn
-    {0xAA4D0000u, 10u}, // nsk -> Cans
+    {0xAA4D0000u, 11u}, // nsk -> Cans
     {0xB64D0000u, 46u}, // nsn -> Latn
     {0xBA4D0000u, 46u}, // nso -> Latn
     {0xCA4D0000u, 46u}, // nss -> Latn
@@ -1049,18 +1050,18 @@
     {0xB5AE0000u, 46u}, // onn -> Latn
     {0xC9AE0000u, 46u}, // ons -> Latn
     {0xB1EE0000u, 46u}, // opm -> Latn
-    {0x6F720000u, 65u}, // or -> Orya
+    {0x6F720000u, 66u}, // or -> Orya
     {0xBA2E0000u, 46u}, // oro -> Latn
-    {0xD22E0000u,  1u}, // oru -> Arab
-    {0x6F730000u, 17u}, // os -> Cyrl
-    {0x824E0000u, 66u}, // osa -> Osge
-    {0x826E0000u,  1u}, // ota -> Arab
-    {0xAA6E0000u, 64u}, // otk -> Orkh
+    {0xD22E0000u,  2u}, // oru -> Arab
+    {0x6F730000u, 18u}, // os -> Cyrl
+    {0x824E0000u, 67u}, // osa -> Osge
+    {0x826E0000u,  2u}, // ota -> Arab
+    {0xAA6E0000u, 65u}, // otk -> Orkh
     {0xB32E0000u, 46u}, // ozm -> Latn
-    {0x70610000u, 27u}, // pa -> Guru
-    {0x7061504Bu,  1u}, // pa-PK -> Arab
+    {0x70610000u, 28u}, // pa -> Guru
+    {0x7061504Bu,  2u}, // pa-PK -> Arab
     {0x980F0000u, 46u}, // pag -> Latn
-    {0xAC0F0000u, 68u}, // pal -> Phli
+    {0xAC0F0000u, 69u}, // pal -> Phli
     {0xB00F0000u, 46u}, // pam -> Latn
     {0xBC0F0000u, 46u}, // pap -> Latn
     {0xD00F0000u, 46u}, // pau -> Latn
@@ -1070,28 +1071,28 @@
     {0x886F0000u, 46u}, // pdc -> Latn
     {0xCC6F0000u, 46u}, // pdt -> Latn
     {0x8C8F0000u, 46u}, // ped -> Latn
-    {0xB88F0000u, 95u}, // peo -> Xpeo
+    {0xB88F0000u, 96u}, // peo -> Xpeo
     {0xDC8F0000u, 46u}, // pex -> Latn
     {0xACAF0000u, 46u}, // pfl -> Latn
-    {0xACEF0000u,  1u}, // phl -> Arab
-    {0xB4EF0000u, 69u}, // phn -> Phnx
+    {0xACEF0000u,  2u}, // phl -> Arab
+    {0xB4EF0000u, 70u}, // phn -> Phnx
     {0xAD0F0000u, 46u}, // pil -> Latn
     {0xBD0F0000u, 46u}, // pip -> Latn
-    {0x814F0000u,  8u}, // pka -> Brah
+    {0x814F0000u,  9u}, // pka -> Brah
     {0xB94F0000u, 46u}, // pko -> Latn
     {0x706C0000u, 46u}, // pl -> Latn
     {0x816F0000u, 46u}, // pla -> Latn
     {0xC98F0000u, 46u}, // pms -> Latn
     {0x99AF0000u, 46u}, // png -> Latn
     {0xB5AF0000u, 46u}, // pnn -> Latn
-    {0xCDAF0000u, 25u}, // pnt -> Grek
+    {0xCDAF0000u, 26u}, // pnt -> Grek
     {0xB5CF0000u, 46u}, // pon -> Latn
-    {0x81EF0000u, 18u}, // ppa -> Deva
+    {0x81EF0000u, 19u}, // ppa -> Deva
     {0xB9EF0000u, 46u}, // ppo -> Latn
     {0x822F0000u, 39u}, // pra -> Khar
-    {0x8E2F0000u,  1u}, // prd -> Arab
+    {0x8E2F0000u,  2u}, // prd -> Arab
     {0x9A2F0000u, 46u}, // prg -> Latn
-    {0x70730000u,  1u}, // ps -> Arab
+    {0x70730000u,  2u}, // ps -> Arab
     {0xCA4F0000u, 46u}, // pss -> Latn
     {0x70740000u, 46u}, // pt -> Latn
     {0xBE6F0000u, 46u}, // ptp -> Latn
@@ -1101,23 +1102,23 @@
     {0x8A900000u, 46u}, // quc -> Latn
     {0x9A900000u, 46u}, // qug -> Latn
     {0xA0110000u, 46u}, // rai -> Latn
-    {0xA4110000u, 18u}, // raj -> Deva
+    {0xA4110000u, 19u}, // raj -> Deva
     {0xB8110000u, 46u}, // rao -> Latn
     {0x94510000u, 46u}, // rcf -> Latn
     {0xA4910000u, 46u}, // rej -> Latn
     {0xAC910000u, 46u}, // rel -> Latn
     {0xC8910000u, 46u}, // res -> Latn
     {0xB4D10000u, 46u}, // rgn -> Latn
-    {0x98F10000u,  1u}, // rhg -> Arab
+    {0x98F10000u,  2u}, // rhg -> Arab
     {0x81110000u, 46u}, // ria -> Latn
-    {0x95110000u, 88u}, // rif -> Tfng
+    {0x95110000u, 89u}, // rif -> Tfng
     {0x95114E4Cu, 46u}, // rif-NL -> Latn
-    {0xC9310000u, 18u}, // rjs -> Deva
-    {0xCD510000u,  7u}, // rkt -> Beng
+    {0xC9310000u, 19u}, // rjs -> Deva
+    {0xCD510000u,  8u}, // rkt -> Beng
     {0x726D0000u, 46u}, // rm -> Latn
     {0x95910000u, 46u}, // rmf -> Latn
     {0xB9910000u, 46u}, // rmo -> Latn
-    {0xCD910000u,  1u}, // rmt -> Arab
+    {0xCD910000u,  2u}, // rmt -> Arab
     {0xD1910000u, 46u}, // rmu -> Latn
     {0x726E0000u, 46u}, // rn -> Latn
     {0x81B10000u, 46u}, // rna -> Latn
@@ -1128,49 +1129,49 @@
     {0xB9D10000u, 46u}, // roo -> Latn
     {0xBA310000u, 46u}, // rro -> Latn
     {0xB2710000u, 46u}, // rtm -> Latn
-    {0x72750000u, 17u}, // ru -> Cyrl
-    {0x92910000u, 17u}, // rue -> Cyrl
+    {0x72750000u, 18u}, // ru -> Cyrl
+    {0x92910000u, 18u}, // rue -> Cyrl
     {0x9A910000u, 46u}, // rug -> Latn
     {0x72770000u, 46u}, // rw -> Latn
     {0xAAD10000u, 46u}, // rwk -> Latn
     {0xBAD10000u, 46u}, // rwo -> Latn
     {0xD3110000u, 38u}, // ryu -> Kana
-    {0x73610000u, 18u}, // sa -> Deva
+    {0x73610000u, 19u}, // sa -> Deva
     {0x94120000u, 46u}, // saf -> Latn
-    {0x9C120000u, 17u}, // sah -> Cyrl
+    {0x9C120000u, 18u}, // sah -> Cyrl
     {0xC0120000u, 46u}, // saq -> Latn
     {0xC8120000u, 46u}, // sas -> Latn
-    {0xCC120000u, 63u}, // sat -> Olck
+    {0xCC120000u, 64u}, // sat -> Olck
     {0xD4120000u, 46u}, // sav -> Latn
-    {0xE4120000u, 75u}, // saz -> Saur
+    {0xE4120000u, 76u}, // saz -> Saur
     {0x80320000u, 46u}, // sba -> Latn
     {0x90320000u, 46u}, // sbe -> Latn
     {0xBC320000u, 46u}, // sbp -> Latn
     {0x73630000u, 46u}, // sc -> Latn
-    {0xA8520000u, 18u}, // sck -> Deva
-    {0xAC520000u,  1u}, // scl -> Arab
+    {0xA8520000u, 19u}, // sck -> Deva
+    {0xAC520000u,  2u}, // scl -> Arab
     {0xB4520000u, 46u}, // scn -> Latn
     {0xB8520000u, 46u}, // sco -> Latn
     {0xC8520000u, 46u}, // scs -> Latn
-    {0x73640000u,  1u}, // sd -> Arab
+    {0x73640000u,  2u}, // sd -> Arab
     {0x88720000u, 46u}, // sdc -> Latn
-    {0x9C720000u,  1u}, // sdh -> Arab
+    {0x9C720000u,  2u}, // sdh -> Arab
     {0x73650000u, 46u}, // se -> Latn
     {0x94920000u, 46u}, // sef -> Latn
     {0x9C920000u, 46u}, // seh -> Latn
     {0xA0920000u, 46u}, // sei -> Latn
     {0xC8920000u, 46u}, // ses -> Latn
     {0x73670000u, 46u}, // sg -> Latn
-    {0x80D20000u, 62u}, // sga -> Ogam
+    {0x80D20000u, 63u}, // sga -> Ogam
     {0xC8D20000u, 46u}, // sgs -> Latn
-    {0xD8D20000u, 20u}, // sgw -> Ethi
+    {0xD8D20000u, 21u}, // sgw -> Ethi
     {0xE4D20000u, 46u}, // sgz -> Latn
     {0x73680000u, 46u}, // sh -> Latn
-    {0xA0F20000u, 88u}, // shi -> Tfng
+    {0xA0F20000u, 89u}, // shi -> Tfng
     {0xA8F20000u, 46u}, // shk -> Latn
-    {0xB4F20000u, 58u}, // shn -> Mymr
-    {0xD0F20000u,  1u}, // shu -> Arab
-    {0x73690000u, 77u}, // si -> Sinh
+    {0xB4F20000u, 59u}, // shn -> Mymr
+    {0xD0F20000u,  2u}, // shu -> Arab
+    {0x73690000u, 78u}, // si -> Sinh
     {0x8D120000u, 46u}, // sid -> Latn
     {0x99120000u, 46u}, // sig -> Latn
     {0xAD120000u, 46u}, // sil -> Latn
@@ -1178,7 +1179,7 @@
     {0xC5320000u, 46u}, // sjr -> Latn
     {0x736B0000u, 46u}, // sk -> Latn
     {0x89520000u, 46u}, // skc -> Latn
-    {0xC5520000u,  1u}, // skr -> Arab
+    {0xC5520000u,  2u}, // skr -> Arab
     {0xC9520000u, 46u}, // sks -> Latn
     {0x736C0000u, 46u}, // sl -> Latn
     {0x8D720000u, 46u}, // sld -> Latn
@@ -1189,7 +1190,7 @@
     {0x81920000u, 46u}, // sma -> Latn
     {0xA5920000u, 46u}, // smj -> Latn
     {0xB5920000u, 46u}, // smn -> Latn
-    {0xBD920000u, 73u}, // smp -> Samr
+    {0xBD920000u, 74u}, // smp -> Samr
     {0xC1920000u, 46u}, // smq -> Latn
     {0xC9920000u, 46u}, // sms -> Latn
     {0x736E0000u, 46u}, // sn -> Latn
@@ -1199,24 +1200,24 @@
     {0xDDB20000u, 46u}, // snx -> Latn
     {0xE1B20000u, 46u}, // sny -> Latn
     {0x736F0000u, 46u}, // so -> Latn
-    {0x99D20000u, 78u}, // sog -> Sogd
+    {0x99D20000u, 79u}, // sog -> Sogd
     {0xA9D20000u, 46u}, // sok -> Latn
     {0xC1D20000u, 46u}, // soq -> Latn
-    {0xD1D20000u, 90u}, // sou -> Thai
+    {0xD1D20000u, 91u}, // sou -> Thai
     {0xE1D20000u, 46u}, // soy -> Latn
     {0x8DF20000u, 46u}, // spd -> Latn
     {0xADF20000u, 46u}, // spl -> Latn
     {0xC9F20000u, 46u}, // sps -> Latn
     {0x73710000u, 46u}, // sq -> Latn
-    {0x73720000u, 17u}, // sr -> Cyrl
+    {0x73720000u, 18u}, // sr -> Cyrl
     {0x73724D45u, 46u}, // sr-ME -> Latn
     {0x7372524Fu, 46u}, // sr-RO -> Latn
     {0x73725255u, 46u}, // sr-RU -> Latn
     {0x73725452u, 46u}, // sr-TR -> Latn
-    {0x86320000u, 79u}, // srb -> Sora
+    {0x86320000u, 80u}, // srb -> Sora
     {0xB6320000u, 46u}, // srn -> Latn
     {0xC6320000u, 46u}, // srr -> Latn
-    {0xDE320000u, 18u}, // srx -> Deva
+    {0xDE320000u, 19u}, // srx -> Deva
     {0x73730000u, 46u}, // ss -> Latn
     {0x8E520000u, 46u}, // ssd -> Latn
     {0x9A520000u, 46u}, // ssg -> Latn
@@ -1232,18 +1233,18 @@
     {0xCA920000u, 46u}, // sus -> Latn
     {0x73760000u, 46u}, // sv -> Latn
     {0x73770000u, 46u}, // sw -> Latn
-    {0x86D20000u,  1u}, // swb -> Arab
+    {0x86D20000u,  2u}, // swb -> Arab
     {0x8AD20000u, 46u}, // swc -> Latn
     {0x9AD20000u, 46u}, // swg -> Latn
     {0xBED20000u, 46u}, // swp -> Latn
-    {0xD6D20000u, 18u}, // swv -> Deva
+    {0xD6D20000u, 19u}, // swv -> Deva
     {0xB6F20000u, 46u}, // sxn -> Latn
     {0xDAF20000u, 46u}, // sxw -> Latn
-    {0xAF120000u,  7u}, // syl -> Beng
-    {0xC7120000u, 81u}, // syr -> Syrc
+    {0xAF120000u,  8u}, // syl -> Beng
+    {0xC7120000u, 82u}, // syr -> Syrc
     {0xAF320000u, 46u}, // szl -> Latn
-    {0x74610000u, 84u}, // ta -> Taml
-    {0xA4130000u, 18u}, // taj -> Deva
+    {0x74610000u, 85u}, // ta -> Taml
+    {0xA4130000u, 19u}, // taj -> Deva
     {0xAC130000u, 46u}, // tal -> Latn
     {0xB4130000u, 46u}, // tan -> Latn
     {0xC0130000u, 46u}, // taq -> Latn
@@ -1256,28 +1257,28 @@
     {0xE4330000u, 46u}, // tbz -> Latn
     {0xA0530000u, 46u}, // tci -> Latn
     {0xE0530000u, 42u}, // tcy -> Knda
-    {0x8C730000u, 82u}, // tdd -> Tale
-    {0x98730000u, 18u}, // tdg -> Deva
-    {0x9C730000u, 18u}, // tdh -> Deva
+    {0x8C730000u, 83u}, // tdd -> Tale
+    {0x98730000u, 19u}, // tdg -> Deva
+    {0x9C730000u, 19u}, // tdh -> Deva
     {0xD0730000u, 46u}, // tdu -> Latn
-    {0x74650000u, 87u}, // te -> Telu
+    {0x74650000u, 88u}, // te -> Telu
     {0x8C930000u, 46u}, // ted -> Latn
     {0xB0930000u, 46u}, // tem -> Latn
     {0xB8930000u, 46u}, // teo -> Latn
     {0xCC930000u, 46u}, // tet -> Latn
     {0xA0B30000u, 46u}, // tfi -> Latn
-    {0x74670000u, 17u}, // tg -> Cyrl
-    {0x7467504Bu,  1u}, // tg-PK -> Arab
+    {0x74670000u, 18u}, // tg -> Cyrl
+    {0x7467504Bu,  2u}, // tg-PK -> Arab
     {0x88D30000u, 46u}, // tgc -> Latn
     {0xB8D30000u, 46u}, // tgo -> Latn
     {0xD0D30000u, 46u}, // tgu -> Latn
-    {0x74680000u, 90u}, // th -> Thai
-    {0xACF30000u, 18u}, // thl -> Deva
-    {0xC0F30000u, 18u}, // thq -> Deva
-    {0xC4F30000u, 18u}, // thr -> Deva
-    {0x74690000u, 20u}, // ti -> Ethi
+    {0x74680000u, 91u}, // th -> Thai
+    {0xACF30000u, 19u}, // thl -> Deva
+    {0xC0F30000u, 19u}, // thq -> Deva
+    {0xC4F30000u, 19u}, // thr -> Deva
+    {0x74690000u, 21u}, // ti -> Ethi
     {0x95130000u, 46u}, // tif -> Latn
-    {0x99130000u, 20u}, // tig -> Ethi
+    {0x99130000u, 21u}, // tig -> Ethi
     {0xA9130000u, 46u}, // tik -> Latn
     {0xB1130000u, 46u}, // tim -> Latn
     {0xB9130000u, 46u}, // tio -> Latn
@@ -1285,7 +1286,7 @@
     {0x746B0000u, 46u}, // tk -> Latn
     {0xAD530000u, 46u}, // tkl -> Latn
     {0xC5530000u, 46u}, // tkr -> Latn
-    {0xCD530000u, 18u}, // tkt -> Deva
+    {0xCD530000u, 19u}, // tkt -> Deva
     {0x746C0000u, 46u}, // tl -> Latn
     {0x95730000u, 46u}, // tlf -> Latn
     {0xDD730000u, 46u}, // tlx -> Latn
@@ -1305,19 +1306,19 @@
     {0x74720000u, 46u}, // tr -> Latn
     {0xD2330000u, 46u}, // tru -> Latn
     {0xD6330000u, 46u}, // trv -> Latn
-    {0xDA330000u,  1u}, // trw -> Arab
+    {0xDA330000u,  2u}, // trw -> Arab
     {0x74730000u, 46u}, // ts -> Latn
-    {0x8E530000u, 25u}, // tsd -> Grek
-    {0x96530000u, 18u}, // tsf -> Deva
+    {0x8E530000u, 26u}, // tsd -> Grek
+    {0x96530000u, 19u}, // tsf -> Deva
     {0x9A530000u, 46u}, // tsg -> Latn
-    {0xA6530000u, 91u}, // tsj -> Tibt
+    {0xA6530000u, 92u}, // tsj -> Tibt
     {0xDA530000u, 46u}, // tsw -> Latn
-    {0x74740000u, 17u}, // tt -> Cyrl
+    {0x74740000u, 18u}, // tt -> Cyrl
     {0x8E730000u, 46u}, // ttd -> Latn
     {0x92730000u, 46u}, // tte -> Latn
     {0xA6730000u, 46u}, // ttj -> Latn
     {0xC6730000u, 46u}, // ttr -> Latn
-    {0xCA730000u, 90u}, // tts -> Thai
+    {0xCA730000u, 91u}, // tts -> Thai
     {0xCE730000u, 46u}, // ttt -> Latn
     {0x9E930000u, 46u}, // tuh -> Latn
     {0xAE930000u, 46u}, // tul -> Latn
@@ -1328,25 +1329,26 @@
     {0xD2B30000u, 46u}, // tvu -> Latn
     {0x9ED30000u, 46u}, // twh -> Latn
     {0xC2D30000u, 46u}, // twq -> Latn
-    {0x9AF30000u, 85u}, // txg -> Tang
+    {0x9AF30000u, 86u}, // txg -> Tang
     {0x74790000u, 46u}, // ty -> Latn
     {0x83130000u, 46u}, // tya -> Latn
-    {0xD7130000u, 17u}, // tyv -> Cyrl
+    {0xD7130000u, 18u}, // tyv -> Cyrl
     {0xB3330000u, 46u}, // tzm -> Latn
     {0xD0340000u, 46u}, // ubu -> Latn
-    {0xB0740000u, 17u}, // udm -> Cyrl
-    {0x75670000u,  1u}, // ug -> Arab
-    {0x75674B5Au, 17u}, // ug-KZ -> Cyrl
-    {0x75674D4Eu, 17u}, // ug-MN -> Cyrl
-    {0x80D40000u, 92u}, // uga -> Ugar
-    {0x756B0000u, 17u}, // uk -> Cyrl
+    {0xA0740000u,  0u}, // udi -> Aghb
+    {0xB0740000u, 18u}, // udm -> Cyrl
+    {0x75670000u,  2u}, // ug -> Arab
+    {0x75674B5Au, 18u}, // ug-KZ -> Cyrl
+    {0x75674D4Eu, 18u}, // ug-MN -> Cyrl
+    {0x80D40000u, 93u}, // uga -> Ugar
+    {0x756B0000u, 18u}, // uk -> Cyrl
     {0xA1740000u, 46u}, // uli -> Latn
     {0x85940000u, 46u}, // umb -> Latn
-    {0xC5B40000u,  7u}, // unr -> Beng
-    {0xC5B44E50u, 18u}, // unr-NP -> Deva
-    {0xDDB40000u,  7u}, // unx -> Beng
+    {0xC5B40000u,  8u}, // unr -> Beng
+    {0xC5B44E50u, 19u}, // unr-NP -> Deva
+    {0xDDB40000u,  8u}, // unx -> Beng
     {0xA9D40000u, 46u}, // uok -> Latn
-    {0x75720000u,  1u}, // ur -> Arab
+    {0x75720000u,  2u}, // ur -> Arab
     {0xA2340000u, 46u}, // uri -> Latn
     {0xCE340000u, 46u}, // urt -> Latn
     {0xDA340000u, 46u}, // urw -> Latn
@@ -1356,10 +1358,10 @@
     {0x9EB40000u, 46u}, // uvh -> Latn
     {0xAEB40000u, 46u}, // uvl -> Latn
     {0x757A0000u, 46u}, // uz -> Latn
-    {0x757A4146u,  1u}, // uz-AF -> Arab
-    {0x757A434Eu, 17u}, // uz-CN -> Cyrl
+    {0x757A4146u,  2u}, // uz-AF -> Arab
+    {0x757A434Eu, 18u}, // uz-CN -> Cyrl
     {0x98150000u, 46u}, // vag -> Latn
-    {0xA0150000u, 93u}, // vai -> Vaii
+    {0xA0150000u, 94u}, // vai -> Vaii
     {0xB4150000u, 46u}, // van -> Latn
     {0x76650000u, 46u}, // ve -> Latn
     {0x88950000u, 46u}, // vec -> Latn
@@ -1378,12 +1380,12 @@
     {0x77610000u, 46u}, // wa -> Latn
     {0x90160000u, 46u}, // wae -> Latn
     {0xA4160000u, 46u}, // waj -> Latn
-    {0xAC160000u, 20u}, // wal -> Ethi
+    {0xAC160000u, 21u}, // wal -> Ethi
     {0xB4160000u, 46u}, // wan -> Latn
     {0xC4160000u, 46u}, // war -> Latn
     {0xBC360000u, 46u}, // wbp -> Latn
-    {0xC0360000u, 87u}, // wbq -> Telu
-    {0xC4360000u, 18u}, // wbr -> Deva
+    {0xC0360000u, 88u}, // wbq -> Telu
+    {0xC4360000u, 19u}, // wbr -> Deva
     {0xA0560000u, 46u}, // wci -> Latn
     {0xC4960000u, 46u}, // wer -> Latn
     {0xA0D60000u, 46u}, // wgi -> Latn
@@ -1396,40 +1398,40 @@
     {0xC9760000u, 46u}, // wls -> Latn
     {0xB9960000u, 46u}, // wmo -> Latn
     {0x89B60000u, 46u}, // wnc -> Latn
-    {0xA1B60000u,  1u}, // wni -> Arab
+    {0xA1B60000u,  2u}, // wni -> Arab
     {0xD1B60000u, 46u}, // wnu -> Latn
     {0x776F0000u, 46u}, // wo -> Latn
     {0x85D60000u, 46u}, // wob -> Latn
     {0xC9D60000u, 46u}, // wos -> Latn
     {0xCA360000u, 46u}, // wrs -> Latn
-    {0x9A560000u, 22u}, // wsg -> Gong
+    {0x9A560000u, 23u}, // wsg -> Gong
     {0xAA560000u, 46u}, // wsk -> Latn
-    {0xB2760000u, 18u}, // wtm -> Deva
-    {0xD2960000u, 28u}, // wuu -> Hans
+    {0xB2760000u, 19u}, // wtm -> Deva
+    {0xD2960000u, 29u}, // wuu -> Hans
     {0xD6960000u, 46u}, // wuv -> Latn
     {0x82D60000u, 46u}, // wwa -> Latn
     {0xD4170000u, 46u}, // xav -> Latn
     {0xA0370000u, 46u}, // xbi -> Latn
-    {0xB8570000u, 14u}, // xco -> Chrs
-    {0xC4570000u, 11u}, // xcr -> Cari
+    {0xB8570000u, 15u}, // xco -> Chrs
+    {0xC4570000u, 12u}, // xcr -> Cari
     {0xC8970000u, 46u}, // xes -> Latn
     {0x78680000u, 46u}, // xh -> Latn
     {0x81770000u, 46u}, // xla -> Latn
     {0x89770000u, 50u}, // xlc -> Lyci
     {0x8D770000u, 51u}, // xld -> Lydi
-    {0x95970000u, 21u}, // xmf -> Geor
+    {0x95970000u, 22u}, // xmf -> Geor
     {0xB5970000u, 53u}, // xmn -> Mani
-    {0xC5970000u, 54u}, // xmr -> Merc
-    {0x81B70000u, 59u}, // xna -> Narb
-    {0xC5B70000u, 18u}, // xnr -> Deva
+    {0xC5970000u, 55u}, // xmr -> Merc
+    {0x81B70000u, 60u}, // xna -> Narb
+    {0xC5B70000u, 19u}, // xnr -> Deva
     {0x99D70000u, 46u}, // xog -> Latn
     {0xB5D70000u, 46u}, // xon -> Latn
-    {0xC5F70000u, 71u}, // xpr -> Prti
+    {0xC5F70000u, 72u}, // xpr -> Prti
     {0x86370000u, 46u}, // xrb -> Latn
-    {0x82570000u, 74u}, // xsa -> Sarb
+    {0x82570000u, 75u}, // xsa -> Sarb
     {0xA2570000u, 46u}, // xsi -> Latn
     {0xB2570000u, 46u}, // xsm -> Latn
-    {0xC6570000u, 18u}, // xsr -> Deva
+    {0xC6570000u, 19u}, // xsr -> Deva
     {0x92D70000u, 46u}, // xwe -> Latn
     {0xB0180000u, 46u}, // yam -> Latn
     {0xB8180000u, 46u}, // yao -> Latn
@@ -1458,33 +1460,33 @@
     {0xAE380000u, 46u}, // yrl -> Latn
     {0xCA580000u, 46u}, // yss -> Latn
     {0x82980000u, 46u}, // yua -> Latn
-    {0x92980000u, 29u}, // yue -> Hant
-    {0x9298434Eu, 28u}, // yue-CN -> Hans
+    {0x92980000u, 30u}, // yue -> Hant
+    {0x9298434Eu, 29u}, // yue-CN -> Hans
     {0xA6980000u, 46u}, // yuj -> Latn
     {0xCE980000u, 46u}, // yut -> Latn
     {0xDA980000u, 46u}, // yuw -> Latn
     {0x7A610000u, 46u}, // za -> Latn
     {0x98190000u, 46u}, // zag -> Latn
-    {0xA4790000u,  1u}, // zdj -> Arab
+    {0xA4790000u,  2u}, // zdj -> Arab
     {0x80990000u, 46u}, // zea -> Latn
-    {0x9CD90000u, 88u}, // zgh -> Tfng
-    {0x7A680000u, 28u}, // zh -> Hans
-    {0x7A684155u, 29u}, // zh-AU -> Hant
-    {0x7A68424Eu, 29u}, // zh-BN -> Hant
-    {0x7A684742u, 29u}, // zh-GB -> Hant
-    {0x7A684746u, 29u}, // zh-GF -> Hant
-    {0x7A68484Bu, 29u}, // zh-HK -> Hant
-    {0x7A684944u, 29u}, // zh-ID -> Hant
-    {0x7A684D4Fu, 29u}, // zh-MO -> Hant
-    {0x7A685041u, 29u}, // zh-PA -> Hant
-    {0x7A685046u, 29u}, // zh-PF -> Hant
-    {0x7A685048u, 29u}, // zh-PH -> Hant
-    {0x7A685352u, 29u}, // zh-SR -> Hant
-    {0x7A685448u, 29u}, // zh-TH -> Hant
-    {0x7A685457u, 29u}, // zh-TW -> Hant
-    {0x7A685553u, 29u}, // zh-US -> Hant
-    {0x7A68564Eu, 29u}, // zh-VN -> Hant
-    {0xDCF90000u, 61u}, // zhx -> Nshu
+    {0x9CD90000u, 89u}, // zgh -> Tfng
+    {0x7A680000u, 29u}, // zh -> Hans
+    {0x7A684155u, 30u}, // zh-AU -> Hant
+    {0x7A68424Eu, 30u}, // zh-BN -> Hant
+    {0x7A684742u, 30u}, // zh-GB -> Hant
+    {0x7A684746u, 30u}, // zh-GF -> Hant
+    {0x7A68484Bu, 30u}, // zh-HK -> Hant
+    {0x7A684944u, 30u}, // zh-ID -> Hant
+    {0x7A684D4Fu, 30u}, // zh-MO -> Hant
+    {0x7A685041u, 30u}, // zh-PA -> Hant
+    {0x7A685046u, 30u}, // zh-PF -> Hant
+    {0x7A685048u, 30u}, // zh-PH -> Hant
+    {0x7A685352u, 30u}, // zh-SR -> Hant
+    {0x7A685448u, 30u}, // zh-TH -> Hant
+    {0x7A685457u, 30u}, // zh-TW -> Hant
+    {0x7A685553u, 30u}, // zh-US -> Hant
+    {0x7A68564Eu, 30u}, // zh-VN -> Hant
+    {0xDCF90000u, 62u}, // zhx -> Nshu
     {0x81190000u, 46u}, // zia -> Latn
     {0xCD590000u, 41u}, // zkt -> Kits
     {0xB1790000u, 46u}, // zlm -> Latn
@@ -1642,6 +1644,7 @@
     0xB48343414C61746ELLU, // den_Latn_CA
     0xC4C343414C61746ELLU, // dgr_Latn_CA
     0x91234E454C61746ELLU, // dje_Latn_NE
+    0x95834E474D656466LLU, // dmf_Medf_NG
     0xA5A343494C61746ELLU, // dnj_Latn_CI
     0xA1C3494E44657661LLU, // doi_Deva_IN
     0x9E23434E4D6F6E67LLU, // drh_Mong_CN
@@ -1917,8 +1920,6 @@
     0x6D684D484C61746ELLU, // mh_Latn_MH
     0x6D694E5A4C61746ELLU, // mi_Latn_NZ
     0xB50C49444C61746ELLU, // min_Latn_ID
-    0xC90C495148617472LLU, // mis_Hatr_IQ
-    0xC90C4E474D656466LLU, // mis_Medf_NG
     0x6D6B4D4B4379726CLLU, // mk_Cyrl_MK
     0x6D6C494E4D6C796DLLU, // ml_Mlym_IN
     0xC96C53444C61746ELLU, // mls_Latn_SD
@@ -2174,6 +2175,7 @@
     0x747950464C61746ELLU, // ty_Latn_PF
     0xD71352554379726CLLU, // tyv_Cyrl_RU
     0xB3334D414C61746ELLU, // tzm_Latn_MA
+    0xA074525541676862LLU, // udi_Aghb_RU
     0xB07452554379726CLLU, // udm_Cyrl_RU
     0x7567434E41726162LLU, // ug_Arab_CN
     0x75674B5A4379726CLLU, // ug_Cyrl_KZ
@@ -2382,6 +2384,8 @@
     {0x65735553u, 0x6573A424u}, // es-US -> es-419
     {0x65735559u, 0x6573A424u}, // es-UY -> es-419
     {0x65735645u, 0x6573A424u}, // es-VE -> es-419
+    {0x6E620000u, 0x6E6F0000u}, // nb -> no
+    {0x6E6E0000u, 0x6E6F0000u}, // nn -> no
     {0x7074414Fu, 0x70745054u}, // pt-AO -> pt-PT
     {0x70744348u, 0x70745054u}, // pt-CH -> pt-PT
     {0x70744356u, 0x70745054u}, // pt-CV -> pt-PT
diff --git a/libs/androidfw/PosixUtils.cpp b/libs/androidfw/PosixUtils.cpp
index 4ec525a..0269128 100644
--- a/libs/androidfw/PosixUtils.cpp
+++ b/libs/androidfw/PosixUtils.cpp
@@ -114,10 +114,10 @@
       std::unique_ptr<ProcResult> result(new ProcResult());
       result->status = status;
       const auto out = ReadFile(stdout[0]);
-      result->stdout = out ? *out : "";
+      result->stdout_str = out ? *out : "";
       close(stdout[0]);
       const auto err = ReadFile(stderr[0]);
-      result->stderr = err ? *err : "";
+      result->stderr_str = err ? *err : "";
       close(stderr[0]);
       return result;
   }
diff --git a/libs/androidfw/include/androidfw/PosixUtils.h b/libs/androidfw/include/androidfw/PosixUtils.h
index 8fc3ee2..bb20847 100644
--- a/libs/androidfw/include/androidfw/PosixUtils.h
+++ b/libs/androidfw/include/androidfw/PosixUtils.h
@@ -23,8 +23,8 @@
 
 struct ProcResult {
   int status;
-  std::string stdout;
-  std::string stderr;
+  std::string stdout_str;
+  std::string stderr_str;
 };
 
 // Fork, exec and wait for an external process. Return nullptr if the process could not be launched,
diff --git a/libs/androidfw/tests/PosixUtils_test.cpp b/libs/androidfw/tests/PosixUtils_test.cpp
index cf97f87..c7b3eba 100644
--- a/libs/androidfw/tests/PosixUtils_test.cpp
+++ b/libs/androidfw/tests/PosixUtils_test.cpp
@@ -30,14 +30,14 @@
   const auto result = ExecuteBinary({"/bin/date", "--help"});
   ASSERT_THAT(result, NotNull());
   ASSERT_EQ(result->status, 0);
-  ASSERT_EQ(result->stdout.find("usage: date "), 0);
+  ASSERT_EQ(result->stdout_str.find("usage: date "), 0);
 }
 
 TEST(PosixUtilsTest, RelativePathToBinary) {
   const auto result = ExecuteBinary({"date", "--help"});
   ASSERT_THAT(result, NotNull());
   ASSERT_EQ(result->status, 0);
-  ASSERT_EQ(result->stdout.find("usage: date "), 0);
+  ASSERT_EQ(result->stdout_str.find("usage: date "), 0);
 }
 
 TEST(PosixUtilsTest, BadParameters) {
diff --git a/media/OWNERS b/media/OWNERS
index abfc8bf..0aff43e 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -1,8 +1,7 @@
-chz@google.com
+# Bug component: 1344
 elaurent@google.com
 essick@google.com
 etalvala@google.com
-gkasten@google.com
 hdmoon@google.com
 hkuang@google.com
 hunga@google.com
@@ -13,16 +12,13 @@
 jsharkey@android.com
 klhyun@google.com
 lajos@google.com
-marcone@google.com
 nchalko@google.com
 philburk@google.com
 quxiangfang@google.com
 wonsik@google.com
 
-# LON
-andrewlewis@google.com
-aquilescanta@google.com
-olly@google.com
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
 
 # SEO
 sungsoo@google.com
diff --git a/media/java/android/media/OWNERS b/media/java/android/media/OWNERS
index cf06fad..813dee3 100644
--- a/media/java/android/media/OWNERS
+++ b/media/java/android/media/OWNERS
@@ -1,9 +1,9 @@
 # Bug component: 1344
-
 fgoldfain@google.com
 elaurent@google.com
 lajos@google.com
-olly@google.com
-andrewlewis@google.com
 sungsoo@google.com
 jmtrivi@google.com
+
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
diff --git a/media/jni/OWNERS b/media/jni/OWNERS
index f1b0237..445672b 100644
--- a/media/jni/OWNERS
+++ b/media/jni/OWNERS
@@ -2,4 +2,4 @@
 per-file android_mtp_*.cpp=marcone@google.com,jsharkey@android.com,jameswei@google.com,rmojumder@google.com
 
 # extra for TV related files
-per-file android_media_tv_*=nchalko@google.com,quxiangfang@google.com
+per-file android_media_tv_*=hgchen@google.com,quxiangfang@google.com
diff --git a/mms/OWNERS b/mms/OWNERS
index befc320..7f05a2a 100644
--- a/mms/OWNERS
+++ b/mms/OWNERS
@@ -2,7 +2,6 @@
 
 tgunn@google.com
 breadley@google.com
-hallliu@google.com
 rgreenwalt@google.com
 amitmahajan@google.com
 fionaxu@google.com
@@ -10,7 +9,10 @@
 jminjie@google.com
 satk@google.com
 shuoq@google.com
-refuhoo@google.com
 nazaninb@google.com
 sarahchin@google.com
-dbright@google.com
\ No newline at end of file
+xiaotonj@google.com
+huiwang@google.com
+jayachandranc@google.com
+chinmayd@google.com
+amruthr@google.com
diff --git a/packages/CarrierDefaultApp/OWNERS b/packages/CarrierDefaultApp/OWNERS
index 5668840..0d23f05 100644
--- a/packages/CarrierDefaultApp/OWNERS
+++ b/packages/CarrierDefaultApp/OWNERS
@@ -1,7 +1,6 @@
 set noparent
 tgunn@google.com
 breadley@google.com
-hallliu@google.com
 rgreenwalt@google.com
 amitmahajan@google.com
 fionaxu@google.com
@@ -9,9 +8,11 @@
 jminjie@google.com
 satk@google.com
 shuoq@google.com
-refuhoo@google.com
 nazaninb@google.com
 sarahchin@google.com
-dbright@google.com
 xiaotonj@google.com
+huiwang@google.com
+jayachandranc@google.com
+chinmayd@google.com
+amruthr@google.com
 
diff --git a/packages/DynamicSystemInstallationService/AndroidManifest.xml b/packages/DynamicSystemInstallationService/AndroidManifest.xml
index b4d520d..1bc4983 100644
--- a/packages/DynamicSystemInstallationService/AndroidManifest.xml
+++ b/packages/DynamicSystemInstallationService/AndroidManifest.xml
@@ -33,6 +33,10 @@
             <intent-filter>
                 <action android:name="android.os.image.action.START_INSTALL" />
                 <category android:name="android.intent.category.DEFAULT" />
+                <data android:scheme="content" />
+                <data android:scheme="file" />
+                <data android:scheme="http" />
+                <data android:scheme="https" />
             </intent-filter>
         </activity>
 
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 12a94e1..00cc753 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -81,7 +81,6 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Locale;
@@ -786,35 +785,6 @@
         return mIsHearingAidProfileSupported;
     }
 
-    @Override
-    /** @hide */
-    public java.util.List<String> getSystemConfigEnabledProfilesForPackage(String packageName) {
-        if (Binder.getCallingUid() != Process.BLUETOOTH_UID) {
-            Slog.w(TAG, "getSystemConfigEnabledProfilesForPackage(): not allowed for non-bluetooth");
-            return null;
-        }
-
-        SystemConfig systemConfig = SystemConfig.getInstance();
-        if (systemConfig == null) {
-            return null;
-        }
-
-        android.util.ArrayMap<String, Boolean> componentEnabledStates =
-                systemConfig.getComponentsEnabledStates(packageName);
-        if (componentEnabledStates == null) {
-            return null;
-        }
-
-        ArrayList enabledProfiles = new ArrayList<String>();
-        for (Map.Entry<String, Boolean> entry : componentEnabledStates.entrySet()) {
-            if (entry.getValue()) {
-                enabledProfiles.add(entry.getKey());
-            }
-        }
-
-        return enabledProfiles;
-    }
-
     private boolean isDeviceProvisioned() {
         return Settings.Global.getInt(mContentResolver, Settings.Global.DEVICE_PROVISIONED,
                 0) != 0;
@@ -2430,7 +2400,8 @@
         try {
             foregroundUser = ActivityManager.getCurrentUser();
             valid = (callingUser == foregroundUser) || parentUser == foregroundUser
-                    || callingAppId == Process.NFC_UID || callingAppId == mSystemUiUid;
+                    || callingAppId == Process.NFC_UID || callingAppId == mSystemUiUid
+                    || callingAppId == Process.SHELL_UID;
             if (DBG && !valid) {
                 Slog.d(TAG, "checkIfCallerIsForegroundUser: valid=" + valid + " callingUser="
                         + callingUser + " parentUser=" + parentUser + " foregroundUser="
@@ -2456,6 +2427,16 @@
         mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_PERM);
     }
 
+    private boolean isBleState(int state) {
+        switch (state) {
+            case BluetoothAdapter.STATE_BLE_ON:
+            case BluetoothAdapter.STATE_BLE_TURNING_ON:
+            case BluetoothAdapter.STATE_BLE_TURNING_OFF:
+                return true;
+        }
+        return false;
+    }
+
     private void bluetoothStateChangeHandler(int prevState, int newState) {
         boolean isStandardBroadcast = true;
         if (prevState == newState) { // No change. Nothing to do.
@@ -2474,8 +2455,15 @@
                 sendBluetoothServiceDownCallback();
                 unbindAndFinish();
                 sendBleStateChanged(prevState, newState);
-                // Don't broadcast as it has already been broadcast before
-                isStandardBroadcast = false;
+
+                /* Currently, the OFF intent is broadcasted externally only when we transition
+                 * from TURNING_OFF to BLE_ON state. So if the previous state is a BLE state,
+                 * we are guaranteed that the OFF intent has been broadcasted earlier and we
+                 * can safely skip it.
+                 * Conversely, if the previous state is not a BLE state, it indicates that some
+                 * sort of crash has occurred, moving us directly to STATE_OFF without ever
+                 * passing through BLE_ON. We should broadcast the OFF intent in this case. */
+                isStandardBroadcast = !isBleState(prevState);
 
             } else if (!intermediate_off) {
                 // connect to GattService
@@ -2528,6 +2516,11 @@
                 // Show prevState of BLE_ON as OFF to standard users
                 prevState = BluetoothAdapter.STATE_OFF;
             }
+            if (DBG) {
+                Slog.d(TAG,
+                        "Sending State Change: " + BluetoothAdapter.nameForState(prevState) + " > "
+                                + BluetoothAdapter.nameForState(newState));
+            }
             Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
             intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
             intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java
index 29bb542..7a4d2ce 100644
--- a/services/core/java/com/android/server/adb/AdbService.java
+++ b/services/core/java/com/android/server/adb/AdbService.java
@@ -27,6 +27,8 @@
 import android.debug.AdbManager;
 import android.debug.AdbManagerInternal;
 import android.debug.AdbTransportType;
+import android.debug.FingerprintAndPairDevice;
+import android.debug.IAdbCallback;
 import android.debug.IAdbManager;
 import android.debug.IAdbTransport;
 import android.debug.PairDevice;
@@ -35,6 +37,7 @@
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
+import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.os.UserHandle;
@@ -87,6 +90,7 @@
     private final AdbConnectionPortListener mPortListener = new AdbConnectionPortListener();
     private AdbDebuggingManager.AdbConnectionPortPoller mConnectionPortPoller;
 
+    private final RemoteCallbackList<IAdbCallback> mCallbacks = new RemoteCallbackList<>();
     /**
      * Manages the service lifecycle for {@code AdbService} in {@code SystemServer}.
      */
@@ -348,12 +352,21 @@
     }
 
     @Override
-    public Map<String, PairDevice> getPairedDevices() {
+    public FingerprintAndPairDevice[] getPairedDevices() {
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING, null);
-        if (mDebuggingManager != null) {
-            return mDebuggingManager.getPairedDevices();
+        if (mDebuggingManager == null) {
+            return null;
         }
-        return null;
+        Map<String, PairDevice> map = mDebuggingManager.getPairedDevices();
+        FingerprintAndPairDevice[] ret = new FingerprintAndPairDevice[map.size()];
+        int i = 0;
+        for (Map.Entry<String, PairDevice> entry : map.entrySet()) {
+            ret[i] = new FingerprintAndPairDevice();
+            ret[i].keyFingerprint = entry.getKey();
+            ret[i].device = entry.getValue();
+            i++;
+        }
+        return ret;
     }
 
     @Override
@@ -401,6 +414,21 @@
         return mConnectionPort.get();
     }
 
+    @Override
+    public void registerCallback(IAdbCallback callback) throws RemoteException {
+        if (DEBUG) {
+            Slog.d(TAG, "Registering callback " + callback);
+        }
+        mCallbacks.register(callback);
+    }
+
+    @Override
+    public void unregisterCallback(IAdbCallback callback) throws RemoteException {
+        if (DEBUG) {
+            Slog.d(TAG, "Unregistering callback " + callback);
+        }
+        mCallbacks.unregister(callback);
+    }
     /**
      * This listener is only used when ro.adb.secure=0. Otherwise, AdbDebuggingManager will
      * do this.
@@ -507,6 +535,23 @@
         if (mDebuggingManager != null) {
             mDebuggingManager.setAdbEnabled(enable, transportType);
         }
+
+        if (DEBUG) {
+            Slog.d(TAG, "Broadcasting enable = " + enable + ", type = " + transportType);
+        }
+        mCallbacks.broadcast((callback) -> {
+            if (DEBUG) {
+                Slog.d(TAG, "Sending enable = " + enable + ", type = " + transportType
+                        + " to " + callback);
+            }
+            try {
+                callback.onDebuggingChanged(enable, transportType);
+            } catch (RemoteException ex) {
+                if (DEBUG) {
+                    Slog.d(TAG, "Unable to send onDebuggingChanged:", ex);
+                }
+            }
+        });
     }
 
     @Override
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index c20a01d..00dfd38 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -84,6 +84,7 @@
         DeviceConfig.NAMESPACE_CONNECTIVITY,
         DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT,
         DeviceConfig.NAMESPACE_INTELLIGENCE_CONTENT_SUGGESTIONS,
+        DeviceConfig.NAMESPACE_LMKD_NATIVE,
         DeviceConfig.NAMESPACE_MEDIA_NATIVE,
         DeviceConfig.NAMESPACE_NETD_NATIVE,
         DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT,
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 26f5c4c..cd3d27d 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -1648,10 +1648,9 @@
             return;
         }
         Log.w(TAG, "Speaker client died");
-        if (removeCommunicationRouteClient(client.getBinder(), false)
-                != null) {
-            onUpdateCommunicationRoute("onCommunicationRouteClientDied");
-        }
+        setCommunicationRouteForClient(
+                client.getBinder(), client.getPid(), null,
+                BtHelper.SCO_MODE_UNDEFINED, "onCommunicationRouteClientDied");
     }
 
     /**
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
index f2e44ee..e7118ad 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
@@ -28,10 +28,8 @@
 import android.os.RemoteException;
 import android.util.Slog;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 
 class Tuner extends ITuner.Stub {
     private static final String TAG = "BroadcastRadioService.Tuner";
@@ -292,12 +290,12 @@
     }
 
     @Override
-    public Map setParameters(Map parameters) {
+    public Map<String, String> setParameters(Map<String, String> parameters) {
         throw new UnsupportedOperationException("Not supported by HAL 1.x");
     }
 
     @Override
-    public Map getParameters(List<String> keys) {
+    public Map<String, String> getParameters(List<String> keys) {
         throw new UnsupportedOperationException("Not supported by HAL 1.x");
     }
 }
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
index 7a6d964..867d5b4 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
@@ -18,12 +18,10 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.hardware.radio.ITuner;
 import android.hardware.radio.ITunerCallback;
 import android.hardware.radio.ProgramList;
 import android.hardware.radio.ProgramSelector;
 import android.hardware.radio.RadioManager;
-import android.hardware.radio.RadioMetadata;
 import android.hardware.radio.RadioTuner;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -31,7 +29,6 @@
 
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -176,7 +173,7 @@
     }
 
     @Override
-    public void onParametersUpdated(Map parameters) {
+    public void onParametersUpdated(Map<String, String> parameters) {
         Slog.e(TAG, "Not applicable for HAL 1.x");
     }
 
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java b/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
index 7ab3bdd..7d8c6a4 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
@@ -299,7 +299,7 @@
     }
 
     @Override
-    public Map setParameters(Map parameters) {
+    public Map<String, String> setParameters(Map<String, String> parameters) {
         synchronized (mLock) {
             checkNotClosedLocked();
             return Convert.vendorInfoFromHal(Utils.maybeRethrow(
@@ -308,7 +308,7 @@
     }
 
     @Override
-    public Map getParameters(List<String> keys) {
+    public Map<String, String> getParameters(List<String> keys) {
         synchronized (mLock) {
             checkNotClosedLocked();
             return Convert.vendorInfoFromHal(Utils.maybeRethrow(
diff --git a/services/core/java/com/android/server/connectivity/PacProxyService.java b/services/core/java/com/android/server/connectivity/PacProxyService.java
index 0070339..b2df535 100644
--- a/services/core/java/com/android/server/connectivity/PacProxyService.java
+++ b/services/core/java/com/android/server/connectivity/PacProxyService.java
@@ -192,7 +192,7 @@
     }
 
     /**
-     * Updates the PAC Proxy Installer with current Proxy information. This is called by
+     * Updates the PAC Proxy Service with current Proxy information. This is called by
      * the ProxyTracker through PacProxyManager before a broadcast takes place to allow
      * the PacProxyService to indicate that the broadcast should not be sent and the
      * PacProxyService will trigger a new broadcast when it is ready.
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 378405f..f6f3db3 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -238,6 +238,14 @@
             throws PackageManagerException;
 
     /**
+     * Returns {@code ApeInfo} about apex sessions that have been marked ready via
+     * {@link #markStagedSessionReady(int)}
+     *
+     * Returns empty array if there is no staged apex session or if there is any error.
+     */
+    abstract ApexInfo[] getStagedApexInfos(ApexSessionParams params);
+
+    /**
      * Mark a staged session previously submitted using {@code submitStagedSession} as ready to be
      * applied at next reboot.
      *
@@ -707,6 +715,19 @@
         }
 
         @Override
+        ApexInfo[] getStagedApexInfos(ApexSessionParams params) {
+            try {
+                return waitForApexService().getStagedApexInfos(params);
+            } catch (RemoteException re) {
+                Slog.w(TAG, "Unable to contact apexservice" + re.getMessage());
+                throw new RuntimeException(re);
+            } catch (Exception e) {
+                Slog.w(TAG, "Failed to collect staged apex infos" + e.getMessage());
+                return new ApexInfo[0];
+            }
+        }
+
+        @Override
         void markStagedSessionReady(int sessionId) throws PackageManagerException {
             try {
                 waitForApexService().markStagedSessionReady(sessionId);
@@ -1100,6 +1121,11 @@
         }
 
         @Override
+        ApexInfo[] getStagedApexInfos(ApexSessionParams params) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
         void markStagedSessionReady(int sessionId) {
             throw new UnsupportedOperationException();
         }
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index f8115d3..0b07bb6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -224,6 +224,10 @@
         mStagingManager = new StagingManager(this, context, apexParserSupplier);
     }
 
+    StagingManager getStagingManager() {
+        return mStagingManager;
+    }
+
     boolean okToSendBroadcasts()  {
         return mOkToSendBroadcasts;
     }
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index e4723ad..1173df6 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -21,14 +21,12 @@
 import static android.Manifest.permission.MANAGE_DEVICE_ADMINS;
 import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
 import static android.Manifest.permission.QUERY_ALL_PACKAGES;
-import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
 import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
 import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
 import static android.app.AppOpsManager.MODE_ALLOWED;
 import static android.app.AppOpsManager.MODE_DEFAULT;
 import static android.app.AppOpsManager.MODE_IGNORED;
 import static android.content.Intent.ACTION_MAIN;
-import static android.content.Intent.CATEGORY_BROWSABLE;
 import static android.content.Intent.CATEGORY_DEFAULT;
 import static android.content.Intent.CATEGORY_HOME;
 import static android.content.Intent.EXTRA_LONG_VERSION_CODE;
@@ -36,8 +34,6 @@
 import static android.content.Intent.EXTRA_VERSION_CODE;
 import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509;
 import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
-import static android.content.Intent.CATEGORY_BROWSABLE;
-import static android.content.Intent.CATEGORY_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
@@ -181,6 +177,7 @@
 import android.content.pm.IPackageManagerNative;
 import android.content.pm.IPackageMoveObserver;
 import android.content.pm.IPackageStatsObserver;
+import android.content.pm.IStagedApexObserver;
 import android.content.pm.InstallSourceInfo;
 import android.content.pm.InstantAppInfo;
 import android.content.pm.InstantAppRequest;
@@ -220,6 +217,7 @@
 import android.content.pm.SharedLibraryInfo;
 import android.content.pm.Signature;
 import android.content.pm.SigningInfo;
+import android.content.pm.StagedApexInfo;
 import android.content.pm.SuspendDialogInfo;
 import android.content.pm.UserInfo;
 import android.content.pm.VerifierDeviceIdentity;
@@ -24119,6 +24117,28 @@
         public String getModuleMetadataPackageName() throws RemoteException {
             return PackageManagerService.this.mModuleInfoProvider.getPackageName();
         }
+
+        @Override
+        public void registerStagedApexObserver(IStagedApexObserver observer) {
+            mInstallerService.getStagingManager().registerStagedApexObserver(observer);
+        }
+
+        @Override
+        public void unregisterStagedApexObserver(IStagedApexObserver observer) {
+            mInstallerService.getStagingManager().unregisterStagedApexObserver(observer);
+        }
+
+        @Override
+        public String[] getStagedApexModuleNames() {
+            return mInstallerService.getStagingManager()
+                    .getStagedApexModuleNames().toArray(new String[0]);
+        }
+
+        @Override
+        @Nullable
+        public StagedApexInfo getStagedApexInfo(String moduleName) {
+            return mInstallerService.getStagingManager().getStagedApexInfo(moduleName);
+        }
     }
 
     private class PackageManagerInternalImpl extends PackageManagerInternal {
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 4038bf2..02397da 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -29,7 +29,9 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.IntentSender;
+import android.content.pm.ApexStagedEvent;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.IStagedApexObserver;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageInstaller.SessionInfo;
@@ -38,6 +40,7 @@
 import android.content.pm.PackageParser.PackageParserException;
 import android.content.pm.PackageParser.SigningDetails;
 import android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion;
+import android.content.pm.StagedApexInfo;
 import android.content.pm.parsing.PackageInfoWithoutStateUtils;
 import android.content.rollback.IRollbackManager;
 import android.content.rollback.RollbackInfo;
@@ -58,6 +61,7 @@
 import android.os.storage.IStorageManager;
 import android.os.storage.StorageManager;
 import android.text.TextUtils;
+import android.util.ArrayMap;
 import android.util.IntArray;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -66,8 +70,10 @@
 import android.util.apk.ApkSignatureVerifier;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.content.PackageHelper;
 import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.Preconditions;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
 import com.android.server.SystemServiceManager;
@@ -84,7 +90,9 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
@@ -103,7 +111,8 @@
     private final ApexManager mApexManager;
     private final PowerManager mPowerManager;
     private final Context mContext;
-    private final PreRebootVerificationHandler mPreRebootVerificationHandler;
+    @VisibleForTesting
+    final PreRebootVerificationHandler mPreRebootVerificationHandler;
     private final Supplier<PackageParser2> mPackageParserSupplier;
 
     private final File mFailureReasonFile = new File("/metadata/staged-install/failure_reason.txt");
@@ -122,6 +131,9 @@
     @GuardedBy("mSuccessfulStagedSessionIds")
     private final List<Integer> mSuccessfulStagedSessionIds = new ArrayList<>();
 
+    @GuardedBy("mStagedApexObservers")
+    private final List<IStagedApexObserver> mStagedApexObservers = new ArrayList<>();
+
     StagingManager(PackageInstallerService pi, Context context,
             Supplier<PackageParser2> packageParserSupplier) {
         mPi = pi;
@@ -184,6 +196,35 @@
         mApexManager.markBootCompleted();
     }
 
+    void registerStagedApexObserver(IStagedApexObserver observer) {
+        if (observer == null) {
+            return;
+        }
+        if  (observer.asBinder() != null) {
+            try {
+                observer.asBinder().linkToDeath(new IBinder.DeathRecipient() {
+                    @Override
+                    public void binderDied() {
+                        synchronized (mStagedApexObservers) {
+                            mStagedApexObservers.remove(observer);
+                        }
+                    }
+                }, 0);
+            } catch (RemoteException re) {
+                Slog.w(TAG, re.getMessage());
+            }
+        }
+        synchronized (mStagedApexObservers) {
+            mStagedApexObservers.add(observer);
+        }
+    }
+
+    void unregisterStagedApexObserver(IStagedApexObserver observer) {
+        synchronized (mStagedApexObservers) {
+            mStagedApexObservers.remove(observer);
+        }
+    }
+
     /**
      * Validates the signature used to sign the container of the new apex package
      *
@@ -1075,6 +1116,9 @@
                     Slog.w(TAG, "Could not contact apexd to abort staged session " + sessionId);
                 }
             }
+            if (sessionContainsApex(session)) {
+                notifyStagedApexObservers();
+            }
         }
 
         // Session was successfully aborted from apexd (if required) and pre-reboot verification
@@ -1299,7 +1343,107 @@
         return session;
     }
 
-    private final class PreRebootVerificationHandler extends Handler {
+    /**
+     * Returns ApexInfo about APEX contained inside the session as a {@code Map<String, ApexInfo>},
+     * where the key of the map is the module name of the ApexInfo.
+     *
+     * Returns an empty map if there is any error.
+     */
+    @VisibleForTesting
+    @NonNull
+    Map<String, ApexInfo> getStagedApexInfos(@NonNull PackageInstallerSession session) {
+        Preconditions.checkArgument(session != null, "Session is null");
+        Preconditions.checkArgument(!session.hasParentSessionId(),
+                session.sessionId + " session has parent session");
+        Preconditions.checkArgument(sessionContainsApex(session),
+                session.sessionId + " session does not contain apex");
+
+        // Even if caller calls this method on ready session, the session could be abandoned
+        // right after this method is called.
+        if (!session.isStagedSessionReady() || session.isDestroyed()) {
+            return Collections.emptyMap();
+        }
+
+        ApexSessionParams params = new ApexSessionParams();
+        params.sessionId = session.sessionId;
+        final IntArray childSessionIds = new IntArray();
+        if (session.isMultiPackage()) {
+            for (int id : session.getChildSessionIds()) {
+                if (isApexSession(getStagedSession(id))) {
+                    childSessionIds.add(id);
+                }
+            }
+        }
+        params.childSessionIds = childSessionIds.toArray();
+
+        ApexInfo[] infos = mApexManager.getStagedApexInfos(params);
+        Map<String, ApexInfo> result = new ArrayMap<>();
+        for (ApexInfo info : infos) {
+            result.put(info.moduleName, info);
+        }
+        return result;
+    }
+
+    /**
+     * Returns apex module names of all packages that are staged ready
+     */
+    List<String> getStagedApexModuleNames() {
+        List<String> result = new ArrayList<>();
+        synchronized (mStagedSessions) {
+            for (int i = 0; i < mStagedSessions.size(); i++) {
+                final PackageInstallerSession session = mStagedSessions.valueAt(i);
+                if (!session.isStagedSessionReady() || session.isDestroyed()
+                        || session.hasParentSessionId() || !sessionContainsApex(session)) {
+                    continue;
+                }
+                result.addAll(getStagedApexInfos(session).keySet());
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Returns ApexInfo of the {@code moduleInfo} provided if it is staged, otherwise returns null.
+     */
+    @Nullable
+    StagedApexInfo getStagedApexInfo(String moduleName) {
+        synchronized (mStagedSessions) {
+            for (int i = 0; i < mStagedSessions.size(); i++) {
+                final PackageInstallerSession session = mStagedSessions.valueAt(i);
+                if (!session.isStagedSessionReady() || session.isDestroyed()
+                        || session.hasParentSessionId() || !sessionContainsApex(session)) {
+                    continue;
+                }
+                ApexInfo ai = getStagedApexInfos(session).get(moduleName);
+                if (ai != null) {
+                    StagedApexInfo info = new StagedApexInfo();
+                    info.moduleName = ai.moduleName;
+                    info.diskImagePath = ai.modulePath;
+                    info.versionCode = ai.versionCode;
+                    info.versionName = ai.versionName;
+                    return info;
+                }
+            }
+        }
+        return null;
+    }
+
+    private void notifyStagedApexObservers() {
+        synchronized (mStagedApexObservers) {
+            for (IStagedApexObserver observer : mStagedApexObservers) {
+                ApexStagedEvent event = new ApexStagedEvent();
+                event.stagedApexModuleNames = getStagedApexModuleNames().toArray(new String[0]);
+                try {
+                    observer.onApexStaged(event);
+                } catch (RemoteException re) {
+                    Slog.w(TAG, "Failed to contact the observer " + re.getMessage());
+                }
+            }
+        }
+    }
+
+    @VisibleForTesting
+    final class PreRebootVerificationHandler extends Handler {
         // Hold session ids before handler gets ready to do the verification.
         private IntArray mPendingSessionIds;
         private boolean mIsReady;
@@ -1327,7 +1471,8 @@
         private static final int MSG_PRE_REBOOT_VERIFICATION_START = 1;
         private static final int MSG_PRE_REBOOT_VERIFICATION_APEX = 2;
         private static final int MSG_PRE_REBOOT_VERIFICATION_APK = 3;
-        private static final int MSG_PRE_REBOOT_VERIFICATION_END = 4;
+        @VisibleForTesting
+        static final int MSG_PRE_REBOOT_VERIFICATION_END = 4;
 
         @Override
         public void handleMessage(Message msg) {
@@ -1579,6 +1724,7 @@
                 if (hasApex) {
                     try {
                         mApexManager.markStagedSessionReady(session.sessionId);
+                        notifyStagedApexObservers();
                     } catch (PackageManagerException e) {
                         session.setStagedSessionFailed(e.error, e.getMessage());
                         return;
diff --git a/services/core/java/com/android/server/policy/DisplayFoldDurationLogger.java b/services/core/java/com/android/server/policy/DisplayFoldDurationLogger.java
index bdcd2cd..3524d7f 100644
--- a/services/core/java/com/android/server/policy/DisplayFoldDurationLogger.java
+++ b/services/core/java/com/android/server/policy/DisplayFoldDurationLogger.java
@@ -44,8 +44,8 @@
     @Retention(RetentionPolicy.SOURCE)
     public @interface ScreenState {}
 
-    private @ScreenState int mScreenState = SCREEN_STATE_UNKNOWN;
-    private Long mLastChanged = null;
+    private volatile @ScreenState int mScreenState = SCREEN_STATE_UNKNOWN;
+    private volatile Long mLastChanged = null;
 
     private static final int LOG_SUBTYPE_UNFOLDED = 0;
     private static final int LOG_SUBTYPE_FOLDED = 1;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 061fabf..e927667 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -3756,7 +3756,10 @@
         if (sQuiescent) {
             // Pass the optional "quiescent" argument to the bootloader to let it know
             // that it should not turn the screen/lights on.
-            reason = reason + ",quiescent";
+            if (reason != ""){
+                reason += ",";
+            }
+            reason = reason + "quiescent";
         }
 
         SystemProperties.set("sys.powerctl", "reboot," + reason);
diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
index bba5dcb..277163a6 100755
--- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java
+++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
@@ -114,6 +114,8 @@
     private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray();
     private final List<Message> mPendingHdmiDeviceEvents = new LinkedList<>();
 
+    private final List<Message> mPendingTvinputInfoEvents = new LinkedList<>();
+
     // Calls to mListener should happen here.
     private final Handler mHandler = new ListenerHandler();
 
@@ -229,7 +231,16 @@
                             connection.getInputStateLocked(), 0, inputId).sendToTarget();
                     }
                 }
-            }
+            } else {
+                Message msg = mHandler.obtainMessage(ListenerHandler.TVINPUT_INFO_ADDED,
+                    deviceId, cableConnectionStatus, connection);
+                for (Iterator<Message> it = mPendingTvinputInfoEvents.iterator(); it.hasNext();) {
+                    if (it.next().arg1 == deviceId) {
+                    it.remove();
+                    }
+                }
+                mPendingTvinputInfoEvents.add(msg);
+           }
             ITvInputHardwareCallback callback = connection.getCallbackLocked();
             if (callback != null) {
                 try {
@@ -288,6 +299,8 @@
             }
             mHardwareInputIdMap.put(deviceId, info.getId());
             mInputMap.put(info.getId(), info);
+            processPendingTvInputInfoEventsLocked();
+            Slog.d(TAG,"deviceId ="+ deviceId+", tvinputinfo = "+info);
 
             // Process pending state changes
 
@@ -529,6 +542,20 @@
         }
     }
 
+
+    private void processPendingTvInputInfoEventsLocked() {
+        for (Iterator<Message> it = mPendingTvinputInfoEvents.iterator(); it.hasNext(); ) {
+            Message msg = it.next();
+            int deviceId =  msg.arg1;
+            String inputId = mHardwareInputIdMap.get(deviceId);
+            if (inputId != null) {
+                msg.sendToTarget();
+                it.remove();
+            }
+        }
+    }
+
+
     private void updateVolume() {
         mCurrentMaxIndex = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
         mCurrentIndex = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
@@ -1181,6 +1208,7 @@
         private static final int HDMI_DEVICE_ADDED = 4;
         private static final int HDMI_DEVICE_REMOVED = 5;
         private static final int HDMI_DEVICE_UPDATED = 6;
+        private static final int TVINPUT_INFO_ADDED = 7;
 
         @Override
         public final void handleMessage(Message msg) {
@@ -1225,6 +1253,29 @@
                     }
                     break;
                 }
+                case TVINPUT_INFO_ADDED: {
+                    int deviceId = msg.arg1;
+                    int cableConnectionStatus = msg.arg2;
+                    Connection connection =(Connection)msg.obj;
+
+                    int previousConfigsLength = connection.getConfigsLengthLocked();
+                    int previousCableConnectionStatus = connection.getInputStateLocked();
+                    String inputId = mHardwareInputIdMap.get(deviceId);
+
+                    if (inputId != null) {
+                        if (connection.updateCableConnectionStatusLocked(cableConnectionStatus)) {
+                            if (previousCableConnectionStatus != connection.getInputStateLocked()) {
+                                mListener.onStateChanged(inputId, connection.getInputStateLocked());
+                            }
+                        } else {
+                            if ((previousConfigsLength == 0)
+                                    != (connection.getConfigsLengthLocked() == 0)) {
+                                mListener.onStateChanged(inputId, connection.getInputStateLocked());
+                            }
+                        }
+                    }
+                    break;
+                }
                 default: {
                     Slog.w(TAG, "Unhandled message: " + msg);
                     break;
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 113797c..419a7fa 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1468,7 +1468,7 @@
         final Task targetTask = r.getTask() != null
                 ? r.getTask()
                 : mTargetTask;
-        if (startedActivityStack == null || targetTask == null) {
+        if (startedActivityStack == null || targetTask == null || !targetTask.isAttached()) {
             return;
         }
 
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index e6a35f1..1f8a437 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -908,7 +908,7 @@
                 final int displayId = r.getDisplayId();
                 final Context c = root.getDisplayUiContext(displayId);
 
-                if (r.mVisibleRequested && !displayContexts.contains(c)) {
+                if (c != null && r.mVisibleRequested && !displayContexts.contains(c)) {
                     displayContexts.add(c);
                 }
             }
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index a0c96f0..d78e02b 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -158,7 +158,7 @@
         "android.hardware.input.classifier@1.0",
         "android.hardware.ir@1.0",
         "android.hardware.light@2.0",
-        "android.hardware.memtrack-V1-ndk_platform",
+        "android.hardware.memtrack-V1-ndk",
         "android.hardware.power@1.0",
         "android.hardware.power@1.1",
         "android.hardware.power-V1-cpp",
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index d908945..5dfa86e 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -10314,7 +10314,7 @@
     }
 
     @Override
-    public boolean setPermittedAccessibilityServices(ComponentName who, List packageList) {
+    public boolean setPermittedAccessibilityServices(ComponentName who, List<String> packageList) {
         if (!mHasFeature) {
             return false;
         }
@@ -10367,7 +10367,7 @@
     }
 
     @Override
-    public List getPermittedAccessibilityServices(ComponentName who) {
+    public List<String> getPermittedAccessibilityServices(ComponentName who) {
         if (!mHasFeature) {
             return null;
         }
@@ -10381,7 +10381,7 @@
     }
 
     @Override
-    public List getPermittedAccessibilityServicesForUser(int userId) {
+    public List<String> getPermittedAccessibilityServicesForUser(int userId) {
         if (!mHasFeature) {
             return null;
         }
@@ -10465,7 +10465,7 @@
     }
 
     @Override
-    public boolean setPermittedInputMethods(ComponentName who, List packageList) {
+    public boolean setPermittedInputMethods(ComponentName who, List<String> packageList) {
         if (!mHasFeature) {
             return false;
         }
@@ -10505,7 +10505,7 @@
     }
 
     @Override
-    public List getPermittedInputMethods(ComponentName who) {
+    public List<String> getPermittedInputMethods(ComponentName who) {
         if (!mHasFeature) {
             return null;
         }
@@ -10519,7 +10519,7 @@
     }
 
     @Override
-    public List getPermittedInputMethodsForCurrentUser() {
+    public List<String> getPermittedInputMethodsForCurrentUser() {
         enforceManageUsers();
 
         final int callingUserId = mInjector.userHandleGetCallingUserId();
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 5a5f504..ad445f1 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -52,7 +52,6 @@
         // classes generated by netd_aidl_interfaces-platform-java above.
         "netd_aidl_interface-V3-java",
         "networkstack-client",
-        "modules-utils-build_system",
     ],
     apex_available: [
         "com.android.wifi",
diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
index 72afca0..b6f7922 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -37,6 +37,7 @@
 import android.content.Context;
 import android.content.pm.PackageInfo;
 import android.os.RemoteException;
+import android.os.ServiceSpecificException;
 import android.platform.test.annotations.Presubmit;
 
 import androidx.test.filters.SmallTest;
@@ -228,6 +229,21 @@
     }
 
     @Test
+    public void testGetStagedApexInfos_throwRunTimeException() throws RemoteException {
+        doThrow(RemoteException.class).when(mApexService).getStagedApexInfos(any());
+
+        assertThrows(RuntimeException.class,
+                () -> mApexManager.getStagedApexInfos(testParamsWithChildren()));
+    }
+
+    @Test
+    public void testGetStagedApexInfos_returnsEmptyArrayOnError() throws RemoteException {
+        doThrow(ServiceSpecificException.class).when(mApexService).getStagedApexInfos(any());
+
+        assertThat(mApexManager.getStagedApexInfos(testParamsWithChildren())).hasLength(0);
+    }
+
+    @Test
     public void testMarkStagedSessionReady_throwPackageManagerException() throws RemoteException {
         doAnswer(invocation -> {
             throw new Exception();
diff --git a/telecomm/java/android/telecom/CallRedirectionService.java b/telecomm/java/android/telecom/CallRedirectionService.java
index c832f53..8dcae39 100644
--- a/telecomm/java/android/telecom/CallRedirectionService.java
+++ b/telecomm/java/android/telecom/CallRedirectionService.java
@@ -89,6 +89,13 @@
                                      boolean allowInteractiveResponse);
 
     /**
+     * Telecom calls this method when times out waiting for the {@link CallRedirectionService} to
+     * call {@link #placeCallUnmodified()}, {@link #redirectCall(Uri, PhoneAccountHandle, boolean)},
+     * or {@link #cancelCall()}
+     */
+    public void onRedirectionTimeout() {}
+
+    /**
      * The implemented {@link CallRedirectionService} calls this method to response a request
      * received via {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)} to inform Telecom that
      * no changes are required to the outgoing call, and that the call should be placed as-is.
@@ -158,6 +165,12 @@
     private static final int MSG_PLACE_CALL = 1;
 
     /**
+     * A handler message to process the attempt to notify the operation of redirection service timed
+     * out from Telecom
+     */
+    private static final int MSG_TIMEOUT = 2;
+
+    /**
      * A handler to process the attempt to place call with redirection service from Telecom
      */
     private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@@ -174,6 +187,9 @@
                         args.recycle();
                     }
                     break;
+                case MSG_TIMEOUT:
+                    onRedirectionTimeout();
+                    break;
             }
         }
     };
@@ -200,6 +216,15 @@
             args.arg4 = allowInteractiveResponse;
             mHandler.obtainMessage(MSG_PLACE_CALL, args).sendToTarget();
         }
+
+        /**
+         * Telecom calls this method to inform the CallRedirectionService of the timeout waiting for
+         * it to complete its operation.
+         */
+        @Override
+        public void notifyTimeout() {
+            mHandler.obtainMessage(MSG_TIMEOUT).sendToTarget();
+        }
     }
 
     @Override
diff --git a/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl b/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
index c1bc440..ce1938b 100644
--- a/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
@@ -31,4 +31,6 @@
 oneway interface ICallRedirectionService {
     void placeCall(in ICallRedirectionAdapter adapter, in Uri handle,
             in PhoneAccountHandle initialPhoneAccount, boolean allowInteractiveResponse);
+
+    void notifyTimeout();
 }
diff --git a/telephony/OWNERS b/telephony/OWNERS
index 628c480..4df8a4b 100644
--- a/telephony/OWNERS
+++ b/telephony/OWNERS
@@ -4,13 +4,14 @@
 breadley@google.com
 fionaxu@google.com
 jackyu@google.com
-hallliu@google.com
 rgreenwalt@google.com
 tgunn@google.com
 jminjie@google.com
 shuoq@google.com
-refuhoo@google.com
 nazaninb@google.com
 sarahchin@google.com
-dbright@google.com
 xiaotonj@google.com
+huiwang@google.com
+jayachandranc@google.com
+chinmayd@google.com
+amruthr@google.com
diff --git a/telephony/java/android/telephony/AccessNetworkUtils.java b/telephony/java/android/telephony/AccessNetworkUtils.java
index 6b82045..b5d97ab 100644
--- a/telephony/java/android/telephony/AccessNetworkUtils.java
+++ b/telephony/java/android/telephony/AccessNetworkUtils.java
@@ -567,6 +567,10 @@
      */
     public static int getFrequencyFromNrArfcn(int nrArfcn) {
 
+        if (nrArfcn == PhysicalChannelConfig.CHANNEL_NUMBER_UNKNOWN) {
+            return PhysicalChannelConfig.FREQUENCY_UNKNOWN;
+        }
+
         int globalKhz = 0;
         int rangeOffset = 0;
         int arfcnOffset = 0;
@@ -632,6 +636,10 @@
      */
     public static int getFrequencyFromUarfcn(int band, int uarfcn, boolean isUplink) {
 
+        if (uarfcn == PhysicalChannelConfig.CHANNEL_NUMBER_UNKNOWN) {
+            return PhysicalChannelConfig.FREQUENCY_UNKNOWN;
+        }
+
         int offsetKhz = 0;
         for (UtranBandArfcnFrequency uarfcnFrequency : AccessNetworkConstants.
                 UtranBandArfcnFrequency.values()) {
@@ -702,6 +710,10 @@
      */
     public static int getFrequencyFromArfcn(int band, int arfcn, boolean isUplink) {
 
+        if (arfcn == PhysicalChannelConfig.CHANNEL_NUMBER_UNKNOWN) {
+            return PhysicalChannelConfig.FREQUENCY_UNKNOWN;
+        }
+
         int uplinkFrequencyFirst = 0;
         int arfcnOffset = 0;
         int downlinkOffset = 0;
diff --git a/telephony/java/android/telephony/PhysicalChannelConfig.java b/telephony/java/android/telephony/PhysicalChannelConfig.java
index 8a4bb46..59eac6a 100644
--- a/telephony/java/android/telephony/PhysicalChannelConfig.java
+++ b/telephony/java/android/telephony/PhysicalChannelConfig.java
@@ -337,7 +337,8 @@
     private void setUplinkFrequency() {
         switch (mNetworkType){
             case TelephonyManager.NETWORK_TYPE_NR:
-                mUplinkFrequency = mDownlinkFrequency;
+                mUplinkFrequency = AccessNetworkUtils.getFrequencyFromNrArfcn(
+                        mUplinkChannelNumber);
                 break;
             case TelephonyManager.NETWORK_TYPE_LTE:
                 mUplinkFrequency = AccessNetworkUtils.getFrequencyFromEarfcn(
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 9d4db17..98f9dfd 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -1827,8 +1827,9 @@
      * @param subscriptionType the {@link #SUBSCRIPTION_TYPE}
      * @hide
      */
-    public void addSubscriptionInfoRecord(String uniqueId, String displayName, int slotIndex,
-            int subscriptionType) {
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public void addSubscriptionInfoRecord(@NonNull String uniqueId, @Nullable String displayName,
+            int slotIndex, int subscriptionType) {
         if (VDBG) {
             logd("[addSubscriptionInfoRecord]+ uniqueId:" + uniqueId
                     + ", displayName:" + displayName + ", slotIndex:" + slotIndex
@@ -1863,7 +1864,8 @@
      * @param subscriptionType the {@link #SUBSCRIPTION_TYPE}
      * @hide
      */
-    public void removeSubscriptionInfoRecord(String uniqueId, int subscriptionType) {
+    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+    public void removeSubscriptionInfoRecord(@NonNull String uniqueId, int subscriptionType) {
         if (VDBG) {
             logd("[removeSubscriptionInfoRecord]+ uniqueId:" + uniqueId
                     + ", subscriptionType: " + subscriptionType);
diff --git a/telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl b/telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl
index 1a1c7f8..43273a4 100755
--- a/telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl
@@ -25,6 +25,7 @@
 {
     void onError(int errorCode, String message);
 
+    @SuppressWarnings(value={"untyped-collection"})
     void onAvailableSaisUpdated(in List currentSai, in List availableSais);
 
     void onServiceInterfaceAvailable(String interfaceName, int index);
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl
index 44cc24a..6e139ac 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl
@@ -29,9 +29,11 @@
 
     void stopGroupCall(int subId, long tmgi);
 
+    @SuppressWarnings(value={"untyped-collection"})
     void updateGroupCall(int subscriptionId, long tmgi, in List saiList,
         in List frequencyList);
 
+    @SuppressWarnings(value={"untyped-collection"})
     int startGroupCall(int subscriptionId, long tmgi, in List saiList,
         in List frequencyList, IGroupCallCallback callback);
 
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 9b2f119..ae5f997 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1961,6 +1961,7 @@
     /**
      * Return the emergency number list from all the active subscriptions.
      */
+    @SuppressWarnings(value={"untyped-collection"})
     Map getEmergencyNumberList(String callingPackage, String callingFeatureId);
 
     /**
diff --git a/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java b/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
index 4ecca2d..cf56586 100644
--- a/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
+++ b/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
@@ -31,6 +31,8 @@
     private static final String SYSTEM_SERVER_PROFILE =
             "/data/misc/profiles/cur/0/android/primary.prof";
     private static final boolean USE_PHENOTYPE = false;
+    private static final String DALVIK_VM_EXTRA_OPTS =
+            "-Xusejit:false -Xint -Xjitsaveprofilinginfo";
 
     @Override
     public void setDevice(ITestDevice testDevice) {
@@ -54,10 +56,10 @@
     private String setProperty(String property, String value) throws Exception {
         if (USE_PHENOTYPE) {
             return mTestDevice.executeShellCommand(
-                "device_config put runtime_native_boot " + property + " " + value);
+                String.format("device_config put runtime_native_boot %s '%s'", property, value));
         } else {
             return mTestDevice.executeShellCommand(
-                "setprop dalvik.vm." + property + " " + value);
+                String.format("setprop dalvik.vm.%s '%s'", property, value));
         }
     }
 
@@ -69,6 +71,8 @@
         assertTrue("profile boot class path not enabled: " + res, "true".equals(res));
         res = getProperty("profilesystemserver");
         assertTrue("profile system server not enabled: " + res, "true".equals(res));
+        res = getProperty("extra-opts");
+        assertTrue("extra options not set: " + res, DALVIK_VM_EXTRA_OPTS.equals(res));
     }
 
     private boolean forceSaveProfile(String pkg) throws Exception {
@@ -91,16 +95,20 @@
             boolean profileBootClassPath = "true".equals(pbcp);
             String pss = getProperty("profilesystemserver");
             boolean profileSystemServer = "true".equals(pss);
-            if (profileBootClassPath && profileSystemServer) {
+            String extraOpts = getProperty("extra-opts");
+            boolean extraOptsOk = DALVIK_VM_EXTRA_OPTS.equals(extraOpts);
+            if (profileBootClassPath && profileSystemServer && extraOptsOk) {
                 break;
             }
             if (i == numIterations) {
                 assertTrue("profile system server not enabled: " + pss, profileSystemServer);
                 assertTrue("profile boot class path not enabled: " + pbcp, profileBootClassPath);
+                assertTrue("extra options not set: " + extraOpts, extraOptsOk);
             }
 
             setProperty("profilebootclasspath", "true");
             setProperty("profilesystemserver", "true");
+            setProperty("extra-opts", DALVIK_VM_EXTRA_OPTS);
             Thread.sleep(1000);
         }
 
@@ -114,12 +122,15 @@
             boolean profileBootClassPath = "true".equals(pbcp);
             String pss = getProperty("profilesystemserver");
             boolean profileSystemServer = "true".equals(pss);
+            String extraOpts = getProperty("extra-opts");
+            boolean extraOptsOk = DALVIK_VM_EXTRA_OPTS.equals(extraOpts);
             if (profileBootClassPath && profileSystemServer) {
                 break;
             }
             if (i == numIterations) {
                 assertTrue("profile system server not enabled: " + pss, profileSystemServer);
                 assertTrue("profile boot class path not enabled: " + pbcp, profileBootClassPath);
+                assertTrue("extra options not set: " + extraOpts, extraOptsOk);
             }
             Thread.sleep(1000);
         }
diff --git a/tests/StagedInstallTest/Android.bp b/tests/StagedInstallTest/Android.bp
index 243c301..840a588 100644
--- a/tests/StagedInstallTest/Android.bp
+++ b/tests/StagedInstallTest/Android.bp
@@ -25,14 +25,24 @@
     name: "StagedInstallInternalTestApp",
     manifest: "app/AndroidManifest.xml",
     srcs: ["app/src/**/*.java"],
-    static_libs: ["androidx.test.rules", "cts-install-lib"],
+    static_libs: [
+        "androidx.test.rules",
+        "cts-install-lib",
+    ],
     test_suites: ["general-tests"],
+    java_resources: [
+        ":StagedInstallTestApexV2",
+    ],
+    platform_apis: true,
 }
 
 java_test_host {
     name: "StagedInstallInternalTest",
     srcs: ["src/**/*.java"],
-    libs: ["tradefed", "cts-shim-host-lib"],
+    libs: [
+        "tradefed",
+        "cts-shim-host-lib",
+    ],
     static_libs: [
         "testng",
         "compatibility-tradefed",
diff --git a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
index e673549..a0f4e0a 100644
--- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
@@ -17,12 +17,24 @@
 package com.android.tests.stagedinstallinternal;
 
 import static com.android.cts.install.lib.InstallUtils.getPackageInstaller;
+import static com.android.cts.install.lib.InstallUtils.waitForSessionReady;
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+
 import android.Manifest;
+import android.content.pm.ApexStagedEvent;
+import android.content.pm.IPackageManagerNative;
+import android.content.pm.IStagedApexObserver;
 import android.content.pm.PackageInstaller;
+import android.content.pm.StagedApexInfo;
+import android.os.IBinder;
+import android.os.ServiceManager;
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -35,6 +47,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
 
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
@@ -50,6 +64,10 @@
 
     private static final String TAG = StagedInstallInternalTest.class.getSimpleName();
 
+    private static final TestApp APEX_V2 = new TestApp(
+            "ApexV2", SHIM_APEX_PACKAGE_NAME, 2, /* isApex= */ true,
+            "com.android.apex.cts.shim.v2.apex");
+
     private File mTestStateFile = new File(
             InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(),
             "stagedinstall_state");
@@ -109,6 +127,72 @@
                 Install.multi(TestApp.AIncompleteSplit, TestApp.B1, TestApp.Apex1).setStaged());
     }
 
+    @Test
+    public void testGetStagedModuleNames() throws Exception {
+        // Before staging a session
+        String[] result = getPackageManagerNative().getStagedApexModuleNames();
+        assertThat(result).hasLength(0);
+        // Stage an apex
+        int sessionId = Install.single(APEX_V2).setStaged().commit();
+        waitForSessionReady(sessionId);
+        result = getPackageManagerNative().getStagedApexModuleNames();
+        assertThat(result).hasLength(1);
+        assertThat(result).isEqualTo(new String[]{SHIM_APEX_PACKAGE_NAME});
+        // Abandon the session
+        InstallUtils.openPackageInstallerSession(sessionId).abandon();
+        result = getPackageManagerNative().getStagedApexModuleNames();
+        assertThat(result).hasLength(0);
+    }
+
+    @Test
+    public void testGetStagedApexInfo() throws Exception {
+        // Ask for non-existing module
+        StagedApexInfo result = getPackageManagerNative().getStagedApexInfo("not found");
+        assertThat(result).isNull();
+        // Stage an apex
+        int sessionId = Install.single(APEX_V2).setStaged().commit();
+        waitForSessionReady(sessionId);
+        // Query proper module name
+        result = getPackageManagerNative().getStagedApexInfo(SHIM_APEX_PACKAGE_NAME);
+        assertThat(result.moduleName).isEqualTo(SHIM_APEX_PACKAGE_NAME);
+        InstallUtils.openPackageInstallerSession(sessionId).abandon();
+    }
+
+    public static class MockStagedApexObserver extends IStagedApexObserver.Stub {
+        @Override
+        public void onApexStaged(ApexStagedEvent event) {
+            assertThat(event).isNotNull();
+        }
+    }
+
+    @Test
+    public void testStagedApexObserver() throws Exception {
+        MockStagedApexObserver realObserver = new MockStagedApexObserver();
+        IStagedApexObserver observer = spy(realObserver);
+        assertThat(observer).isNotNull();
+        getPackageManagerNative().registerStagedApexObserver(observer);
+
+        // Stage an apex and verify observer was called
+        int sessionId = Install.single(APEX_V2).setStaged().commit();
+        waitForSessionReady(sessionId);
+        ArgumentCaptor<ApexStagedEvent> captor = ArgumentCaptor.forClass(ApexStagedEvent.class);
+        verify(observer, timeout(5000)).onApexStaged(captor.capture());
+        assertThat(captor.getValue().stagedApexModuleNames).isEqualTo(
+                new String[] {SHIM_APEX_PACKAGE_NAME});
+
+        // Abandon and verify observer is called
+        Mockito.clearInvocations(observer);
+        InstallUtils.openPackageInstallerSession(sessionId).abandon();
+        verify(observer, timeout(5000)).onApexStaged(captor.capture());
+        assertThat(captor.getValue().stagedApexModuleNames).hasLength(0);
+    }
+
+    private IPackageManagerNative getPackageManagerNative() {
+        IBinder binder = ServiceManager.waitForService("package_native");
+        assertThat(binder).isNotNull();
+        return IPackageManagerNative.Stub.asInterface(binder);
+    }
+
     private static void assertSessionReady(int sessionId) {
         assertSessionState(sessionId,
                 (session) -> assertThat(session.isStagedSessionReady()).isTrue());
diff --git a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
index dddb317..f92c31c 100644
--- a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
@@ -216,6 +216,21 @@
         assertThat(getStagingDirectories()).isEmpty();
     }
 
+    @Test
+    public void testGetStagedModuleNames() throws Exception {
+        runPhase("testGetStagedModuleNames");
+    }
+
+    @Test
+    public void testGetStagedApexInfo() throws Exception {
+        runPhase("testGetStagedApexInfo");
+    }
+
+    @Test
+    public void testStagedApexObserver() throws Exception {
+        runPhase("testStagedApexObserver");
+    }
+
     private List<String> getStagingDirectories() throws DeviceNotAvailableException {
         String baseDir = "/data/app-staging";
         try {
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index 672731c..899d268 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -319,12 +319,10 @@
 
             // The second subtag can either be a script or a region code.
             // If its size is 4, it's a script code, else it's a region code.
-            bool hasRegion = false;
             if (subtags[1].size() == 4) {
                 setScript(subtags[1]);
             } else if (subtags[1].size() == 2 || subtags[1].size() == 3) {
                 setRegion(subtags[1]);
-                hasRegion = true;
             } else {
                 fprintf(stderr, "ERROR: Invalid BCP 47 tag in directory name %s\n", part.string());
                 return -1;
diff --git a/tools/aapt/Android.bp b/tools/aapt/Android.bp
index c75ba71..cf5f313 100644
--- a/tools/aapt/Android.bp
+++ b/tools/aapt/Android.bp
@@ -50,7 +50,6 @@
         "libbase",
         "libz",
     ],
-    group_static_libs: true,
 
     cflags: [
         "-Wall",
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 257e96b..b9de11b 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -2475,11 +2475,10 @@
 {
     if (accessorCookie != NULL && fmt != NULL) {
         AccessorCookie* ac = (AccessorCookie*)accessorCookie;
-        int retval=0;
         char buf[1024];
         va_list ap;
         va_start(ap, fmt);
-        retval = vsnprintf(buf, sizeof(buf), fmt, ap);
+        vsnprintf(buf, sizeof(buf), fmt, ap);
         va_end(ap);
         ac->sourcePos.error("Error: %s (at '%s' with value '%s').\n",
                             buf, ac->attr.string(), ac->value.string());
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 5c5b3c3..5de0a63 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -72,7 +72,6 @@
         "libidmap2_policies",
     ],
     stl: "libc++_static",
-    group_static_libs: true,
 }
 
 // ==========================================================
@@ -196,9 +195,9 @@
     ],
     defaults: ["aapt2_defaults"],
     data: [
-         "integration-tests/CompileTest/**/*",
-         "integration-tests/CommandTests/**/*",
-         "integration-tests/ConvertTest/**/*"
+        "integration-tests/CompileTest/**/*",
+        "integration-tests/CommandTests/**/*",
+        "integration-tests/ConvertTest/**/*",
     ],
 }
 
diff --git a/tools/aapt2/cmd/Diff.cpp b/tools/aapt2/cmd/Diff.cpp
index d56994e..97e4436 100644
--- a/tools/aapt2/cmd/Diff.cpp
+++ b/tools/aapt2/cmd/Diff.cpp
@@ -148,7 +148,7 @@
       diff = true;
     }
   }
-  return false;
+  return diff;
 }
 
 static bool EmitResourceTypeDiff(IAaptContext* context, LoadedApk* apk_a,
diff --git a/tools/aosp/aosp_sha.sh b/tools/aosp/aosp_sha.sh
index 3960856..d345422 100755
--- a/tools/aosp/aosp_sha.sh
+++ b/tools/aosp/aosp_sha.sh
@@ -35,6 +35,7 @@
         echo
         echo "If your change contains no confidential details (such as security fixes), please"
         echo "upload and merge this change at https://android-review.googlesource.com/."
+        echo "Else add a tag 'Ignore-AOSP-First:' with the reason to bypass AOSP."
         echo
         exit 1
     fi
diff --git a/tools/lint/OWNERS b/tools/lint/OWNERS
new file mode 100644
index 0000000..7c04519
--- /dev/null
+++ b/tools/lint/OWNERS
@@ -0,0 +1,5 @@
+brufino@google.com
+jsharkey@google.com
+
+per-file *CallingSettingsNonUserGetterMethods* = file:/packages/SettingsProvider/OWNERS
+
diff --git a/tools/split-select/Android.bp b/tools/split-select/Android.bp
index c12fc6a..5402657 100644
--- a/tools/split-select/Android.bp
+++ b/tools/split-select/Android.bp
@@ -48,7 +48,6 @@
         "libbase",
         "libz",
     ],
-    group_static_libs: true,
 
     target: {
         windows: {