blob: 57a08e1370ba3a4e68b80035a133c8e223b1b252 [file] [log] [blame]
// Copyright 2011 Google Inc. All Rights Reserved.
#include <dirent.h>
#include <dlfcn.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "base64.h"
#include "heap.h"
#include "thread.h"
#include "stringprintf.h"
#include "class_linker.h"
#include "dex_file.h"
#include "unicode/uclean.h"
#include "unicode/uvernum.h"
#include "gtest/gtest.h"
namespace art {
//class IntMath {
//
// /*
// * Try to cause some unary operations.
// */
// static int unopTest(int x) {
// x = -x;
// x ^= 0xffffffff;
// return x;
// }
//
// static int shiftTest1() {
// final int[] mBytes = {
// 0x11, 0x22, 0x33, 0x44, 0x88, 0x99, 0xaa, 0xbb
// };
// long l;
// int i1, i2;
//
// i1 = mBytes[0] | mBytes[1] << 8 | mBytes[2] << 16 | mBytes[3] << 24;
// i2 = mBytes[4] | mBytes[5] << 8 | mBytes[6] << 16 | mBytes[7] << 24;
// l = i1 | ((long)i2 << 32);
//
// if (i1 != 0x44332211) { return 1; }
// if (i2 != 0xbbaa9988) { return 2; }
// if (l != 0xbbaa998844332211L) { return 3; }
//
// l = (long)mBytes[0]
// | (long)mBytes[1] << 8
// | (long)mBytes[2] << 16
// | (long)mBytes[3] << 24
// | (long)mBytes[4] << 32
// | (long)mBytes[5] << 40
// | (long)mBytes[6] << 48
// | (long)mBytes[7] << 56;
//
// if (l != 0xbbaa998844332211L) { return 4; }
// return 0;
// }
//
// static int shiftTest2() {
//
// long a = 0x11;
// long b = 0x22;
// long c = 0x33;
// long d = 0x44;
// long e = 0x55;
// long f = 0x66;
// long g = 0x77;
// long h = 0x88;
//
// long result = ((a << 56) | (b << 48) | (c << 40) | (d << 32) |
// (e << 24) | (f << 16) | (g << 8) | h);
//
// if (result != 0x1122334455667788L) { return 1; }
// return 0;
// }
//
// static int unsignedShiftTest() {
// byte b = -4;
// short s = -4;
// char c = 0xfffc;
// int i = -4;
//
// b >>>= 4;
// s >>>= 4;
// c >>>= 4;
// i >>>= 4;
//
// if ((int) b != -1) { return 1; }
// if ((int) s != -1) { return 2; }
// if ((int) c != 0x0fff) { return 3; }
// if (i != 268435455) { return 4; }
// return 0;
// }
//
// static int convTest() {
//
// float f;
// double d;
// int i;
// long l;
//
// /* int --> long */
// i = 7654;
// l = (long) i;
// if (l != 7654L) { return 1; }
//
// i = -7654;
// l = (long) i;
// if (l != -7654L) { return 2; }
//
// /* long --> int (with truncation) */
// l = 5678956789L;
// i = (int) l;
// if (i != 1383989493) { return 3; }
//
// l = -5678956789L;
// i = (int) l;
// if (i != -1383989493) { return 4; }
// return 0;
// }
//
// static int charSubTest() {
//
// char char1 = 0x00e9;
// char char2 = 0xffff;
// int i;
//
// /* chars are unsigned-expanded to ints before subtraction */
// i = char1 - char2;
// if (i != 0xffff00ea) { return 1; }
// return 0;
// }
//
// /*
// * We pass in the arguments and return the results so the compiler
// * doesn't do the math for us. (x=70000, y=-3)
// */
// static int intOperTest(int x, int y) {
// int[] results = new int[10];
//
// /* this seems to generate "op-int" instructions */
// results[0] = x + y;
// results[1] = x - y;
// results[2] = x * y;
// results[3] = x * x;
// results[4] = x / y;
// results[5] = x % -y;
// results[6] = x & y;
// results[7] = x | y;
// results[8] = x ^ y;
//
// /* this seems to generate "op-int/2addr" instructions */
// results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
//
// /* check this edge case while we're here (div-int/2addr) */
// int minInt = -2147483648;
// int negOne = -results[5];
// int plusOne = 1;
// int result = (((minInt + plusOne) - plusOne) / negOne) / negOne;
//
// if (result != minInt) { return 1;};
// if (results[0] != 69997) { return 2;};
// if (results[1] != 70003) { return 3;};
// if (results[2] != -210000) { return 4;};
// if (results[3] != 605032704) { return 5;};
// if (results[4] != -23333) { return 6;};
// if (results[5] != 1) { return 7;};
// if (results[6] != 70000) { return 8;};
// if (results[7] != -3) { return 9;};
// if (results[8] != -70003) { return 10;};
// if (results[9] != 70000) { return 11;};
//
// return 0;
// }
//
// /*
// * More operations, this time with 16-bit constants. (x=77777)
// */
// static int lit16Test(int x) {
//
// int[] results = new int[8];
//
// /* try to generate op-int/lit16" instructions */
// results[0] = x + 1000;
// results[1] = 1000 - x;
// results[2] = x * 1000;
// results[3] = x / 1000;
// results[4] = x % 1000;
// results[5] = x & 1000;
// results[6] = x | -1000;
// results[7] = x ^ -1000;
//
// if (results[0] != 78777) { return 1; }
// if (results[1] != -76777) { return 2; }
// if (results[2] != 77777000) { return 3; }
// if (results[3] != 77) { return 4; }
// if (results[4] != 777) { return 5; }
// if (results[5] != 960) { return 6; }
// if (results[6] != -39) { return 7; }
// if (results[7] != -76855) { return 8; }
// return 0;
// }
//
// /*
// * More operations, this time with 8-bit constants. (x=-55555)
// */
// static int lit8Test(int x) {
//
// int[] results = new int[8];
//
// /* try to generate op-int/lit8" instructions */
// results[0] = x + 10;
// results[1] = 10 - x;
// results[2] = x * 10;
// results[3] = x / 10;
// results[4] = x % 10;
// results[5] = x & 10;
// results[6] = x | -10;
// results[7] = x ^ -10;
// int minInt = -2147483648;
// int result = minInt / -1;
// if (result != minInt) {return 1; }
// if (results[0] != -55545) {return 2; }
// if (results[1] != 55565) {return 3; }
// if (results[2] != -555550) {return 4; }
// if (results[3] != -5555) {return 5; }
// if (results[4] != -5) {return 6; }
// if (results[5] != 8) {return 7; }
// if (results[6] != -1) {return 8; }
// if (results[7] != 55563) {return 9; }
// return 0;
// }
//
//
// /*
// * Shift some data. (value=0xff00aa01, dist=8)
// */
// static int intShiftTest(int value, int dist) {
// int results[] = new int[4];
// results[0] = value << dist;
// results[1] = value >> dist;
// results[2] = value >>> dist;
// results[3] = (((value << dist) >> dist) >>> dist) << dist;
// if (results[0] != 0x00aa0100) {return 1; }
// if (results[1] != 0xffff00aa) {return 2; }
// if (results[2] != 0x00ff00aa) {return 3; }
// if (results[3] != 0xaa00) {return 4; }
// return 0;
// }
//
// /*
// * We pass in the arguments and return the results so the compiler
// * doesn't do the math for us. (x=70000000000, y=-3)
// */
// static int longOperTest(long x, long y) {
// long[] results = new long[10];
//
// /* this seems to generate "op-long" instructions */
// results[0] = x + y;
// results[1] = x - y;
// results[2] = x * y;
// results[3] = x * x;
// results[4] = x / y;
// results[5] = x % -y;
// results[6] = x & y;
// results[7] = x | y;
// results[8] = x ^ y;
// /* this seems to generate "op-long/2addr" instructions */
// results[9] = x + ((((((((x + y) - y) * y) / y) % y) & y) | y) ^ y);
// /* check this edge case while we're here (div-long/2addr) */
// long minLong = -9223372036854775808L;
// long negOne = -results[5];
// long plusOne = 1;
// long result = (((minLong + plusOne) - plusOne) / negOne) / negOne;
// if (result != minLong) { return 1; }
// if (results[0] != 69999999997L) { return 2; }
// if (results[1] != 70000000003L) { return 3; }
// if (results[2] != -210000000000L) { return 4; }
// if (results[3] != -6833923606740729856L) { return 5; } // overflow
// if (results[4] != -23333333333L) { return 6; }
// if (results[5] != 1) { return 7; }
// if (results[6] != 70000000000L) { return 8; }
// if (results[7] != -3) { return 9; }
// if (results[8] != -70000000003L) { return 10; }
// if (results[9] != 70000000000L) { return 11; }
// if (results.length != 10) { return 12; }
// return 0;
// }
//
// /*
// * Shift some data. (value=0xd5aa96deff00aa01, dist=8)
// */
// static long longShiftTest(long value, int dist) {
// long results[] = new long[4];
// results[0] = value << dist;
// results[1] = value >> dist;
// results[2] = value >>> dist;
// results[3] = (((value << dist) >> dist) >>> dist) << dist;
// if (results[0] != 0x96deff00aa010000L) { return 1; }
// if (results[1] != 0xffffd5aa96deff00L) { return 2; }
// if (results[2] != 0x0000d5aa96deff00L) { return 3; }
// if (results[3] != 0xffff96deff000000L) { return 4; }
// if (results.length != 4) { return 5; }
//
// return results[0]; // test return-long
// }
//
// static int switchTest(int a) {
// int res = 1234;
//
// switch (a) {
// case -1: res = 1; return res;
// case 0: res = 2; return res;
// case 1: /*correct*/ break;
// case 2: res = 3; return res;
// case 3: res = 4; return res;
// case 4: res = 5; return res;
// default: res = 6; return res;
// }
// switch (a) {
// case 3: res = 7; return res;
// case 4: res = 8; return res;
// default: /*correct*/ break;
// }
//
// a = 0x12345678;
//
// switch (a) {
// case 0x12345678: /*correct*/ break;
// case 0x12345679: res = 9; return res;
// default: res = 1; return res;
// }
// switch (a) {
// case 57: res = 10; return res;
// case -6: res = 11; return res;
// case 0x12345678: /*correct*/ break;
// case 22: res = 12; return res;
// case 3: res = 13; return res;
// default: res = 14; return res;
// }
// switch (a) {
// case -6: res = 15; return res;
// case 3: res = 16; return res;
// default: /*correct*/ break;
// }
//
// a = -5;
// switch (a) {
// case 12: res = 17; return res;
// case -5: /*correct*/ break;
// case 0: res = 18; return res;
// default: res = 19; return res;
// }
//
// switch (a) {
// default: /*correct*/ break;
// }
// return res;
// }
// /*
// * Test the integer comparisons in various ways.
// */
// static int testIntCompare(int minus, int plus, int plus2, int zero) {
// int res = 1111;
//
// if (minus > plus)
// return 1;
// if (minus >= plus)
// return 2;
// if (plus < minus)
// return 3;
// if (plus <= minus)
// return 4;
// if (plus == minus)
// return 5;
// if (plus != plus2)
// return 6;
//
// /* try a branch-taken */
// if (plus != minus) {
// res = res;
// } else {
// return 7;
// }
//
// if (minus > 0)
// return 8;
// if (minus >= 0)
// return 9;
// if (plus < 0)
// return 10;
// if (plus <= 0)
// return 11;
// if (plus == 0)
// return 12;
// if (zero != 0)
// return 13;
//
// if (zero == 0) {
// res = res;
// } else {
// return 14;
// }
// return res;
// }
//
// /*
// * Test cmp-long.
// *
// * minus=-5, alsoMinus=0xFFFFFFFF00000009, plus=4, alsoPlus=8
// */
// static int testLongCompare(long minus, long alsoMinus, long plus,
// long alsoPlus) {
// int res = 2222;
//
// if (minus > plus)
// return 2;
// if (plus < minus)
// return 3;
// if (plus == minus)
// return 4;
//
// if (plus >= plus+1)
// return 5;
// if (minus >= minus+1)
// return 6;
//
// /* try a branch-taken */
// if (plus != minus) {
// res = res;
// } else {
// return 7;
// }
//
// /* compare when high words are equal but low words differ */
// if (plus > alsoPlus)
// return 8;
// if (alsoPlus < plus)
// return 9;
// if (alsoPlus == plus)
// return 10;
//
// /* high words are equal, low words have apparently different signs */
// if (minus < alsoMinus) // bug!
// return 11;
// if (alsoMinus > minus)
// return 12;
// if (alsoMinus == minus)
// return 13;
//
// return res;
// }
//
// /*
// * Test cmpl-float and cmpg-float.
// */
// static int testFloatCompare(float minus, float plus, float plus2,
// float nan) {
//
// int res = 3333;
//
// if (minus > plus)
// res = 1;
// if (plus < minus)
// res = 2;
// if (plus == minus)
// res = 3;
// if (plus != plus2)
// res = 4;
//
// if (plus <= nan)
// res = 5;
// if (plus >= nan)
// res = 6;
// if (minus <= nan)
// res = 7;
// if (minus >= nan)
// res = 8;
// if (nan >= plus)
// res = 9;
// if (nan <= plus)
// res = 10;
//
// if (nan == nan)
// res = 11;
//
// return res;
// }
//
// static int testDoubleCompare(double minus, double plus, double plus2,
// double nan) {
//
// int res = 4444;
//
// if (minus > plus)
// return 1;
// if (plus < minus)
// return 2;
// if (plus == minus)
// return 3;
// if (plus != plus2)
// return 4;
//
// if (plus <= nan)
// return 5;
// if (plus >= nan)
// return 6;
// if (minus <= nan)
// return 7;
// if (minus >= nan)
// return 8;
// if (nan >= plus)
// return 9;
// if (nan <= plus)
// return 10;
//
// if (nan == nan)
// return 11;
// return res;
// }
//
// static int fibonacci(int n) {
// if (n == 0) {
// return 0;
// } else if (n == 1) {
// return 1;
// } else {
// return fibonacci(n - 1) + fibonacci(n - 2);
// }
// }
//
// public static void main(String[] args) {
// int res = unopTest(38);
// if (res == 37) {
// System.out.printf("unopTest PASSED\n");
// } else {
// System.out.printf("unopTest FAILED: %d\n", res);
// }
// res = shiftTest1();
// if (res == 0) {
// System.out.printf("shiftTest1 PASSED\n");
// } else {
// System.out.printf("shiftTest1 FAILED: %d\n", res);
// }
// res = shiftTest2();
// if (res == 0) {
// System.out.printf("shiftTest2 PASSED\n");
// } else {
// System.out.printf("shiftTest2 FAILED: %d\n", res);
// }
// res = unsignedShiftTest();
// if (res == 0) {
// System.out.printf("unsignedShiftTest PASSED\n");
// } else {
// System.out.printf("unsignedShiftTest FAILED: %d\n", res);
// }
// res = convTest();
// if (res == 0) {
// System.out.printf("convTest PASSED\n");
// } else {
// System.out.printf("convTest FAILED: %d\n", res);
// }
// res = charSubTest();
// if (res == 0) {
// System.out.printf("charSubTest PASSED\n");
// } else {
// System.out.printf("charSubTest FAILED: %d\n", res);
// }
// res = intOperTest(70000, -3);
// if (res == 0) {
// System.out.printf("intOperTest PASSED\n");
// } else {
// System.out.printf("intOperTest FAILED: %d\n", res);
// }
// res = longOperTest(70000000000L, -3L);
// if (res == 0) {
// System.out.printf("longOperTest PASSED\n");
// } else {
// System.out.printf("longOperTest FAILED: %d\n", res);
// }
// long lres = longShiftTest(0xd5aa96deff00aa01L, 16);
// if (lres == 0x96deff00aa010000L) {
// System.out.printf("longShiftTest PASSED\n");
// } else {
// System.out.printf("longShiftTest FAILED: %d\n", res);
// }
//
// res = switchTest(1);
// if (res == 1234) {
// System.out.printf("switchTest PASSED\n");
// } else {
// System.out.printf("switchTest FAILED: %d\n", res);
// }
//
// res = testIntCompare(-5, 4, 4, 0);
// if (res == 1111) {
// System.out.printf("testIntCompare PASSED\n");
// } else {
// System.out.printf("testIntCompare FAILED: %d\n", res);
// }
//
// res = testLongCompare(-5L, -4294967287L, 4L, 8L);
// if (res == 2222) {
// System.out.printf("testLongCompare PASSED\n");
// } else {
// System.out.printf("testLongCompare FAILED: %d\n", res);
// }
//
// res = testFloatCompare(-5.0f, 4.0f, 4.0f, (1.0f/0.0f) / (1.0f/0.0f));
// if (res == 3333) {
// System.out.printf("testFloatCompare PASSED\n");
// } else {
// System.out.printf("testFloatCompare FAILED: %d\n", res);
// }
//
// res = testDoubleCompare(-5.0, 4.0, 4.0, (1.0/0.0) / (1.0/0.0));
// if (res == 4444) {
// System.out.printf("testDoubleCompare PASSED\n");
// } else {
// System.out.printf("testDoubleCompare FAILED: %d\n", res);
// }
//
// res = fibonacci(10);
// if (res == 55) {
// System.out.printf("fibonacci PASSED\n");
// } else {
// System.out.printf("fibonacci FAILED: %d\n", res);
// }
// }
//}
static const char kIntMathDex[] =
"ZGV4CjAzNQDkd6TZ8pqDxU8AeTvdZuEG1XSONR7DLLU8HgAAcAAAAHhWNBIAAAAAAAAAAJwdAABR"
"AAAAcAAAAA8AAAC0AQAADQAAAPABAAABAAAAjAIAABcAAACUAgAAAgAAAEwDAACwGgAAjAMAAPIV"
"AAD6FQAA/RUAAAAWAAADFgAAChYAABEWAAAVFgAAGhYAACEWAAAmFgAALRYAADsWAAA+FgAAQxYA"
"AEcWAABSFgAAVxYAAG4WAACDFgAAlxYAAKsWAAC/FgAAzBYAAM8WAADTFgAA1xYAANsWAADwFgAA"
"BRcAABIXAAArFwAAQBcAAEoXAABgFwAAchcAAH0XAACUFwAApxcAALQXAADNFwAA4hcAAPAXAAD7"
"FwAABRgAABMYAAAtGAAAQxgAAFIYAABtGAAAhBgAAIoYAACPGAAAlxgAAKMYAAC7GAAAzxgAANsY"
"AADzGAAABxkAABMZAAArGQAAPxkAAFIZAABxGQAAjBkAAJ4ZAAC8GQAA1hkAAOYZAAACGgAAGhoA"
"ACsaAABIGgAAYRoAAGsaAACBGgAAkxoAAKYaAADFGgAA4BoAAAEAAAACAAAAAwAAAAwAAAAPAAAA"
"EQAAABIAAAATAAAAFAAAABUAAAAXAAAAGQAAABoAAAAbAAAAHAAAAAMAAAACAAAAAAAAAAQAAAAC"
"AAAAlBUAAAUAAAACAAAAoBUAAAYAAAACAAAArBUAAAcAAAACAAAAtBUAAAgAAAACAAAAvBUAAAkA"
"AAACAAAAyBUAAAoAAAACAAAA0BUAAA0AAAADAAAA3BUAABAAAAAFAAAA5BUAAA4AAAAGAAAArBUA"
"ABcAAAAKAAAAAAAAABgAAAAKAAAA7BUAAAkABQAzAAAABAALAAAAAAAEAAAAHQAAAAQAAAAgAAAA"
"BAADACMAAAAEAAQAJgAAAAQABAApAAAABAADACoAAAAEAAMAKwAAAAQABgAsAAAABAAIAC8AAAAE"
"AAwAMgAAAAQAAAA1AAAABAAAADgAAAAEAAMAOwAAAAQAAQA+AAAABAACAEEAAAAEAAUARAAAAAQA"
"BwBHAAAABAADAEoAAAAEAAAATQAAAAUACQA0AAAABgAKAFAAAAAHAAsAAAAAAAcAAAABAAAA////"
"/wAAAAAWAAAAAAAAADkdAAAAAAAABAAAAAAAAAAHAAAAAAAAAAsAAAAAAAAAQx0AAAAAAAABAAEA"
"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"
"FwAAABQB////DxME/w8S840QjxGOQjIwBAASEA8AMjEEABIgKPwyQgQAEjAo+BIAKPYAAAQAAAAA"
"AAAAAAAAAAQAAAABAAEAAQABAAEAAAACAAAAAgAAAAIAAgAEAAAAAgACAAIAAgACAAAAAwADAAQA"
"AAADAAMAAwADAAIAAAADAAIAAgAAAAgADQABAAAADgAGPGluaXQ+AAFEAAFGAAFJAAVJRERERAAF"
"SUZGRkYAAklJAANJSUkABUlJSUlJAANJSkoABUlKSkpKAAxJbnRNYXRoLmphdmEAAUoAA0pKSQAC"
"TEkACUxJbnRNYXRoOwADTExMABVMamF2YS9pby9QcmludFN0cmVhbTsAE0xqYXZhL2xhbmcvSW50"
"ZWdlcjsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9sYW5n"
"L1N5c3RlbTsAC09iamVjdC5qYXZhAAFWAAJWTAACW0kAAltKABNbTGphdmEvbGFuZy9PYmplY3Q7"
"ABNbTGphdmEvbGFuZy9TdHJpbmc7AAtjaGFyU3ViVGVzdAAXY2hhclN1YlRlc3QgRkFJTEVEOiAl"
"ZAoAE2NoYXJTdWJUZXN0IFBBU1NFRAoACGNvbnZUZXN0ABRjb252VGVzdCBGQUlMRUQ6ICVkCgAQ"
"Y29udlRlc3QgUEFTU0VECgAJZmlib25hY2NpABVmaWJvbmFjY2kgRkFJTEVEOiAlZAoAEWZpYm9u"
"YWNjaSBQQVNTRUQKAAtpbnRPcGVyVGVzdAAXaW50T3BlclRlc3QgRkFJTEVEOiAlZAoAE2ludE9w"
"ZXJUZXN0IFBBU1NFRAoADGludFNoaWZ0VGVzdAAJbGl0MTZUZXN0AAhsaXQ4VGVzdAAMbG9uZ09w"
"ZXJUZXN0ABhsb25nT3BlclRlc3QgRkFJTEVEOiAlZAoAFGxvbmdPcGVyVGVzdCBQQVNTRUQKAA1s"
"b25nU2hpZnRUZXN0ABlsb25nU2hpZnRUZXN0IEZBSUxFRDogJWQKABVsb25nU2hpZnRUZXN0IFBB"
"U1NFRAoABG1haW4AA291dAAGcHJpbnRmAApzaGlmdFRlc3QxABZzaGlmdFRlc3QxIEZBSUxFRDog"
"JWQKABJzaGlmdFRlc3QxIFBBU1NFRAoACnNoaWZ0VGVzdDIAFnNoaWZ0VGVzdDIgRkFJTEVEOiAl"
"ZAoAEnNoaWZ0VGVzdDIgUEFTU0VECgAKc3dpdGNoVGVzdAAWc3dpdGNoVGVzdCBGQUlMRUQ6ICVk"
"CgASc3dpdGNoVGVzdCBQQVNTRUQKABF0ZXN0RG91YmxlQ29tcGFyZQAddGVzdERvdWJsZUNvbXBh"
"cmUgRkFJTEVEOiAlZAoAGXRlc3REb3VibGVDb21wYXJlIFBBU1NFRAoAEHRlc3RGbG9hdENvbXBh"
"cmUAHHRlc3RGbG9hdENvbXBhcmUgRkFJTEVEOiAlZAoAGHRlc3RGbG9hdENvbXBhcmUgUEFTU0VE"
"CgAOdGVzdEludENvbXBhcmUAGnRlc3RJbnRDb21wYXJlIEZBSUxFRDogJWQKABZ0ZXN0SW50Q29t"
"cGFyZSBQQVNTRUQKAA90ZXN0TG9uZ0NvbXBhcmUAG3Rlc3RMb25nQ29tcGFyZSBGQUlMRUQ6ICVk"
"CgAXdGVzdExvbmdDb21wYXJlIFBBU1NFRAoACHVub3BUZXN0ABR1bm9wVGVzdCBGQUlMRUQ6ICVk"
"CgAQdW5vcFRlc3QgUEFTU0VECgARdW5zaWduZWRTaGlmdFRlc3QAHXVuc2lnbmVkU2hpZnRUZXN0"
"IEZBSUxFRDogJWQKABl1bnNpZ25lZFNoaWZ0VGVzdCBQQVNTRUQKAAd2YWx1ZU9mAAMABw4AAQAH"
"DgBwAAcOAFQABw4tHgIOdwJ0HS0eiVoeeVoeeAD4AwEABx0tIRovAHgCAAAHWU1LS0tLWlpaWmvj"
"LT1bAgwsAnUdlpaWlpZptJbD0wDcAQIAAAdZLUtLS3h7GpaWpQCiAQEAB1lNS0tLS0taWlt/Ankd"
"lpaHh5aWwwC+AQEAB1lNS0tLS0taWl1/AnkdlpaHeJaWwwDtAQIAAAcOTVpaWlpaaVpaauItSy14"
"AgxZAnUd4eHh4eG08MP/AREPlgCTAgIAAAdZLUtLS3jXAnsd4eHhagCCBAEAB3dpS5lLLZlLLZlL"
"LZlLLZlLLZmHLZm0LZm0lppLS5paS5rwS5qHS5qlS5ppS5kCpH8dAREUAREUAREUAREUAREUAREU"
"AREUAREUAREVAREVAREVAREVAREVAREVAA0AB1l9AREPARQPagIOWQJzHXi1ATcXwwJoHQAqAAcO"
"LS0tLS0tLS4BIxGlAKICAQAHHS5CAigdAlMdLi0tL0E9T0ECbjstQz88PTw+QR4/AnY7PEE9UQJR"
"HQEQF46LARYWqwDaAwQAAAAABw4uSwIXHQJqHUstSy1LLkstSy1LLUs8SzxLPUsAuQMEAAAAAAcO"
"LkseSx5LHksfSx5LHkseSy1LLUsuSy4A2QIEAAAAAAcOLi0CJR0CXB0tLS0tLS0tLS0vMi03MS08"
"LTwtPC08LT0vAIsDBAAAAAAHLC5LAiIdAl8dSy1LLmktaS9RSwJ7OzJLPEs+SzxLPEsABwEABw4e"
"LQBAAAdoHh4gPxpLTAAAAAEAFoGABIwHAAAUAACAgASgBwEIuAcBCMwHAQjACAEI/AgBCOwLAQj8"
"DAEI+A4BCPAQAQjgFAEJqBYBCIwfAQjsIQEI/CIBCMAlAQjgJgEI7CcBCIApAQi8KgEI1CoAAAAN"
"AAAAAAAAAAEAAAAAAAAAAQAAAFEAAABwAAAAAgAAAA8AAAC0AQAAAwAAAA0AAADwAQAABAAAAAEA"
"AACMAgAABQAAABcAAACUAgAABgAAAAIAAABMAwAAASAAABUAAACMAwAAARAAAAoAAACUFQAAAiAA"
"AFEAAADyFQAAAyAAABUAAADpGgAAACAAAAIAAAA5HQAAABAAAAEAAACcHQAA";
} // namespace art