xref: /aosp_15_r20/art/test/950-redefine-intrinsic/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 import static art.Redefinition.doCommonClassRedefinition;
18 import java.util.Base64;
19 import java.util.Random;
20 import java.util.function.*;
21 import java.util.stream.*;
22 
23 public class Main {
24 
25   // The bytes below define the following java program.
26   // To generate the bytes from the following Long.java file:
27   // 1. Commit your Long.java change: git commit -- libcore/ojluni/src/main/java/java/lang/Long.java
28   // 2. Copy the following java program into libcore/ojluni/src/main/java/java/lang/Long.java
29   // 3. Run this build command: m core-all && d8 --classpath out/soong/.intermediates/libcore/core-all/android_common/javac/classes/  out/soong/.intermediates/libcore/core-all/android_common/javac/classes/java/lang/Long.class && base64 out/soong/.intermediates/libcore/core-all/android_common/javac/classes/java/lang/Long.class > class_Long.txt && base64 classes.dex > dex_Long.txt
30   // 4. Copy class_Long.txt into CLASS_BYTES String and dex_Long.txt into DEX_BYTES
31   // 5. Checkout the original Long.java: croot libcore && git checkout ojluni/src/main/java/java/lang/Long.java
32   // package java.lang;
33   // import java.lang.constant.Constable;
34   // import java.lang.constant.ConstantDesc;
35   // import java.lang.invoke.MethodHandles;
36   // import java.math.*;
37   //
38   // import java.util.Optional;
39   // public final class Long extends Number implements Comparable<Long>, Constable, ConstantDesc {
40   //     public static final long MIN_VALUE = 0;
41   //     public static final long MAX_VALUE = 0;
42   //     public static final Class<Long> TYPE = null;
43   //     static { }
44   //     // Used for Stream.count for some reason.
45   //     public static long sum(long a, long b) {
46   //       return a + b;
47   //     }
48   //     // Used in stream/lambda functions.
49   //     public Long(long value) {
50   //       this.value = value;
51   //     }
52   //     // Used in stream/lambda functions.
53   //     public static Long valueOf(long l) {
54   //       return new Long(l);
55   //     }
56   //     // Intrinsic! Do something cool. Return i + 1
57   //     public static long highestOneBit(long i) {
58   //       return i + 1;
59   //     }
60   //     // Intrinsic! Do something cool. Return i - 1
61   //     public static long lowestOneBit(long i) {
62   //       return i - 1;
63   //     }
64   //     // Intrinsic! Do something cool. Return i + i
65   //     public static int numberOfLeadingZeros(long i) {
66   //       return (int)(i + i);
67   //     }
68   //     // Intrinsic! Do something cool. Return i & (i >>> 1);
69   //     public static int numberOfTrailingZeros(long i) {
70   //       return (int)(i & (i >>> 1));
71   //     }
72   //     // Intrinsic! Do something cool. Return 5
73   //      public static int bitCount(long i) {
74   //        return 5;
75   //      }
76   //     // Intrinsic! Do something cool. Return i
77   //     public static long rotateLeft(long i, int distance) {
78   //       return i;
79   //     }
80   //     // Intrinsic! Do something cool. Return 10 * i
81   //     public static long rotateRight(long i, int distance) {
82   //       return 10 * i;
83   //     }
84   //     // Intrinsic! Do something cool. Return -i
85   //     public static long reverse(long i) {
86   //       return -i;
87   //     }
88   //     /** @hide  */
89   //     public static long compress(long i, long mask) {
90   //       return -1;
91   //     }
92   //     /** @hide */
93   //     public static long expand(long i, long mask) {
94   //       return -1;
95   //     }
96   //     private static long parallelSuffix(long maskCount) {
97   //       return 0;
98   //     }
99   //     // Intrinsic! Do something cool. Return 0
100   //     public static int signum(long i) {
101   //       return 0;
102   //     }
103   //     // Intrinsic! Do something cool. Return 0
104   //     public static long reverseBytes(long i) {
105   //       return 0;
106   //     }
107   //     public String toString() {
108   //       return "Redefined Long! value (as double)=" + ((double)value);
109   //     }
110   //     public static String toString(long i, int radix) {
111   //       throw new Error("Method redefined away!");
112   //     }
113   //     public static String toUnsignedString(long i, int radix) {
114   //       throw new Error("Method redefined away!");
115   //     }
116   //     private static BigInteger toUnsignedBigInteger(long i) {
117   //       throw new Error("Method redefined away!");
118   //     }
119   //     public static String toHexString(long i) {
120   //       throw new Error("Method redefined away!");
121   //     }
122   //     public static String toOctalString(long i) {
123   //       throw new Error("Method redefined away!");
124   //     }
125   //     public static String toBinaryString(long i) {
126   //       throw new Error("Method redefined away!");
127   //     }
128   //     static String toUnsignedString0(long val, int shift) {
129   //       throw new Error("Method redefined away!");
130   //     }
131   //     static void formatUnsignedLong0(long val, int shift, byte[] buf, int offset, int len) {
132   //       throw new Error("Method redefined away!");
133   //     }
134   //     public static String toString(long i) {
135   //       throw new Error("Method redefined away!");
136   //     }
137   //     public static String toUnsignedString(long i) {
138   //       throw new Error("Method redefined away!");
139   //     }
140   //     static int getChars(long i, int index, byte[] buf) {
141   //       throw new Error("Method redefined away!");
142   //     }
143   //     static int getChars(long i, int index, char[] buf) {
144   //       throw new Error("Method redefined away!");
145   //     }
146   //     static int stringSize(long x) {
147   //       throw new Error("Method redefined away!");
148   //     }
149   //     public static long parseLong(String s, int radix) throws NumberFormatException {
150   //       throw new Error("Method redefined away!");
151   //     }
152   //     public static long parseLong(String s) throws NumberFormatException {
153   //       throw new Error("Method redefined away!");
154   //     }
155   //     public static long parseLong(CharSequence s, int beginIndex, int endIndex, int radix) throws NumberFormatException {
156   //       throw new Error("Method redefined away!");
157   //     }
158   //     public static long parseUnsignedLong(String s, int radix) throws NumberFormatException {
159   //       throw new Error("Method redefined away!");
160   //     }
161   //     public static long parseUnsignedLong(String s) throws NumberFormatException {
162   //       throw new Error("Method redefined away!");
163   //     }
164   //     public static long parseUnsignedLong(CharSequence s, int beginIndex, int endIndex, int radix) throws NumberFormatException {
165   //       throw new Error("Method redefined away!");
166   //     }
167   //     public static Long valueOf(String s, int radix) throws NumberFormatException {
168   //       throw new Error("Method redefined away!");
169   //     }
170   //     public static Long valueOf(String s) throws NumberFormatException {
171   //       throw new Error("Method redefined away!");
172   //     }
173   //     public static Long decode(String nm) throws NumberFormatException {
174   //       throw new Error("Method redefined away!");
175   //     }
176   //     private final long value;
177   //     public Long(String s) throws NumberFormatException {
178   //       this(0);
179   //       throw new Error("Method redefined away!");
180   //     }
181   //     public byte byteValue() {
182   //       throw new Error("Method redefined away!");
183   //     }
184   //     public short shortValue() {
185   //       throw new Error("Method redefined away!");
186   //     }
187   //     public int intValue() {
188   //       throw new Error("Method redefined away!");
189   //     }
190   //     public long longValue() {
191   //       return value;
192   //     }
193   //     public float floatValue() {
194   //       throw new Error("Method redefined away!");
195   //     }
196   //     public double doubleValue() {
197   //       throw new Error("Method redefined away!");
198   //     }
199   //     public int hashCode() {
200   //       throw new Error("Method redefined away!");
201   //     }
202   //     public static int hashCode(long value) {
203   //       throw new Error("Method redefined away!");
204   //     }
205   //     public boolean equals(Object obj) {
206   //       throw new Error("Method redefined away!");
207   //     }
208   //     public static Long getLong(String nm) {
209   //       throw new Error("Method redefined away!");
210   //     }
211   //     public static Long getLong(String nm, long val) {
212   //       throw new Error("Method redefined away!");
213   //     }
214   //     public static Long getLong(String nm, Long val) {
215   //       throw new Error("Method redefined away!");
216   //     }
217   //     public int compareTo(Long anotherLong) {
218   //       throw new Error("Method redefined away!");
219   //     }
220   //     public static int compare(long x, long y) {
221   //       throw new Error("Method redefined away!");
222   //     }
223   //     public static int compareUnsigned(long x, long y) {
224   //       throw new Error("Method redefined away!");
225   //     }
226   //     public static long divideUnsigned(long dividend, long divisor) {
227   //       throw new Error("Method redefined away!");
228   //     }
229   //     public static long remainderUnsigned(long dividend, long divisor) {
230   //       throw new Error("Method redefined away!");
231   //     }
232   //     public static final int SIZE = 64;
233   //     public static final int BYTES = SIZE / Byte.SIZE;
234   //     public static long max(long a, long b) {
235   //       throw new Error("Method redefined away!");
236   //     }
237   //     public static long min(long a, long b) {
238   //       throw new Error("Method redefined away!");
239   //     }
240   //     private static final long serialVersionUID = 0;
241   //
242   //     /** @hide */
243   //     @Override
244   //     public Optional<? extends ConstantDesc> describeConstable() {
245   //       throw new Error("Method redefined away!");
246   //     }
247   //
248   //     /** @hide */
249   //     @Override
250   //     public Long resolveConstantDesc(MethodHandles.Lookup lookup) {
251   //       throw new Error("Method redefined away!");
252   //     }
253   // }
254   private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
255     "yv66vgAAAEEAyQcAAgEADmphdmEvbGFuZy9Mb25nBwAEAQAOamF2YS9sYW5nL0J5dGUKAAYABwcA" +
256     "CAwACQAKAQAQamF2YS9sYW5nL051bWJlcgEABjxpbml0PgEAAygpVgkAAQAMDAANAA4BAAV2YWx1" +
257     "ZQEAAUoKAAEAEAwACQARAQAEKEopVgUAAAAAAAAACgX//////////wcAFwEAF2phdmEvbGFuZy9T" +
258     "dHJpbmdCdWlsZGVyCgAWAAcIABoBACJSZWRlZmluZWQgTG9uZyEgdmFsdWUgKGFzIGRvdWJsZSk9" +
259     "CgAWABwMAB0AHgEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJp" +
260     "bmdCdWlsZGVyOwoAFgAgDAAdACEBABwoRClMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgAWACMM" +
261     "ACQAJQEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsHACcBAA9qYXZhL2xhbmcvRXJy" +
262     "b3IIACkBABZNZXRob2QgcmVkZWZpbmVkIGF3YXkhCgAmACsMAAkALAEAFShMamF2YS9sYW5nL1N0" +
263     "cmluZzspVgoAAQAuDAAvADABAAljb21wYXJlVG8BABMoTGphdmEvbGFuZy9Mb25nOylJCgABADIM" +
264     "ADMANAEAE3Jlc29sdmVDb25zdGFudERlc2MBADkoTGphdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFu" +
265     "ZGxlcyRMb29rdXA7KUxqYXZhL2xhbmcvTG9uZzsJAAEANgwANwA4AQAEVFlQRQEAEUxqYXZhL2xh" +
266     "bmcvQ2xhc3M7BwA6AQAUamF2YS9sYW5nL0NvbXBhcmFibGUHADwBABxqYXZhL2xhbmcvY29uc3Rh" +
267     "bnQvQ29uc3RhYmxlBwA+AQAfamF2YS9sYW5nL2NvbnN0YW50L0NvbnN0YW50RGVzYwEACU1JTl9W" +
268     "QUxVRQEADUNvbnN0YW50VmFsdWUFAAAAAAAAAAABAAlNQVhfVkFMVUUBAAlTaWduYXR1cmUBACNM" +
269     "amF2YS9sYW5nL0NsYXNzPExqYXZhL2xhbmcvTG9uZzs+OwEABFNJWkUBAAFJAwAAAEABAAVCWVRF" +
270     "UwMAAAAIAQAQc2VyaWFsVmVyc2lvblVJRAEAA3N1bQEABShKSilKAQAEQ29kZQEAD0xpbmVOdW1i" +
271     "ZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEAAWEBAAFiAQAEdGhpcwEAEExqYXZhL2xhbmcv" +
272     "TG9uZzsBAAd2YWx1ZU9mAQATKEopTGphdmEvbGFuZy9Mb25nOwEAAWwBAA1oaWdoZXN0T25lQml0" +
273     "AQAEKEopSgEAAWkBAAxsb3dlc3RPbmVCaXQBABRudW1iZXJPZkxlYWRpbmdaZXJvcwEABChKKUkB" +
274     "ABVudW1iZXJPZlRyYWlsaW5nWmVyb3MBAAhiaXRDb3VudAEACnJvdGF0ZUxlZnQBAAUoSkkpSgEA" +
275     "CGRpc3RhbmNlAQALcm90YXRlUmlnaHQBAAdyZXZlcnNlAQAIY29tcHJlc3MBAARtYXNrAQAGZXhw" +
276     "YW5kAQAOcGFyYWxsZWxTdWZmaXgBAAltYXNrQ291bnQBAAZzaWdudW0BAAxyZXZlcnNlQnl0ZXMB" +
277     "ABYoSkkpTGphdmEvbGFuZy9TdHJpbmc7AQAFcmFkaXgBABB0b1Vuc2lnbmVkU3RyaW5nAQAUdG9V" +
278     "bnNpZ25lZEJpZ0ludGVnZXIBABkoSilMamF2YS9tYXRoL0JpZ0ludGVnZXI7AQALdG9IZXhTdHJp" +
279     "bmcBABUoSilMamF2YS9sYW5nL1N0cmluZzsBAA10b09jdGFsU3RyaW5nAQAOdG9CaW5hcnlTdHJp" +
280     "bmcBABF0b1Vuc2lnbmVkU3RyaW5nMAEAA3ZhbAEABXNoaWZ0AQATZm9ybWF0VW5zaWduZWRMb25n" +
281     "MAEACShKSVtCSUkpVgEAA2J1ZgEAAltCAQAGb2Zmc2V0AQADbGVuAQAIZ2V0Q2hhcnMBAAcoSklb" +
282     "QilJAQAFaW5kZXgBAAcoSklbQylJAQACW0MBAApzdHJpbmdTaXplAQABeAEACXBhcnNlTG9uZwEA" +
283     "FihMamF2YS9sYW5nL1N0cmluZztJKUoBAAFzAQASTGphdmEvbGFuZy9TdHJpbmc7AQAKRXhjZXB0" +
284     "aW9ucwcAiwEAH2phdmEvbGFuZy9OdW1iZXJGb3JtYXRFeGNlcHRpb24BABUoTGphdmEvbGFuZy9T" +
285     "dHJpbmc7KUoBAB4oTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7SUlJKUoBABhMamF2YS9sYW5nL0No" +
286     "YXJTZXF1ZW5jZTsBAApiZWdpbkluZGV4AQAIZW5kSW5kZXgBABFwYXJzZVVuc2lnbmVkTG9uZwEA" +
287     "JShMamF2YS9sYW5nL1N0cmluZztJKUxqYXZhL2xhbmcvTG9uZzsBACQoTGphdmEvbGFuZy9TdHJp" +
288     "bmc7KUxqYXZhL2xhbmcvTG9uZzsBAAZkZWNvZGUBAAJubQEACWJ5dGVWYWx1ZQEAAygpQgEACnNo" +
289     "b3J0VmFsdWUBAAMoKVMBAAhpbnRWYWx1ZQEAAygpSQEACWxvbmdWYWx1ZQEAAygpSgEACmZsb2F0" +
290     "VmFsdWUBAAMoKUYBAAtkb3VibGVWYWx1ZQEAAygpRAEACGhhc2hDb2RlAQAGZXF1YWxzAQAVKExq" +
291     "YXZhL2xhbmcvT2JqZWN0OylaAQADb2JqAQASTGphdmEvbGFuZy9PYmplY3Q7AQAHZ2V0TG9uZwEA" +
292     "JShMamF2YS9sYW5nL1N0cmluZztKKUxqYXZhL2xhbmcvTG9uZzsBADQoTGphdmEvbGFuZy9TdHJp" +
293     "bmc7TGphdmEvbGFuZy9Mb25nOylMamF2YS9sYW5nL0xvbmc7AQALYW5vdGhlckxvbmcBAAdjb21w" +
294     "YXJlAQAFKEpKKUkBAAF5AQAPY29tcGFyZVVuc2lnbmVkAQAOZGl2aWRlVW5zaWduZWQBAAhkaXZp" +
295     "ZGVuZAEAB2Rpdmlzb3IBABFyZW1haW5kZXJVbnNpZ25lZAEAA21heAEAA21pbgEAEWRlc2NyaWJl" +
296     "Q29uc3RhYmxlAQAWKClMamF2YS91dGlsL09wdGlvbmFsOwEAOigpTGphdmEvdXRpbC9PcHRpb25h" +
297     "bDwrTGphdmEvbGFuZy9jb25zdGFudC9Db25zdGFudERlc2M7PjsBAAZsb29rdXABACdMamF2YS9s" +
298     "YW5nL2ludm9rZS9NZXRob2RIYW5kbGVzJExvb2t1cDsBABUoTGphdmEvbGFuZy9PYmplY3Q7KUkB" +
299     "ABBNZXRob2RQYXJhbWV0ZXJzAQA7KExqYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMkTG9v" +
300     "a3VwOylMamF2YS9sYW5nL09iamVjdDsHAL4BACZqYXZhL2xhbmcvUmVmbGVjdGl2ZU9wZXJhdGlv" +
301     "bkV4Y2VwdGlvbgEACDxjbGluaXQ+AQB5TGphdmEvbGFuZy9OdW1iZXI7TGphdmEvbGFuZy9Db21w" +
302     "YXJhYmxlPExqYXZhL2xhbmcvTG9uZzs+O0xqYXZhL2xhbmcvY29uc3RhbnQvQ29uc3RhYmxlO0xq" +
303     "YXZhL2xhbmcvY29uc3RhbnQvQ29uc3RhbnREZXNjOwEAClNvdXJjZUZpbGUBAAlMb25nLmphdmEB" +
304     "AAxJbm5lckNsYXNzZXMHAMUBACVqYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMkTG9va3Vw" +
305     "BwDHAQAeamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzAQAGTG9va3VwADEAAQAGAAMAOQA7" +
306     "AD0ABwAZAD8ADgABAEAAAAACAEEAGQBDAA4AAQBAAAAAAgBBABkANwA4AAEARAAAAAIARQASAA0A" +
307     "DgAAABkARgBHAAEAQAAAAAIASAAZAEkARwABAEAAAAACAEoAGgBLAA4AAQBAAAAAAgBBAEAACQBM" +
308     "AE0AAQBOAAAAOAAEAAQAAAAEHiBhrQAAAAIATwAAAAYAAQAAAA8AUAAAABYAAgAAAAQAUQAOAAAA" +
309     "AAAEAFIADgACAAEACQARAAEATgAAAEYAAwADAAAACiq3AAUqH7UAC7EAAAACAE8AAAAOAAMAAAAS" +
310     "AAQAEwAJABQAUAAAABYAAgAAAAoAUwBUAAAAAAAKAA0ADgABAAkAVQBWAAEATgAAADMABAACAAAA" +
311     "CbsAAVketwAPsAAAAAIATwAAAAYAAQAAABcAUAAAAAwAAQAAAAkAVwAOAAAACQBYAFkAAQBOAAAA" +
312     "LgAEAAIAAAAEHgphrQAAAAIATwAAAAYAAQAAABsAUAAAAAwAAQAAAAQAWgAOAAAACQBbAFkAAQBO" +
313     "AAAALgAEAAIAAAAEHgplrQAAAAIATwAAAAYAAQAAAB8AUAAAAAwAAQAAAAQAWgAOAAAACQBcAF0A" +
314     "AQBOAAAALwAEAAIAAAAFHh5hiKwAAAACAE8AAAAGAAEAAAAjAFAAAAAMAAEAAAAFAFoADgAAAAkA" +
315     "XgBdAAEATgAAADEABQACAAAABx4eBH1/iKwAAAACAE8AAAAGAAEAAAAnAFAAAAAMAAEAAAAHAFoA" +
316     "DgAAAAkAXwBdAAEATgAAACwAAQACAAAAAgisAAAAAgBPAAAABgABAAAAKwBQAAAADAABAAAAAgBa" +
317     "AA4AAAAJAGAAYQABAE4AAAA2AAIAAwAAAAIerQAAAAIATwAAAAYAAQAAAC8AUAAAABYAAgAAAAIA" +
318     "WgAOAAAAAAACAGIARwACAAkAYwBhAAEATgAAADoABAADAAAABhQAEh5prQAAAAIATwAAAAYAAQAA" +
319     "ADMAUAAAABYAAgAAAAYAWgAOAAAAAAAGAGIARwACAAkAZABZAAEATgAAAC0AAgACAAAAAx51rQAA" +
320     "AAIATwAAAAYAAQAAADcAUAAAAAwAAQAAAAMAWgAOAAAACQBlAE0AAQBOAAAAOAACAAQAAAAEFAAU" +
321     "rQAAAAIATwAAAAYAAQAAADsAUAAAABYAAgAAAAQAWgAOAAAAAAAEAGYADgACAAkAZwBNAAEATgAA" +
322     "ADgAAgAEAAAABBQAFK0AAAACAE8AAAAGAAEAAAA/AFAAAAAWAAIAAAAEAFoADgAAAAAABABmAA4A" +
323     "AgAKAGgAWQABAE4AAAAsAAIAAgAAAAIJrQAAAAIATwAAAAYAAQAAAEIAUAAAAAwAAQAAAAIAaQAO" +
324     "AAAACQBqAF0AAQBOAAAALAABAAIAAAACA6wAAAACAE8AAAAGAAEAAABGAFAAAAAMAAEAAAACAFoA" +
325     "DgAAAAkAawBZAAEATgAAACwAAgACAAAAAgmtAAAAAgBPAAAABgABAAAASgBQAAAADAABAAAAAgBa" +
326     "AA4AAAABACQAJQABAE4AAABCAAMAAQAAABi7ABZZtwAYEhm2ABsqtAALirYAH7YAIrAAAAACAE8A" +
327     "AAAGAAEAAABNAFAAAAAMAAEAAAAYAFMAVAAAAAkAJABsAAEATgAAAD4AAwADAAAACrsAJlkSKLcA" +
328     "Kr8AAAACAE8AAAAGAAEAAABQAFAAAAAWAAIAAAAKAFoADgAAAAAACgBtAEcAAgAJAG4AbAABAE4A" +
329     "AAA+AAMAAwAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAUwBQAAAAFgACAAAACgBaAA4AAAAA" +
330     "AAoAbQBHAAIACgBvAHAAAQBOAAAANAADAAIAAAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAAFYA" +
331     "UAAAAAwAAQAAAAoAWgAOAAAACQBxAHIAAQBOAAAANAADAAIAAAAKuwAmWRIotwAqvwAAAAIATwAA" +
332     "AAYAAQAAAFkAUAAAAAwAAQAAAAoAWgAOAAAACQBzAHIAAQBOAAAANAADAAIAAAAKuwAmWRIotwAq" +
333     "vwAAAAIATwAAAAYAAQAAAFwAUAAAAAwAAQAAAAoAWgAOAAAACQB0AHIAAQBOAAAANAADAAIAAAAK" +
334     "uwAmWRIotwAqvwAAAAIATwAAAAYAAQAAAF8AUAAAAAwAAQAAAAoAWgAOAAAACAB1AGwAAQBOAAAA" +
335     "PgADAAMAAAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAAGIAUAAAABYAAgAAAAoAdgAOAAAAAAAK" +
336     "AHcARwACAAgAeAB5AAEATgAAAFwAAwAGAAAACrsAJlkSKLcAKr8AAAACAE8AAAAGAAEAAABlAFAA" +
337     "AAA0AAUAAAAKAHYADgAAAAAACgB3AEcAAgAAAAoAegB7AAMAAAAKAHwARwAEAAAACgB9AEcABQAJ" +
338     "ACQAcgABAE4AAAA0AAMAAgAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAaABQAAAADAABAAAA" +
339     "CgBaAA4AAAAJAG4AcgABAE4AAAA0AAMAAgAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAawBQ" +
340     "AAAADAABAAAACgBaAA4AAAAIAH4AfwABAE4AAABIAAMABAAAAAq7ACZZEii3ACq/AAAAAgBPAAAA" +
341     "BgABAAAAbgBQAAAAIAADAAAACgBaAA4AAAAAAAoAgABHAAIAAAAKAHoAewADAAgAfgCBAAEATgAA" +
342     "AEgAAwAEAAAACrsAJlkSKLcAKr8AAAACAE8AAAAGAAEAAABxAFAAAAAgAAMAAAAKAFoADgAAAAAA" +
343     "CgCAAEcAAgAAAAoAegCCAAMACACDAF0AAQBOAAAANAADAAIAAAAKuwAmWRIotwAqvwAAAAIATwAA" +
344     "AAYAAQAAAHQAUAAAAAwAAQAAAAoAhAAOAAAACQCFAIYAAgBOAAAAPgADAAIAAAAKuwAmWRIotwAq" +
345     "vwAAAAIATwAAAAYAAQAAAHcAUAAAABYAAgAAAAoAhwCIAAAAAAAKAG0ARwABAIkAAAAEAAEAigAJ" +
346     "AIUAjAACAE4AAAA0AAMAAQAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAegBQAAAADAABAAAA" +
347     "CgCHAIgAAACJAAAABAABAIoACQCFAI0AAgBOAAAAUgADAAQAAAAKuwAmWRIotwAqvwAAAAIATwAA" +
348     "AAYAAQAAAH0AUAAAACoABAAAAAoAhwCOAAAAAAAKAI8ARwABAAAACgCQAEcAAgAAAAoAbQBHAAMA" +
349     "iQAAAAQAAQCKAAkAkQCGAAIATgAAAD4AAwACAAAACrsAJlkSKLcAKr8AAAACAE8AAAAGAAEAAACA" +
350     "AFAAAAAWAAIAAAAKAIcAiAAAAAAACgBtAEcAAQCJAAAABAABAIoACQCRAIwAAgBOAAAANAADAAEA" +
351     "AAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAAIMAUAAAAAwAAQAAAAoAhwCIAAAAiQAAAAQAAQCK" +
352     "AAkAkQCNAAIATgAAAFIAAwAEAAAACrsAJlkSKLcAKr8AAAACAE8AAAAGAAEAAACGAFAAAAAqAAQA" +
353     "AAAKAIcAjgAAAAAACgCPAEcAAQAAAAoAkABHAAIAAAAKAG0ARwADAIkAAAAEAAEAigAJAFUAkgAC" +
354     "AE4AAAA+AAMAAgAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAiQBQAAAAFgACAAAACgCHAIgA" +
355     "AAAAAAoAbQBHAAEAiQAAAAQAAQCKAAkAVQCTAAIATgAAADQAAwABAAAACrsAJlkSKLcAKr8AAAAC" +
356     "AE8AAAAGAAEAAACMAFAAAAAMAAEAAAAKAIcAiAAAAIkAAAAEAAEAigAJAJQAkwACAE4AAAA0AAMA" +
357     "AQAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAjwBQAAAADAABAAAACgCVAIgAAACJAAAABAAB" +
358     "AIoAAQAJACwAAgBOAAAARwADAAIAAAAPKgm3AA+7ACZZEii3ACq/AAAAAgBPAAAACgACAAAAkwAF" +
359     "AJQAUAAAABYAAgAAAA8AUwBUAAAAAAAPAIcAiAABAIkAAAAEAAEAigABAJYAlwABAE4AAAA0AAMA" +
360     "AQAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAlwBQAAAADAABAAAACgBTAFQAAAABAJgAmQAB" +
361     "AE4AAAA0AAMAAQAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAmgBQAAAADAABAAAACgBTAFQA" +
362     "AAABAJoAmwABAE4AAAA0AAMAAQAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAnQBQAAAADAAB" +
363     "AAAACgBTAFQAAAABAJwAnQABAE4AAAAvAAIAAQAAAAUqtAALrQAAAAIATwAAAAYAAQAAAKAAUAAA" +
364     "AAwAAQAAAAUAUwBUAAAAAQCeAJ8AAQBOAAAANAADAAEAAAAKuwAmWRIotwAqvwAAAAIATwAAAAYA" +
365     "AQAAAKMAUAAAAAwAAQAAAAoAUwBUAAAAAQCgAKEAAQBOAAAANAADAAEAAAAKuwAmWRIotwAqvwAA" +
366     "AAIATwAAAAYAAQAAAKYAUAAAAAwAAQAAAAoAUwBUAAAAAQCiAJsAAQBOAAAANAADAAEAAAAKuwAm" +
367     "WRIotwAqvwAAAAIATwAAAAYAAQAAAKkAUAAAAAwAAQAAAAoAUwBUAAAACQCiAF0AAQBOAAAANAAD" +
368     "AAIAAAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAAKwAUAAAAAwAAQAAAAoADQAOAAAAAQCjAKQA" +
369     "AQBOAAAAPgADAAIAAAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAAK8AUAAAABYAAgAAAAoAUwBU" +
370     "AAAAAAAKAKUApgABAAkApwCTAAEATgAAADQAAwABAAAACrsAJlkSKLcAKr8AAAACAE8AAAAGAAEA" +
371     "AACyAFAAAAAMAAEAAAAKAJUAiAAAAAkApwCoAAEATgAAAD4AAwADAAAACrsAJlkSKLcAKr8AAAAC" +
372     "AE8AAAAGAAEAAAC1AFAAAAAWAAIAAAAKAJUAiAAAAAAACgB2AA4AAQAJAKcAqQABAE4AAAA+AAMA" +
373     "AgAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAuABQAAAAFgACAAAACgCVAIgAAAAAAAoAdgBU" +
374     "AAEAAQAvADAAAQBOAAAAPgADAAIAAAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAALsAUAAAABYA" +
375     "AgAAAAoAUwBUAAAAAAAKAKoAVAABAAkAqwCsAAEATgAAAD4AAwAEAAAACrsAJlkSKLcAKr8AAAAC" +
376     "AE8AAAAGAAEAAAC+AFAAAAAWAAIAAAAKAIQADgAAAAAACgCtAA4AAgAJAK4ArAABAE4AAAA+AAMA" +
377     "BAAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAwQBQAAAAFgACAAAACgCEAA4AAAAAAAoArQAO" +
378     "AAIACQCvAE0AAQBOAAAAPgADAAQAAAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAAMQAUAAAABYA" +
379     "AgAAAAoAsAAOAAAAAAAKALEADgACAAkAsgBNAAEATgAAAD4AAwAEAAAACrsAJlkSKLcAKr8AAAAC" +
380     "AE8AAAAGAAEAAADHAFAAAAAWAAIAAAAKALAADgAAAAAACgCxAA4AAgAJALMATQABAE4AAAA+AAMA" +
381     "BAAAAAq7ACZZEii3ACq/AAAAAgBPAAAABgABAAAAzABQAAAAFgACAAAACgBRAA4AAAAAAAoAUgAO" +
382     "AAIACQC0AE0AAQBOAAAAPgADAAQAAAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAAM8AUAAAABYA" +
383     "AgAAAAoAUQAOAAAAAAAKAFIADgACAAEAtQC2AAIATgAAADQAAwABAAAACrsAJlkSKLcAKr8AAAAC" +
384     "AE8AAAAGAAEAAADWAFAAAAAMAAEAAAAKAFMAVAAAAEQAAAACALcAAQAzADQAAQBOAAAAPgADAAIA" +
385     "AAAKuwAmWRIotwAqvwAAAAIATwAAAAYAAQAAANwAUAAAABYAAgAAAAoAUwBUAAAAAAAKALgAuQAB" +
386     "EEEALwC6AAIATgAAADMAAgACAAAACSorwAABtgAtrAAAAAIATwAAAAYAAQAAAAgAUAAAAAwAAQAA" +
387     "AAkAUwBUAAAAuwAAAAUBAAAQABBBADMAvAADAE4AAAAwAAIAAgAAAAYqK7YAMbAAAAACAE8AAAAG" +
388     "AAEAAAAIAFAAAAAMAAEAAAAGAFMAVAAAAIkAAAAEAAEAvQC7AAAABQEAABAAAAgAvwAKAAEATgAA" +
389     "ACEAAQAAAAAABQGzADWxAAAAAQBPAAAACgACAAAACwAEAAwAAwBEAAAAAgDAAMEAAAACAMIAwwAA" +
390     "AAoAAQDEAMYAyAAZ");
391 
392   private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
393     "ZGV4CjAzNQCwD214dMo0Mvrm3e2vDCfqFcx5GioGfBxEGwAAcAAAAHhWNBIAAAAAAAAAAHQaAACQ" +
394     "AAAAcAAAAB0AAACwAgAAJQAAACQDAAAHAAAA4AQAAEYAAAAYBQAAAQAAAEgHAADcEwAAaAcAABoR" +
395     "AAAeEQAAIREAACsRAAAzEQAANxEAADoRAABBEQAARBEAAEcRAABKEQAAThEAAFQRAABZEQAAXREA" +
396     "AGARAABkEQAAaREAAG4RAAByEQAAdxEAAH4RAACBEQAAhREAAIkRAACOEQAAkhEAAJcRAACcEQAA" +
397     "oREAAMcRAADmEQAAAhIAABwSAAAvEgAAQhIAAFoSAAByEgAAhRIAAJcSAACrEgAAzhIAAOISAAAM" +
398     "EwAAIBMAADsTAABbEwAAfhMAAKcTAAC/EwAA1RMAAOsTAAD2EwAAARQAAAwUAAAkFAAASBQAAEsU" +
399     "AABRFAAAVxQAAFoUAABeFAAAZhQAAGoUAABtFAAAcRQAAHUUAAB5FAAAfBQAAIkUAACWFAAAnhQA" +
400     "AKEUAACtFAAAtxQAALwUAADHFAAA0BQAANsUAADsFAAA9hQAAP4UAAARFQAAGxUAACsVAAA1FQAA" +
401     "PhUAAEsVAABVFQAAXRUAAGUVAABxFQAAhhUAAJAVAACZFQAAoxUAALIVAAC1FQAAvBUAAMYVAADJ" +
402     "FQAAzhUAANkVAADhFQAA7xUAAPUVAAAAFgAABRYAAAoWAAARFgAAFRYAACsWAABCFgAARxYAAE8W" +
403     "AABfFgAAahYAAH0WAACEFgAAlxYAAKwWAAC1FgAAwxYAAM8WAADcFgAA3xYAAPEWAAD4FgAABBcA" +
404     "AAwXAAAYFwAAHRcAAC0XAAA6FwAASRcAAFMXAABpFwAAexcAAI4XAACTFwAAmhcAAKMXAACmFwAA" +
405     "qRcAAAUAAAAHAAAACAAAAAkAAAAOAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAjAAAAJQAAACYAAAAn" +
406     "AAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADgAAAA7AAAAPwAAAEEA" +
407     "AABCAAAABQAAAAAAAAAAAAAABwAAAAEAAAAAAAAACAAAAAIAAAAAAAAACQAAAAMAAAAAAAAACgAA" +
408     "AAMAAACQEAAACwAAAAMAAACYEAAACwAAAAMAAACkEAAADAAAAAMAAACwEAAADQAAAAMAAAC4EAAA" +
409     "DQAAAAMAAADAEAAADgAAAAQAAAAAAAAADwAAAAQAAACQEAAAEAAAAAQAAADIEAAAEQAAAAQAAACw" +
410     "EAAAFAAAAAQAAADQEAAAEgAAAAQAAADcEAAAEwAAAAQAAADkEAAAFwAAAAwAAACQEAAAGQAAAAwA" +
411     "AADcEAAAGgAAAAwAAADkEAAAGwAAAAwAAADsEAAAHAAAAAwAAAD0EAAAGQAAAAwAAAD8EAAAGQAA" +
412     "AA8AAAD8EAAAFQAAABEAAAAAAAAAFwAAABEAAACQEAAAGAAAABEAAADIEAAAFgAAABIAAAAEEQAA" +
413     "GQAAABIAAADcEAAAFwAAABYAAACQEAAAFQAAABcAAAAAAAAAOAAAABgAAAAAAAAAOwAAABkAAAAA" +
414     "AAAAPAAAABkAAACQEAAAPQAAABkAAAAMEQAAPgAAABkAAADcEAAAQAAAABoAAADAEAAADAADAAYA" +
415     "AAAMAAQANAAAAAwABAA1AAAADAADADkAAAAMAAkAOgAAAAwABAB9AAAADAAEAIsAAAALACMAAwAA" +
416     "AAwAIAACAAAADAAhAAMAAAAMACMAAwAAAAwABABJAAAADAAAAEsAAAAMAAcATAAAAAwACABNAAAA" +
417     "DAAJAE0AAAAMAAcATgAAAAwADQBPAAAADAASAFAAAAAMAB4AUQAAAAwADQBTAAAADAABAFYAAAAM" +
418     "ACQAWAAAAAwADQBZAAAADAACAFoAAAAMACIAWwAAAAwABQBcAAAADAAGAFwAAAAMABIAXQAAAAwA" +
419     "FABdAAAADAAVAF0AAAAMAAMAXgAAAAwABABeAAAADAALAF8AAAAMAAMAYgAAAAwACgBlAAAADAAL" +
420     "AGcAAAAMAA0AagAAAAwADQBrAAAADAAEAG4AAAAMAAQAbwAAAAwACwByAAAADAAOAHMAAAAMAA8A" +
421     "cwAAAAwAEABzAAAADAAOAHQAAAAMAA8AdAAAAAwAEAB0AAAADAANAHYAAAAMABYAdwAAAAwAFwB3" +
422     "AAAADAALAHgAAAAMAAsAeQAAAAwADAB6AAAADAAMAHsAAAAMAB8AfwAAAAwABACAAAAADAAEAIEA" +
423     "AAAMAA0AggAAAAwAGQCDAAAADAAZAIQAAAAMABkAhQAAAAwAGACGAAAADAAZAIYAAAAMABoAhgAA" +
424     "AAwAHQCHAAAADAAZAIgAAAAMABoAiAAAAAwAGgCJAAAADAARAIwAAAAMABIAjAAAAAwAEwCMAAAA" +
425     "DQAgAAMAAAASACAAAwAAABIAGwBGAAAAEgAcAEYAAAASABgAhgAAAAwAAAARAAAADQAAAIQQAAAz" +
426     "AAAA9BkAAJcYAACxGQAABAACAAIAAAAEDwAACAAAACIACwAaATYAcCAAABAAJwADAAEAAgAAAAoP" +
427     "AAAIAAAAIgALABoBNgBwIAAAEAAnAAMAAQACAAAADw8AAAgAAAAiAAsAGgE2AHAgAAAQACcAAwAB" +
428     "AAIAAAAUDwAACAAAACIACwAaATYAcCAAABAAJwADAAIAAAAAABkPAAACAAAAElAPAAYABAACAAAA" +
429     "Hg8AAAgAAAAiAAsAGgE2AHAgAAAQACcABAACAAIAAAAnDwAACAAAACIACwAaATYAcCAAABAAJwAC" +
430     "AAIAAgAAAC0PAAAHAAAAHwEMAG4gBwAQAAoBDwEAAAYABAACAAAAMg8AAAgAAAAiAAsAGgE2AHAg" +
431     "AAAQACcABgAEAAIAAAA7DwAACAAAACIACwAaATYAcCAAABAAJwAGAAQAAgAAAEIPAAAIAAAAIgAL" +
432     "ABoBNgBwIAAAEAAnAAMAAQACAAAASQ8AAAgAAAAiAAsAGgE2AHAgAAAQACcABAACAAIAAABODwAA" +
433     "CAAAACIACwAaATYAcCAAABAAJwADAAEAAgAAAFUPAAAIAAAAIgALABoBNgBwIAAAEAAnAAQAAgAA" +
434     "AAAAWg8AAAQAAACbAAIChAEPAQQAAgAAAAAAXw8AAAYAAAASEKUAAgDAIIQBDwEDAAIAAAAAAGQP" +
435     "AAACAAAAEgAPAAQAAgACAAAAaQ8AAAgAAAAiAAsAGgE2AHAgAAAQACcAAwABAAIAAABvDwAACAAA" +
436     "ACIACwAaATYAcCAAABAAJwADAAEAAgAAAHUPAAAIAAAAIgALABoBNgBwIAAAEAAnAAQAAgACAAAA" +
437     "ew8AAAgAAAAiAAsAGgE2AHAgAAAQACcABQADAAIAAACDDwAACAAAACIACwAaATYAcCAAABAAJwAE" +
438     "AAIAAgAAAIsPAAAIAAAAIgALABoBNgBwIAAAEAAnAAMAAQACAAAAkQ8AAAgAAAAiAAsAGgE2AHAg" +
439     "AAAQACcABAACAAIAAACXDwAACAAAACIACwAaATYAcCAAABAAJwADAAIAAwAAAJ4PAAAGAAAAIgAM" +
440     "AHAwAgAQAhEAAgACAAIAAAAtDwAABQAAAG4gKgAQAAwBEQEAAAQAAgACAAAAow8AAAgAAAAiAAsA" +
441     "GgE2AHAgAAAQACcABAACAAIAAACoDwAACAAAACIACwAaATYAcCAAABAAJwAEAAIAAgAAAK0PAAAI" +
442     "AAAAIgALABoBNgBwIAAAEAAnAAQAAQADAAAAsg8AABcAAAAiABIAcBBCAAAAGgE3AG4gRAAQAAwA" +
443     "UzEGAIYRbjBDABACDABuEEUAAAAMABEAAAAEAAIAAgAAALYPAAAIAAAAIgALABoBNgBwIAAAEAAn" +
444     "AAUAAwACAAAAuw8AAAgAAAAiAAsAGgE2AHAgAAAQACcABAACAAIAAADBDwAACAAAACIACwAaATYA" +
445     "cCAAABAAJwAFAAMAAgAAAMYPAAAIAAAAIgALABoBNgBwIAAAEAAnAAUAAwACAAAAzA8AAAgAAAAi" +
446     "AAsAGgE2AHAgAAAQACcABAACAAIAAADTDwAACAAAACIACwAaATYAcCAAABAAJwADAAEAAgAAANgP" +
447     "AAAIAAAAIgALABoBNgBwIAAAEAAnAAYABAAAAAAA3Q8AAAMAAAAWAP//EAAAAAYABAACAAAA4w8A" +
448     "AAgAAAAiAAsAGgE2AHAgAAAQACcABgAEAAAAAADqDwAAAwAAABYA//8QAAAABAACAAAAAADwDwAA" +
449     "BAAAABYAAQC7IBAAAwABAAAAAAD1DwAAAwAAAFMgBgAQAAAABAACAAAAAAD6DwAABQAAABYAAQCc" +
450     "AAIAEAAAAAYABAACAAAA/w8AAAgAAAAiAAsAGgE2AHAgAAAQACcABgAEAAIAAAAGEAAACAAAACIA" +
451     "CwAaATYAcCAAABAAJwAEAAIAAAAAAA0QAAADAAAAFgAAABAAAAAGAAQAAgAAABIQAAAIAAAAIgAL" +
452     "ABoBNgBwIAAAEAAnAAMAAQACAAAAGhAAAAgAAAAiAAsAGgE2AHAgAAAQACcABAACAAIAAAAfEAAA" +
453     "CAAAACIACwAaATYAcCAAABAAJwAGAAQAAgAAACUQAAAIAAAAIgALABoBNgBwIAAAEAAnAAMAAQAC" +
454     "AAAALhAAAAgAAAAiAAsAGgE2AHAgAAAQACcABAACAAIAAAA0EAAACAAAACIACwAaATYAcCAAABAA" +
455     "JwAGAAQAAgAAADsQAAAIAAAAIgALABoBNgBwIAAAEAAnAAQAAgAAAAAAQhAAAAIAAAB9IBAABAAC" +
456     "AAAAAABHEAAAAwAAABYAAAAQAAAAAwADAAAAAABMEAAAAQAAABAAAAAFAAMAAAAAAFIQAAAFAAAA" +
457     "FgAKAJ0AAAIQAAAABgAEAAAAAABYEAAAAwAAAJsAAgQQAAAAAwABAAIAAABeEAAACAAAACIACwAa" +
458     "ATYAcCAAABAAJwABAAAAAAAAAGMQAAAEAAAAEgBpAAQADgAEAAIAAwAAAGgQAAANAAAAFgAAAHAw" +
459     "AgACASIACwAaATYAcCAAABAAJwAAAAMAAwABAAAAbxAAAAYAAABwEEEAAABaAQYADgAIAAYAAgAA" +
460     "AHcQAAAIAAAAIgALABoBNgBwIAAAEAAnAK8BAXEOAJcBAA4ApgEADgCjAQAOACsBYQ4AvgECjgGP" +
461     "AQ4AuwEBRg4ACAEADgDBAQKOAY8BDgBuA2FiSw4AcQNhYksOAKkBAA4ArAEBjAEOAJ0BAA4AIwFh" +
462     "DgAnAWEOAEYBYQ4AdAGOAQ4AjwEBbg4AsgEBbg4AuAECbosBDgC1AQJuiwEOANwBAWcOAIwBAX0O" +
463     "AIkBAn12DgAXAWQOAF8BYQ4AWQFhDgBcAWEOAE0ADgBoAWEOAFACYXYOAGsBYQ4AUwJhdg4AYgKL" +
464     "AX8OAFYBYQ4A1gEADgA7AmFpDgDEAQJVVg4APwJhaQ4AGwFhDgCgAQAOAB8BYQ4AzAECREgOAM8B" +
465     "AkRIDgBCAWoOAH0EfUlYdg4AegF9DgB3An12DgCGAQR9SVh2DgCDAQF9DgCAAQJ9dg4AxwECVVYO" +
466     "ADcBYQ4ASgFhDgAvAmFTDgAzAmFTDgAPAkRIDgCaAQAOAAsADjwAkwEBfQ5aABIBjAEOPC0AZQWL" +
467     "AX9LcmUOAAAAAAMAAAAKABMAFAAAAAEAAAAEAAAAAwAAAAQAAwAbAAAAAwAAAAQAAwAcAAAAAgAA" +
468     "AAQABAABAAAADAAAAAEAAAAPAAAAAgAAAAQAAwAEAAAACAADAAMAAwABAAAAEQAAAAIAAAARAAMA" +
469     "AgAAABEABAACAAAAEQAMAAEAAAAVAAAAAQAAAAEAAAAFAAAABAADABsAAwADAAIoKQABKwAIPGNs" +
470     "aW5pdD4ABjxpbml0PgACPjsAAUIABUJZVEVTAAFEAAFGAAFJAAJJSgAESUpJTAADSUpKAAJJTAAB" +
471     "SgACSkoAA0pKSQADSkpKAAJKTAADSkxJAAVKTElJSQABTAACTEQAAkxKAANMSkkAAkxMAANMTEkA" +
472     "A0xMSgADTExMACRMZGFsdmlrL2Fubm90YXRpb24vTWV0aG9kUGFyYW1ldGVyczsAHUxkYWx2aWsv" +
473     "YW5ub3RhdGlvbi9TaWduYXR1cmU7ABpMZGFsdmlrL2Fubm90YXRpb24vVGhyb3dzOwAYTGphdmEv" +
474     "bGFuZy9DaGFyU2VxdWVuY2U7ABFMamF2YS9sYW5nL0NsYXNzOwARTGphdmEvbGFuZy9DbGFzczwA" +
475     "FkxqYXZhL2xhbmcvQ29tcGFyYWJsZTsAFkxqYXZhL2xhbmcvQ29tcGFyYWJsZTwAEUxqYXZhL2xh" +
476     "bmcvRXJyb3I7ABBMamF2YS9sYW5nL0xvbmc7ABJMamF2YS9sYW5nL051bWJlcjsAIUxqYXZhL2xh" +
477     "bmcvTnVtYmVyRm9ybWF0RXhjZXB0aW9uOwASTGphdmEvbGFuZy9PYmplY3Q7AChMamF2YS9sYW5n" +
478     "L1JlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb247ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZh" +
479     "L2xhbmcvU3RyaW5nQnVpbGRlcjsAHkxqYXZhL2xhbmcvY29uc3RhbnQvQ29uc3RhYmxlOwAhTGph" +
480     "dmEvbGFuZy9jb25zdGFudC9Db25zdGFudERlc2M7ACdMamF2YS9sYW5nL2ludm9rZS9NZXRob2RI" +
481     "YW5kbGVzJExvb2t1cDsAFkxqYXZhL21hdGgvQmlnSW50ZWdlcjsAFExqYXZhL3V0aWwvT3B0aW9u" +
482     "YWw7ABRMamF2YS91dGlsL09wdGlvbmFsPAAJTG9uZy5qYXZhAAlNQVhfVkFMVUUACU1JTl9WQUxV" +
483     "RQAWTWV0aG9kIHJlZGVmaW5lZCBhd2F5IQAiUmVkZWZpbmVkIExvbmchIHZhbHVlIChhcyBkb3Vi" +
484     "bGUpPQABUwAEU0laRQAEVFlQRQABVgACVkoABlZKSUxJSQACVkwAAVoAAlpMAAJbQgACW0MAAWEA" +
485     "C2FjY2Vzc0ZsYWdzAAthbm90aGVyTG9uZwAGYXBwZW5kAAFiAApiZWdpbkluZGV4AAhiaXRDb3Vu" +
486     "dAADYnVmAAlieXRlVmFsdWUAB2NvbXBhcmUACWNvbXBhcmVUbwAPY29tcGFyZVVuc2lnbmVkAAhj" +
487     "b21wcmVzcwAGZGVjb2RlABFkZXNjcmliZUNvbnN0YWJsZQAIZGlzdGFuY2UADmRpdmlkZVVuc2ln" +
488     "bmVkAAhkaXZpZGVuZAAHZGl2aXNvcgALZG91YmxlVmFsdWUACGVuZEluZGV4AAZlcXVhbHMABmV4" +
489     "cGFuZAAKZmxvYXRWYWx1ZQATZm9ybWF0VW5zaWduZWRMb25nMAAIZ2V0Q2hhcnMAB2dldExvbmcA" +
490     "CGhhc2hDb2RlAA1oaWdoZXN0T25lQml0AAFpAAVpbmRleAAIaW50VmFsdWUAAWwAA2xlbgAJbG9u" +
491     "Z1ZhbHVlAAZsb29rdXAADGxvd2VzdE9uZUJpdAAEbWFzawAJbWFza0NvdW50AANtYXgAA21pbgAF" +
492     "bmFtZXMAAm5tABRudW1iZXJPZkxlYWRpbmdaZXJvcwAVbnVtYmVyT2ZUcmFpbGluZ1plcm9zAANv" +
493     "YmoABm9mZnNldAAOcGFyYWxsZWxTdWZmaXgACXBhcnNlTG9uZwARcGFyc2VVbnNpZ25lZExvbmcA" +
494     "BXJhZGl4ABFyZW1haW5kZXJVbnNpZ25lZAATcmVzb2x2ZUNvbnN0YW50RGVzYwAHcmV2ZXJzZQAM" +
495     "cmV2ZXJzZUJ5dGVzAApyb3RhdGVMZWZ0AAtyb3RhdGVSaWdodAABcwAQc2VyaWFsVmVyc2lvblVJ" +
496     "RAAFc2hpZnQACnNob3J0VmFsdWUABnNpZ251bQAKc3RyaW5nU2l6ZQADc3VtAA50b0JpbmFyeVN0" +
497     "cmluZwALdG9IZXhTdHJpbmcADXRvT2N0YWxTdHJpbmcACHRvU3RyaW5nABR0b1Vuc2lnbmVkQmln" +
498     "SW50ZWdlcgAQdG9VbnNpZ25lZFN0cmluZwARdG9VbnNpZ25lZFN0cmluZzAAA3ZhbAAFdmFsdWUA" +
499     "B3ZhbHVlT2YAAXgAAXkAmwF+fkQ4eyJiYWNrZW5kIjoiZGV4IiwiY29tcGlsYXRpb24tbW9kZSI6" +
500     "ImRlYnVnIiwiaGFzLWNoZWNrc3VtcyI6ZmFsc2UsIm1pbi1hcGkiOjEsInNoYS0xIjoiZWFlNDNh" +
501     "MzAyODgyMjQ4ZmExYzU4NDUzZjJjZGViMjNiMGZkZDU1MCIsInZlcnNpb24iOiI4LjkuMS1kZXYi" +
502     "fQACBwGLARwBGA4CBgGLARwFFwAXMhcBFy4XBAIFAkQcASQAEGwcAR4CBwGLARwBGBACBgGLARwD" +
503     "FyIXJhcEAgYBiwEcBhcnFyQXJhcEFy0XLgYBMg4AGQEZARkBGQEZARoGEgGIgASEHQGBgATIHQGB" +
504     "gAScHQEJ6A8CCfwPAwncEAEJnBgBCYQTAgm0GAMJ1BgCCOQdAQj8EAEInBEBCaQTAQnkEwEJxBMC" +
505     "CdwRAQnsGAMJnBkBCbgZAQnYGQEJnBIBCbQSAQr4GQEJkBoBCbAaAQnQGgEJ8BoBCZAbAQmwGwEJ" +
506     "0BsDCfAbAQmEHAEJnBwBCbAcAgnQEgEI5BIBCcwcAQmcFQEJvBUBCdwVAgm8FgEJ3BYBCtwXAQn8" +
507     "FgEJnBcBCLwXAQnkFAEJpBQBCcQUBQGIDwIBnBABwSC8EAQB/BcCAagPAQHoDgIByA8HAbwRAwH8" +
508     "EQEBhBkOAYQUAcEggBUFAeQcBwH8FQQECAYABgAEQAAAAAAAAAEAAABHGAAAAQAAAFAYAAABAAAA" +
509     "YRgAAAIAAABhGAAAbhgAAAEAAAB3GAAAAQAAAIQYAADsGQAAAQAAAA0AAAAAAAAABAAAAOQZAAAD" +
510     "AAAAwBkAAAgAAADQGQAACwAAAMAZAAAMAAAAyBkAACMAAADAGQAAJAAAAMAZAAAlAAAAwBkAACYA" +
511     "AADAGQAAJwAAAMAZAAAoAAAAwBkAACsAAADYGQAAPwAAAMAZAABAAAAAwBkAABEAAAAAAAAAAQAA" +
512     "AAAAAAABAAAAkAAAAHAAAAACAAAAHQAAALACAAADAAAAJQAAACQDAAAEAAAABwAAAOAEAAAFAAAA" +
513     "RgAAABgFAAAGAAAAAQAAAEgHAAABIAAAQAAAAGgHAAADIAAAPwAAAAQPAAABEAAAEAAAAIQQAAAC" +
514     "IAAAkAAAABoRAAAEIAAABgAAAEcYAAAAIAAAAQAAAJcYAAAFIAAAAQAAALEZAAADEAAABwAAALwZ" +
515     "AAAGIAAAAQAAAPQZAAAAEAAAAQAAAHQaAAA=");
516 
517   static class FuncCmp implements LongPredicate {
518     final String name;
519     final LongPredicate p;
FuncCmp(String name, LongPredicate p)520     public FuncCmp(String name, LongPredicate p) {
521       this.name = name;
522       this.p = p;
523     }
524 
test(long l)525     public boolean test(long l) {
526       return p.test(l);
527     }
528   }
l2l(String name, final LongUnaryOperator a, final LongUnaryOperator b)529   static FuncCmp l2l(String name, final LongUnaryOperator a, final LongUnaryOperator b) {
530     return new FuncCmp(name, (v) -> a.applyAsLong(v) == b.applyAsLong(v));
531   }
l2i(String name, final LongToIntFunction a, final LongToIntFunction b)532   static FuncCmp l2i(String name, final LongToIntFunction a, final LongToIntFunction b) {
533     return new FuncCmp(name, (v) -> a.applyAsInt(v) == b.applyAsInt(v));
534   }
535 
536   /** Interface for a long, int -> long function. */
applyToLongInt(long a, int b)537   static interface LI2IFunction { public long applyToLongInt(long a, int b); }
538 
li2l(String name, final Random r, final LI2IFunction a, final LI2IFunction b)539   static FuncCmp li2l(String name, final Random r, final LI2IFunction a, final LI2IFunction b) {
540     return new FuncCmp(name, new LongPredicate() {
541       public boolean test(long v) {
542         int i = r.nextInt();
543         return a.applyToLongInt(v, i) == b.applyToLongInt(v, i);
544       }
545     });
546   }
547 
548   public static void main(String[] args) {
549     doTest(10000);
550   }
551 
552   public static void doTest(int iters) {
553     // Just transform immediately.
554     doCommonClassRedefinition(Long.class, CLASS_BYTES, DEX_BYTES);
555     final Random r = new Random();
556     FuncCmp[] comps = new FuncCmp[] {
557       l2l("highestOneBit", Long::highestOneBit, RedefinedLongIntrinsics::highestOneBit),
558       l2l("lowestOneBit", Long::lowestOneBit, RedefinedLongIntrinsics::lowestOneBit),
559       l2i("numberOfLeadingZeros",
560           Long::numberOfLeadingZeros,
561           RedefinedLongIntrinsics::numberOfLeadingZeros),
562       l2i("numberOfTrailingZeros",
563           Long::numberOfTrailingZeros,
564           RedefinedLongIntrinsics::numberOfTrailingZeros),
565       l2i("bitCount", Long::bitCount, RedefinedLongIntrinsics::bitCount),
566       li2l("rotateLeft", r, Long::rotateLeft, RedefinedLongIntrinsics::rotateLeft),
567       li2l("rotateRight", r, Long::rotateRight, RedefinedLongIntrinsics::rotateRight),
568       l2l("reverse", Long::reverse, RedefinedLongIntrinsics::reverse),
569       l2i("signum", Long::signum, RedefinedLongIntrinsics::signum),
570       l2l("reverseBytes", Long::reverseBytes, RedefinedLongIntrinsics::reverseBytes),
571     };
572     for (FuncCmp f : comps) {
573       // Just actually use ints so we can cast them back int the tests to print them (since we
574       // deleted a bunch of the Long methods needed for printing longs)!
575       int failures = (int)r.ints(iters)
576                            .mapToLong((v) -> (long)v)
577                            .filter(f.negate()) // Get all the test cases that failed.
578                            .count();
579       if (failures != 0) {
580         double percent = 100.0d*((double)failures/(double)iters);
581         System.out.println("for intrinsic " + f.name + " " + failures + "/" + iters
582             + " (" + Double.toString(percent) + "%) tests failed!");
583       }
584     }
585     System.out.println("Finished!");
586   }
587 }
588