From 8732f000b7f880cc6d407b23a1f21522dae1b8fc Mon Sep 17 00:00:00 2001 From: Maarten Zuidhoorn Date: Mon, 16 Oct 2023 09:53:31 +0200 Subject: [PATCH] Add base64 encoding and decoding functions (#145) --- package.json | 1 + src/__fixtures__/bytes.ts | 15 ++++++++++++++ src/bytes.test.ts | 42 +++++++++++++++++++++++++++++++++++++++ src/bytes.ts | 26 ++++++++++++++++++++++++ yarn.lock | 9 +++++---- 5 files changed, 89 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 68561186f..698c4c49f 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "dependencies": { "@ethereumjs/tx": "^4.1.2", "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "semver": "^7.5.4", diff --git a/src/__fixtures__/bytes.ts b/src/__fixtures__/bytes.ts index a0f74e2b7..7c0cea9ec 100644 --- a/src/__fixtures__/bytes.ts +++ b/src/__fixtures__/bytes.ts @@ -5,48 +5,56 @@ export const BYTES_FIXTURES = [ hexadecimal: '0x00', number: 0, bigint: BigInt(0), + base64: 'AA==', }, { bytes: new Uint8Array([1]), hexadecimal: '0x01', number: 1, bigint: BigInt(1), + base64: 'AQ==', }, { bytes: new Uint8Array([1, 0]), hexadecimal: '0x0100', number: 256, bigint: BigInt('256'), + base64: 'AQA=', }, { bytes: new Uint8Array([1, 0, 0]), hexadecimal: '0x010000', number: 65536, bigint: BigInt('65536'), + base64: 'AQAA', }, { bytes: new Uint8Array([255, 255, 255, 255]), hexadecimal: '0xffffffff', number: 4294967295, bigint: BigInt('4294967295'), + base64: '/////w==', }, { bytes: new Uint8Array([34, 147, 16, 131]), hexadecimal: '0x22931083', number: 580063363, bigint: BigInt('580063363'), + base64: 'IpMQgw==', }, { bytes: new Uint8Array([194, 39, 113, 31]), hexadecimal: '0xc227711f', number: 3257364767, bigint: BigInt('3257364767'), + base64: 'widxHw==', }, { bytes: new Uint8Array([127, 255, 237, 162]), hexadecimal: '0x7fffeda2', number: 2147478946, bigint: BigInt('2147478946'), + base64: 'f//tog==', }, ]; @@ -58,6 +66,7 @@ export const LARGE_BYTES_FIXTURES = [ bytes: new Uint8Array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), hexadecimal: '0x01000000000000000000000000000000', bigint: BigInt('1329227995784915872903807060280344576'), + base64: 'AQAAAAAAAAAAAAAAAAAAAA==', }, { // 32 random bytes. @@ -68,6 +77,7 @@ export const LARGE_BYTES_FIXTURES = [ bigint: BigInt( '58189776958068240351106802069880238808463796103203472163062608479540482293385', ), + base64: 'gKY/If/9UTK5n0AFyWCtceedFP2rxDtTYTSiHumiPok=', }, { // 32 random bytes. @@ -78,6 +88,7 @@ export const LARGE_BYTES_FIXTURES = [ bigint: BigInt( '10961067858070306934860429506927922639950169497670557799881954197288235104844', ), + base64: 'GDu+mywtRgxeR9rGnAZfN5dd2dQ5ONFqRkhO5Gxo+kw=', }, { // 32 random bytes. @@ -88,6 +99,7 @@ export const LARGE_BYTES_FIXTURES = [ bigint: BigInt( '73335223468720234094976334179508947211519352143744597535776292047894706824811', ), + base64: 'oiJD+4WquMtb065HpdccqBsSAls53j42d8zkz2nmpms=', }, /* eslint-disable */ { @@ -99,6 +111,7 @@ export const LARGE_BYTES_FIXTURES = [ bigint: BigInt( '975335188603988398618405551344916027345126946013385036715539406356421033999596189929769523225381754994124196396116598034380775273554050388528281267517366640072879794040213141938323868740153869135039902366745135595499710057361695733463476453677702817198692676248390409911841405423757788283358695331637983447584941899013547652783149194993939930573337534368729381684551952519942141804186650433839015850815013580039522083867097219801083713881594020297379015974790952215241871688571122540580324054412773040826790843743701979902847290055957337319728573148950407955549870865243499468370598209250763690289803963897937768761105789171033231361860165540063726916334906325245462519195226183245882000722667077739866760870661632241373782904775772260316077824716682315903958965757284039976935285865459822715628744070272940308664211730529173935007963881767716028875582747755384798094232682836295540750752400537664634784046619934935042300798284501465886110057401264555519806763853535276093772004578387708338832721262684280682311201491243611210849663568513811733192540054378165535937434297141960867705781647893299911538622935308929710307160820863019275435765375899808451293736443365182721568147000322195369498779557077702272674528080776221382690753415670335535093298595620285760115168696093192181983888099761443380086455891687587217180066848747471277290124967045216716316308253230230184199975833024988822256680471222287694502136844364481450135665780505134851676138919630043213693193349740655573307610271446851238705940784975995241474652567558017784631194420743463115700990085473038098393359078495861944241255962617069227557849488676201280729521796546333922191326411678349849995268843952377995656408908730330037930929000874039324236642274032575002703246117084319198231216752747152616317812235548738836089447940826663332262409859611595995264754170306945751472647917246999654491652426057067539828020620493090297833018161083626793047185287985197385445513287751251370758426741681686013472657114823809487219351109909203106621480089098113911302736895237995232550418130239617683682584554547604762923984500775052563608320126758004753894795087105577474262988534731697952917399205955014009088083019004717790790572160788672117503013171018955821827940806289568957237974332801154485741318257409916244687578714207820757161110919219015726158701749969329599550879532152588592642188469344302760837241655771866035018566759030837833673736516209150186516587893450335704662343357440313500859117576004604492', ), + base64: '5OmVIpK03evJItKlrFGJHv4L6DbdxekbTY3sxL8GO07Dm5n0Ynte2UsT3WloqFf/ZHUukP5w85yQeudMf4XSpC0NhPsgmtKOyNlH7xwtsBL3ky/sDnwkoPooy1V07+JtrxQ1F/gNiA50xaCRYv2bC7W5KG9v5XunmjJePS0t8w9NhiAS6fIAnHRf3Zj2QDLH0mCs5erB+zyfP1yLO6ztmsYo7eKEYUd7ecB6CIaoPeCSxFszloJ0atNaiIgg8jUH52zioOC/XzHQQq5lc0X5z82+TMcVMl7FJ71nTbe6ZesgF9jSd9iPA45XPu3GfOLS8oXkL21rdSD8F9flKtEVUkkcV7ycByn5fYqjqI8PRxJXhF7JiZoFbhUofu5ntNnr2fQDr1fF/oaiWoYZSPaINIYNUpwpVzK1gOGiSF2a1y17WVVXTDk67bH/XWx5DXa1qynKxAFOhEJrCA/lrtdTT+5lZDT0vZAj4xUN1/ne8M8/dgmBaSnCUpBmk/53OzdzbsXHVMUFom/4JnY9ggZhpQuh8BXFTSQQedy1ZPHi3bk1AmKu3KfXgzHNNMP8fJoh5yZLbqcQQpw7PrnYful4fv1I8P28MVuWRKCrYtoZEw1h4eVNgESs9U1oTZak9P7YGCxai5ilXbUvtm5oMo46Zic2foVVW5Tj5Ww05bR9c9lA+BC3+hxjFVT0ECQsLyyQGC9I5mD/AktfHLZtf0dn2VcWREvxfcoUYJlq6qbSgH/mG4bEoW50TCp5tKzMyh6n95nS0Juoef8SNqUor86WduBXQoiV0zZBGG+iwHpl1UGEYSY8J0JFZ/OvTksfc6vSIEu0621HcmT+CwGKI/kIlK+VnahPoGtmjBiutxYOyWHjeMoX6SxcbDYrLr4oZozwZiApcSVdJccURiGAXR7b4fLpLWvz3DiTchcifdynOM7emp89qGZDl6aWR+OKiv7Uqw3HBp6KNw7v/B8lNEVhquS8jLowrhYM2cVsLOsppTDCXAfP7A/QzIPbvWBy5j93b8KM53dezhZDxkZciZ5pkHuXmFkP99G0EikYq2LvWSkHopWGmQw5JYWiJynOiDXEp3ebqWDq+GEb72+9Qm63PWxRCQHlEr6BvtdPZ6qr9+vMcWybWWzAsbgwZbCrq1IrXTBZuWx566lbKSaLq9pkFGELw7/AWqe3DbJBh/iwvpFM4URwB6Qm8EGBJtOgIgGQ5MCstZTTtNkLj9k22QF4YHLObGfGxVHuwPLacSXNoJTrXPEJnd2MvkaRXtveKr9j0CZuI97AsDEctYyrrgOb61auR1ezlErYOU9DA8Tri68DpBtRcOT1ix7x/7HHwNkRUjfNFqYYaywgzURGUvySTA==' }, { // 10 kb of random bytes. @@ -106,6 +119,7 @@ export const LARGE_BYTES_FIXTURES = [ bytes: new Uint8Array([199, 115, 25, 191, 206, 152, 117, 156, 33, 206, 199, 230, 88, 93, 118, 82, 2, 21, 88, 173, 38, 98, 158, 235, 100, 209, 11, 208, 177, 92, 28, 233, 222, 175, 69, 181, 218, 115, 9, 253, 178, 182, 33, 118, 156, 191, 184, 75, 104, 51, 14, 171, 107, 138, 92, 166, 243, 221, 60, 190, 216, 215, 230, 198, 60, 74, 178, 166, 100, 213, 201, 253, 5, 107, 254, 63, 114, 92, 113, 109, 103, 135, 46, 223, 106, 238, 163, 162, 82, 44, 104, 48, 158, 133, 42, 169, 246, 148, 245, 83, 216, 88, 26, 188, 63, 127, 171, 15, 88, 190, 106, 42, 223, 161, 205, 186, 14, 129, 176, 144, 221, 85, 73, 225, 146, 39, 88, 113, 129, 155, 10, 206, 33, 179, 42, 232, 247, 118, 59, 143, 101, 187, 235, 155, 236, 228, 248, 174, 114, 76, 238, 52, 48, 153, 201, 154, 72, 8, 151, 56, 130, 171, 152, 49, 10, 208, 5, 254, 137, 64, 169, 111, 171, 26, 67, 100, 48, 247, 102, 252, 189, 173, 0, 49, 116, 176, 185, 73, 98, 186, 40, 50, 207, 193, 41, 163, 226, 166, 210, 247, 95, 42, 15, 195, 9, 28, 190, 58, 85, 219, 103, 99, 87, 160, 73, 162, 178, 238, 12, 30, 111, 249, 145, 95, 240, 87, 252, 235, 55, 25, 23, 130, 101, 52, 83, 54, 88, 40, 52, 131, 34, 247, 45, 98, 240, 165, 240, 246, 51, 242, 107, 228, 210, 152, 220, 192, 125, 40, 21, 236, 167, 44, 46, 155, 3, 19, 5, 159, 193, 112, 167, 135, 119, 0, 85, 179, 71, 12, 247, 40, 78, 251, 46, 58, 64, 28, 70, 148, 27, 77, 164, 205, 79, 88, 71, 125, 225, 139, 31, 169, 124, 103, 65, 92, 190, 27, 18, 234, 78, 100, 55, 76, 239, 216, 18, 53, 22, 232, 216, 172, 61, 166, 86, 19, 100, 167, 188, 124, 126, 155, 182, 203, 80, 36, 138, 78, 107, 16, 141, 149, 92, 23, 97, 185, 202, 233, 126, 7, 129, 4, 21, 252, 31, 141, 20, 157, 89, 70, 121, 237, 165, 180, 39, 200, 94, 226, 178, 116, 222, 18, 130, 113, 220, 136, 187, 81, 203, 200, 167, 117, 115, 245, 83, 144, 57, 128, 177, 226, 111, 85, 2, 202, 238, 61, 82, 245, 70, 78, 125, 222, 77, 133, 40, 88, 68, 172, 122, 22, 45, 131, 80, 232, 137, 51, 219, 13, 198, 162, 120, 180, 163, 81, 132, 142, 112, 76, 190, 97, 155, 94, 124, 244, 198, 156, 177, 217, 185, 251, 155, 39, 4, 45, 105, 95, 255, 121, 177, 227, 86, 154, 49, 3, 11, 150, 50, 33, 162, 150, 210, 194, 184, 156, 206, 112, 136, 27, 226, 69, 21, 9, 149, 8, 246, 119, 224, 71, 192, 98, 225, 69, 98, 22, 159, 99, 47, 28, 224, 160, 188, 241, 153, 135, 103, 34, 123, 108, 214, 83, 158, 52, 31, 68, 211, 149, 24, 59, 45, 227, 236, 241, 220, 6, 25, 19, 134, 179, 214, 183, 55, 166, 134, 154, 167, 55, 108, 156, 175, 129, 140, 140, 39, 212, 69, 85, 167, 33, 73, 250, 33, 195, 165, 182, 141, 230, 79, 100, 139, 235, 11, 216, 113, 46, 132, 210, 29, 28, 210, 248, 185, 16, 61, 176, 229, 95, 89, 130, 10, 238, 32, 230, 85, 145, 38, 77, 146, 186, 118, 38, 144, 114, 13, 42, 184, 253, 173, 246, 45, 90, 251, 254, 244, 233, 134, 62, 102, 9, 39, 16, 160, 246, 91, 60, 81, 219, 211, 216, 80, 236, 74, 115, 237, 193, 133, 250, 2, 99, 1, 49, 146, 167, 116, 38, 220, 61, 245, 129, 153, 173, 118, 101, 125, 177, 255, 109, 35, 253, 3, 43, 172, 171, 130, 232, 24, 179, 46, 120, 71, 99, 90, 250, 182, 125, 215, 135, 116, 57, 248, 224, 60, 247, 72, 42, 232, 40, 127, 132, 18, 55, 138, 5, 6, 245, 251, 138, 60, 126, 179, 68, 66, 46, 58, 93, 151, 102, 188, 22, 98, 53, 242, 26, 202, 55, 37, 66, 83, 124, 123, 30, 182, 214, 113, 201, 184, 167, 223, 11, 49, 12, 118, 249, 195, 204, 19, 164, 30, 121, 232, 204, 201, 244, 232, 18, 117, 145, 155, 158, 209, 157, 102, 65, 69, 149, 17, 77, 26, 213, 187, 179, 58, 237, 64, 163, 181, 132, 20, 20, 119, 109, 73, 206, 219, 208, 243, 83, 255, 117, 52, 71, 2, 114, 213, 187, 148, 36, 170, 38, 198, 245, 32, 125, 95, 234, 82, 91, 187, 255, 166, 224, 106, 242, 137, 134, 238, 174, 14, 5, 82, 206, 160, 51, 27, 38, 207, 137, 10, 250, 252, 179, 156, 81, 5, 94, 130, 123, 186, 66, 140, 124, 180, 157, 85, 47, 221, 167, 252, 203, 225, 107, 114, 1, 54, 243, 26, 121, 63, 87, 6, 189, 72, 15, 248, 220, 239, 194, 123, 131, 126, 117, 76, 71, 145, 248, 198, 77, 147, 249, 111, 178, 60, 167, 92, 180, 197, 137, 61, 164, 200, 251, 72, 234, 211, 78, 40, 7, 242, 185, 24, 14, 113, 63, 114, 252, 226, 213, 159, 56, 242, 73, 67, 212, 232, 168, 74, 243, 65, 157, 44, 162, 21, 137, 225, 3, 148, 29, 86, 179, 8, 123, 138, 192, 30, 25, 76, 213, 241, 223, 81, 236, 146, 228, 226, 202, 219, 56, 118, 245, 94, 174, 73, 236, 214, 44, 55, 135, 77, 86, 200, 221, 117, 82, 251, 54, 87, 182, 126, 198, 185, 171, 130, 74, 75, 178, 74, 154, 122, 106, 25, 137, 61, 131, 117, 117, 67, 92, 29, 254, 153, 5, 7, 198, 186, 44, 117, 30, 90, 200, 239, 48, 163, 218, 116, 68, 44, 50, 135, 142, 250, 223, 112, 117, 178, 177, 99, 96, 201, 137, 153, 239, 242, 168, 159, 22, 208, 253, 134, 19, 60, 8, 255, 96, 1, 8, 32, 149, 239, 38, 30, 155, 188, 212, 146, 96, 107, 124, 35, 103, 200, 82, 87, 142, 238, 227, 16, 116, 127, 243, 126, 13, 119, 27, 62, 58, 9, 101, 120, 10, 254, 86, 200, 19, 140, 242, 196, 81, 182, 218, 70, 107, 90, 26, 119, 195, 243, 210, 163, 158, 24, 168, 108, 88, 154, 122, 24, 126, 153, 196, 200, 43, 176, 103, 100, 137, 223, 48, 168, 112, 28, 206, 7, 187, 100, 183, 77, 173, 231, 167, 233, 192, 140, 216, 30, 95, 83, 124, 179, 51, 164, 221, 19, 68, 154, 57, 14, 27, 37, 111, 131, 97, 91, 26, 29, 228, 104, 254, 4, 168, 217, 156, 153, 157, 200, 75, 3, 143, 196, 122, 57, 35, 15, 19, 168, 169, 30, 244, 122, 231, 60, 149, 247, 245, 71, 121, 239, 145, 92, 209, 254, 116, 181, 170, 214, 125, 209, 54, 67, 247, 159, 78, 50, 214, 96, 65, 36, 112, 140, 21, 223, 13, 25, 38, 104, 239, 127, 24, 53, 168, 1, 165, 201, 70, 153, 72, 247, 142, 81, 33, 204, 134, 242, 53, 104, 178, 202, 178, 3, 27, 52, 83, 75, 242, 169, 191, 120, 65, 73, 138, 169, 229, 203, 112, 230, 128, 204, 81, 62, 79, 103, 221, 49, 187, 0, 74, 201, 91, 176, 241, 21, 157, 231, 215, 30, 52, 224, 88, 54, 7, 174, 226, 172, 139, 111, 162, 59, 202, 180, 107, 172, 194, 167, 248, 148, 106, 10, 103, 93, 246, 133, 84, 51, 141, 39, 237, 55, 244, 44, 177, 220, 201, 191, 49, 89, 115, 172, 202, 92, 186, 39, 72, 173, 255, 165, 195, 231, 144, 50, 67, 161, 255, 164, 121, 181, 49, 26, 137, 191, 225, 21, 197, 29, 47, 184, 72, 247, 23, 70, 168, 134, 126, 125, 128, 202, 181, 156, 222, 140, 54, 83, 245, 85, 29, 60, 165, 164, 168, 108, 107, 0, 49, 227, 227, 187, 210, 156, 162, 96, 176, 128, 113, 73, 45, 142, 114, 197, 49, 123, 71, 211, 146, 240, 192, 249, 128, 121, 157, 94, 139, 95, 172, 167, 229, 251, 231, 16, 62, 147, 100, 159, 67, 72, 171, 74, 157, 139, 124, 110, 133, 65, 156, 110, 9, 55, 245, 94, 180, 83, 86, 150, 205, 6, 252, 5, 100, 155, 74, 191, 221, 56, 241, 206, 73, 149, 247, 218, 145, 46, 222, 29, 47, 252, 206, 199, 7, 36, 154, 205, 197, 142, 137, 169, 82, 138, 83, 156, 233, 24, 118, 54, 212, 233, 172, 119, 141, 93, 86, 217, 144, 54, 35, 254, 211, 38, 249, 230, 217, 174, 157, 53, 72, 83, 250, 61, 177, 102, 48, 159, 14, 61, 97, 36, 171, 83, 152, 73, 50, 120, 96, 38, 64, 89, 179, 254, 204, 37, 148, 219, 142, 94, 162, 65, 7, 193, 45, 203, 6, 207, 140, 128, 162, 3, 160, 83, 35, 152, 157, 144, 177, 73, 38, 131, 72, 202, 32, 28, 129, 190, 21, 71, 255, 57, 55, 92, 181, 37, 146, 16, 60, 189, 138, 56, 115, 3, 21, 76, 80, 53, 58, 57, 31, 133, 31, 233, 11, 67, 9, 141, 194, 55, 174, 19, 253, 255, 35, 59, 80, 255, 28, 119, 148, 50, 220, 120, 231, 252, 126, 114, 20, 11, 228, 92, 171, 61, 96, 152, 144, 226, 220, 115, 54, 44, 31, 225, 38, 30, 165, 235, 9, 28, 195, 86, 212, 119, 52, 78, 95, 90, 204, 79, 12, 131, 101, 242, 213, 101, 55, 108, 149, 16, 90, 253, 181, 23, 211, 49, 7, 243, 187, 49, 186, 115, 88, 86, 153, 8, 166, 138, 97, 205, 205, 132, 0, 160, 37, 38, 53, 42, 53, 195, 106, 148, 33, 78, 143, 123, 169, 193, 195, 221, 243, 166, 60, 227, 109, 240, 194, 78, 134, 189, 157, 20, 192, 174, 240, 195, 96, 134, 55, 70, 213, 254, 131, 190, 249, 41, 208, 120, 152, 30, 180, 93, 114, 47, 151, 81, 238, 178, 140, 216, 229, 239, 16, 161, 115, 148, 149, 255, 154, 0, 197, 184, 80, 216, 12, 16, 49, 197, 15, 212, 137, 253, 54, 156, 216, 204, 223, 146, 244, 225, 233, 230, 2, 192, 116, 28, 186, 54, 47, 164, 240, 64, 75, 51, 122, 217, 62, 218, 252, 139, 15, 4, 130, 149, 167, 234, 169, 240, 218, 173, 255, 96, 184, 98, 90, 99, 83, 132, 91, 158, 3, 191, 24, 200, 51, 209, 89, 101, 114, 215, 11, 11, 246, 213, 94, 191, 95, 74, 211, 30, 25, 21, 203, 24, 225, 72, 174, 103, 194, 2, 244, 48, 149, 162, 48, 74, 96, 129, 68, 114, 40, 215, 124, 80, 144, 120, 153, 123, 185, 191, 74, 133, 47, 77, 107, 214, 226, 4, 11, 227, 224, 56, 237, 34, 241, 179, 14, 135, 157, 214, 188, 188, 48, 234, 162, 47, 193, 50, 119, 71, 236, 134, 0, 12, 48, 91, 209, 222, 126, 236, 55, 184, 139, 249, 101, 214, 72, 14, 84, 202, 158, 0, 211, 179, 56, 13, 218, 159, 120, 44, 139, 78, 243, 219, 161, 54, 176, 3, 120, 253, 21, 196, 48, 247, 34, 216, 76, 238, 227, 200, 212, 132, 202, 199, 42, 94, 88, 163, 219, 52, 225, 127, 50, 68, 61, 242, 115, 99, 246, 244, 57, 188, 204, 28, 164, 218, 94, 43, 158, 206, 236, 69, 111, 43, 91, 154, 60, 123, 203, 187, 201, 170, 154, 27, 208, 126, 247, 67, 191, 104, 130, 34, 168, 81, 18, 228, 63, 188, 157, 217, 152, 197, 70, 223, 106, 136, 148, 44, 93, 65, 35, 6, 249, 193, 133, 114, 177, 64, 157, 206, 201, 21, 17, 253, 72, 228, 66, 110, 10, 207, 207, 37, 46, 192, 215, 139, 3, 199, 90, 9, 78, 48, 6, 91, 202, 42, 129, 29, 132, 32, 219, 164, 181, 227, 58, 225, 3, 57, 231, 20, 16, 86, 206, 88, 201, 138, 142, 198, 167, 226, 77, 211, 128, 222, 211, 191, 228, 66, 42, 124, 146, 220, 99, 246, 128, 250, 37, 217, 180, 152, 206, 217, 213, 32, 237, 83, 233, 80, 217, 139, 30, 183, 162, 253, 94, 95, 149, 13, 76, 5, 230, 9, 226, 236, 168, 147, 217, 41, 5, 145, 73, 188, 167, 195, 115, 93, 217, 27, 35, 27, 213, 36, 135, 239, 29, 15, 13, 239, 1, 192, 196, 8, 230, 171, 126, 61, 205, 254, 120, 190, 155, 43, 7, 45, 138, 18, 114, 255, 66, 10, 28, 231, 142, 104, 244, 246, 97, 32, 25, 168, 147, 168, 122, 241, 10, 70, 234, 53, 199, 0, 227, 200, 187, 153, 180, 74, 8, 31, 176, 77, 120, 222, 255, 235, 160, 221, 234, 84, 74, 56, 213, 70, 48, 19, 122, 207, 201, 208, 176, 72, 173, 83, 134, 78, 51, 176, 230, 53, 35, 131, 135, 213, 226, 130, 72, 233, 104, 46, 195, 6, 154, 122, 37, 3, 51, 84, 144, 121, 85, 150, 2, 209, 99, 47, 139, 239, 79, 65, 254, 35, 162, 182, 177, 219, 40, 124, 142, 133, 42, 118, 2, 207, 231, 216, 189, 254, 23, 123, 54, 103, 192, 2, 254, 84, 36, 49, 66, 216, 102, 129, 23, 164, 19, 55, 74, 56, 56, 197, 88, 103, 201, 163, 179, 173, 119, 17, 92, 146, 69, 213, 159, 62, 161, 147, 177, 149, 82, 235, 143, 123, 53, 106, 117, 76, 148, 250, 249, 72, 57, 88, 167, 210, 99, 84, 252, 246, 51, 247, 53, 182, 154, 41, 7, 243, 237, 17, 28, 192, 212, 23, 117, 163, 223, 45, 37, 52, 191, 218, 86, 241, 35, 70, 249, 191, 98, 195, 193, 120, 91, 15, 126, 67, 223, 112, 70, 34, 90, 227, 252, 173, 122, 85, 12, 115, 75, 135, 40, 23, 97, 215, 59, 46, 145, 23, 174, 73, 182, 0, 195, 214, 183, 131, 167, 55, 187, 190, 45, 101, 201, 53, 147, 15, 223, 185, 241, 56, 163, 147, 160, 173, 246, 199, 249, 32, 129, 141, 248, 10, 255, 156, 112, 182, 86, 254, 28, 176, 162, 60, 173, 171, 33, 1, 57, 134, 107, 125, 78, 37, 135, 7, 53, 211, 91, 209, 25, 31, 141, 97, 186, 35, 226, 74, 8, 50, 211, 229, 91, 136, 134, 157, 125, 164, 211, 101, 151, 247, 136, 195, 30, 109, 222, 97, 136, 96, 194, 226, 67, 150, 188, 111, 15, 210, 201, 61, 225, 193, 202, 133, 162, 212, 149, 53, 155, 225, 160, 92, 55, 73, 201, 67, 59, 255, 9, 153, 59, 239, 176, 49, 169, 172, 27, 186, 128, 213, 32, 20, 108, 159, 28, 205, 151, 168, 110, 4, 177, 131, 127, 21, 169, 169, 245, 87, 124, 233, 202, 222, 28, 234, 92, 19, 73, 89, 217, 22, 180, 223, 134, 245, 241, 243, 93, 214, 30, 132, 142, 179, 47, 22, 162, 114, 151, 74, 103, 89, 231, 195, 255, 67, 130, 30, 223, 194, 48, 169, 21, 29, 246, 19, 104, 97, 39, 232, 86, 21, 208, 132, 15, 129, 224, 94, 70, 49, 105, 152, 47, 130, 219, 154, 91, 23, 18, 237, 249, 109, 13, 11, 189, 12, 5, 5, 84, 212, 36, 103, 34, 99, 173, 112, 48, 111, 216, 75, 71, 110, 41, 185, 86, 23, 150, 226, 144, 63, 202, 49, 52, 28, 241, 57, 6, 6, 24, 161, 241, 154, 251, 209, 216, 146, 133, 50, 124, 38, 49, 224, 26, 3, 20, 135, 55, 75, 33, 166, 255, 85, 66, 86, 199, 252, 228, 179, 166, 234, 0, 115, 116, 239, 90, 83, 83, 156, 78, 217, 162, 146, 216, 216, 147, 43, 129, 252, 234, 22, 79, 77, 151, 210, 188, 191, 124, 44, 160, 57, 208, 42, 17, 50, 92, 110, 195, 82, 211, 192, 246, 34, 126, 90, 23, 206, 229, 103, 34, 154, 237, 185, 155, 102, 186, 20, 108, 67, 46, 206, 170, 190, 194, 214, 81, 55, 137, 46, 133, 198, 121, 17, 175, 181, 7, 104, 110, 167, 245, 63, 73, 85, 185, 126, 125, 215, 63, 34, 95, 20, 201, 123, 190, 192, 187, 28, 172, 55, 118, 47, 236, 112, 231, 56, 87, 204, 139, 147, 214, 210, 212, 195, 125, 218, 7, 218, 245, 3, 206, 46, 173, 108, 34, 248, 18, 150, 173, 94, 15, 81, 91, 173, 103, 86, 12, 163, 106, 196, 123, 248, 157, 180, 3, 67, 203, 174, 179, 84, 244, 28, 17, 133, 15, 237, 6, 114, 189, 1, 146, 139, 232, 163, 220, 234, 115, 59, 132, 251, 150, 147, 166, 81, 230, 1, 20, 57, 126, 116, 159, 228, 145, 212, 25, 236, 84, 165, 206, 119, 131, 103, 188, 92, 19, 88, 48, 14, 68, 219, 120, 85, 120, 188, 238, 36, 237, 196, 97, 126, 31, 64, 122, 79, 158, 247, 244, 196, 24, 60, 64, 186, 156, 21, 182, 184, 174, 100, 203, 118, 239, 177, 87, 125, 162, 107, 12, 125, 158, 167, 168, 173, 192, 33, 235, 159, 183, 178, 71, 164, 118, 181, 198, 198, 245, 165, 99, 221, 193, 207, 208, 124, 53, 230, 167, 165, 201, 196, 67, 185, 105, 245, 111, 162, 84, 252, 181, 227, 74, 184, 40, 136, 120, 88, 124, 44, 185, 207, 33, 148, 66, 193, 11, 54, 97, 67, 224, 42, 74, 93, 34, 117, 228, 158, 120, 60, 119, 253, 109, 250, 38, 236, 73, 243, 145, 136, 59, 222, 216, 163, 216, 24, 169, 152, 33, 59, 99, 42, 26, 4, 156, 175, 18, 57, 29, 41, 184, 249, 179, 148, 250, 181, 93, 181, 222, 218, 62, 64, 203, 220, 116, 97, 205, 119, 25, 151, 84, 40, 176, 69, 82, 12, 20, 200, 102, 83, 70, 187, 91, 185, 177, 235, 122, 115, 245, 23, 238, 107, 96, 201, 9, 7, 181, 232, 210, 4, 2, 218, 36, 222, 197, 186, 158, 5, 134, 129, 53, 218, 99, 109, 28, 193, 215, 176, 17, 236, 219, 192, 58, 13, 252, 139, 51, 101, 242, 206, 68, 240, 0, 113, 206, 90, 123, 202, 158, 245, 253, 248, 128, 191, 14, 243, 61, 142, 35, 3, 102, 113, 152, 180, 85, 154, 251, 163, 197, 244, 83, 234, 48, 59, 66, 16, 142, 178, 99, 92, 161, 98, 39, 131, 214, 93, 4, 122, 178, 96, 162, 97, 61, 186, 78, 239, 171, 186, 64, 10, 183, 177, 7, 155, 43, 185, 163, 124, 42, 110, 52, 244, 38, 18, 74, 92, 8, 218, 55, 193, 159, 254, 60, 121, 20, 196, 180, 253, 93, 31, 93, 150, 226, 17, 184, 144, 242, 131, 19, 255, 195, 182, 133, 123, 125, 160, 60, 238, 174, 141, 116, 189, 78, 31, 229, 142, 255, 21, 102, 138, 10, 214, 145, 91, 188, 27, 227, 65, 19, 175, 182, 216, 81, 232, 106, 138, 162, 174, 71, 195, 215, 191, 65, 29, 219, 154, 42, 197, 46, 228, 135, 126, 84, 94, 180, 121, 150, 132, 223, 67, 254, 88, 173, 235, 244, 55, 103, 3, 151, 7, 150, 213, 236, 99, 184, 220, 166, 249, 170, 201, 11, 94, 101, 209, 77, 47, 1, 31, 109, 71, 66, 67, 94, 71, 51, 106, 136, 178, 101, 71, 67, 13, 207, 8, 200, 139, 85, 159, 18, 164, 11, 89, 227, 146, 1, 40, 205, 213, 193, 229, 240, 35, 170, 33, 212, 219, 70, 243, 211, 79, 158, 94, 46, 175, 248, 168, 104, 4, 120, 108, 217, 197, 6, 169, 83, 3, 242, 39, 52, 153, 229, 202, 229, 38, 87, 162, 48, 93, 164, 222, 187, 99, 211, 71, 252, 165, 229, 186, 120, 119, 94, 253, 194, 207, 101, 92, 203, 113, 224, 71, 78, 130, 118, 72, 148, 63, 185, 219, 150, 53, 19, 225, 152, 142, 114, 239, 207, 231, 76, 50, 143, 75, 1, 69, 148, 3, 71, 57, 4, 182, 20, 150, 112, 7, 224, 193, 234, 53, 81, 211, 114, 156, 80, 5, 211, 249, 165, 53, 69, 242, 8, 136, 231, 181, 70, 19, 16, 127, 209, 212, 118, 189, 2, 248, 38, 187, 70, 254, 73, 247, 42, 145, 65, 57, 243, 215, 106, 154, 187, 98, 253, 169, 27, 206, 10, 145, 148, 183, 131, 80, 202, 31, 236, 61, 115, 69, 36, 68, 29, 148, 193, 13, 191, 253, 235, 26, 235, 227, 135, 146, 151, 0, 215, 108, 160, 70, 176, 194, 59, 94, 157, 46, 89, 141, 6, 204, 225, 223, 217, 122, 174, 97, 90, 23, 235, 238, 103, 123, 37, 2, 32, 255, 121, 224, 133, 212, 170, 48, 224, 33, 128, 244, 247, 245, 60, 214, 42, 33, 114, 77, 162, 156, 240, 211, 52, 21, 254, 231, 188, 115, 254, 44, 70, 15, 95, 13, 186, 253, 8, 78, 40, 41, 239, 20, 249, 217, 148, 166, 34, 104, 109, 20, 117, 124, 103, 107, 227, 25, 160, 104, 138, 32, 129, 228, 80, 254, 120, 111, 55, 51, 183, 76, 147, 123, 240, 196, 49, 250, 119, 139, 205, 224, 130, 102, 44, 130, 27, 24, 4, 206, 208, 28, 251, 230, 74, 7, 235, 15, 122, 164, 13, 236, 214, 43, 44, 224, 227, 110, 53, 178, 180, 107, 160, 7, 44, 82, 198, 108, 7, 159, 215, 78, 26, 7, 12, 9, 37, 115, 246, 255, 105, 74, 87, 41, 69, 175, 165, 54, 60, 37, 200, 116, 233, 154, 107, 23, 95, 48, 124, 223, 157, 104, 13, 185, 202, 2, 15, 180, 47, 37, 124, 43, 132, 95, 173, 69, 85, 202, 204, 19, 146, 49, 71, 74, 142, 233, 112, 191, 29, 243, 98, 127, 250, 20, 24, 65, 120, 93, 217, 175, 105, 178, 106, 185, 113, 163, 190, 190, 81, 50, 189, 228, 3, 80, 46, 140, 81, 90, 17, 107, 66, 224, 167, 115, 249, 50, 236, 220, 155, 214, 155, 129, 248, 41, 93, 185, 6, 120, 100, 40, 107, 226, 24, 163, 116, 13, 214, 169, 146, 36, 155, 129, 139, 160, 15, 83, 229, 186, 127, 108, 142, 143, 26, 43, 7, 132, 85, 19, 249, 121, 230, 108, 93, 176, 230, 180, 15, 54, 24, 2, 130, 112, 189, 172, 221, 110, 129, 243, 3, 4, 105, 116, 102, 32, 87, 150, 121, 77, 113, 58, 90, 89, 90, 157, 102, 156, 243, 161, 16, 214, 12, 55, 119, 200, 197, 98, 72, 95, 229, 194, 150, 211, 98, 135, 146, 78, 134, 223, 206, 57, 34, 157, 171, 246, 61, 243, 38, 184, 192, 153, 28, 53, 107, 168, 239, 150, 1, 179, 225, 19, 170, 84, 61, 46, 144, 161, 237, 62, 198, 14, 221, 214, 52, 199, 90, 125, 145, 112, 3, 0, 108, 250, 110, 175, 238, 55, 164, 235, 187, 48, 201, 30, 32, 86, 188, 13, 125, 155, 120, 226, 114, 28, 32, 208, 55, 71, 23, 181, 161, 1, 126, 11, 36, 156, 42, 156, 153, 136, 73, 107, 186, 153, 196, 41, 48, 178, 192, 107, 226, 170, 48, 202, 109, 50, 119, 112, 199, 86, 22, 138, 203, 226, 216, 237, 65, 164, 173, 143, 38, 227, 254, 208, 72, 54, 227, 65, 75, 32, 104, 112, 56, 77, 17, 203, 207, 190, 253, 253, 128, 98, 93, 137, 230, 96, 186, 183, 196, 23, 250, 128, 229, 83, 238, 102, 89, 56, 33, 175, 210, 73, 225, 219, 34, 38, 97, 34, 77, 79, 214, 3, 74, 137, 54, 37, 54, 220, 38, 203, 73, 194, 212, 36, 253, 137, 246, 168, 73, 246, 33, 155, 31, 156, 107, 109, 132, 147, 252, 255, 161, 143, 201, 170, 243, 196, 20, 68, 152, 173, 176, 136, 139, 254, 70, 20, 39, 103, 19, 139, 38, 74, 49, 201, 66, 100, 253, 177, 11, 238, 243, 239, 104, 147, 12, 209, 148, 90, 34, 86, 166, 110, 14, 40, 117, 153, 149, 28, 106, 76, 107, 12, 44, 214, 18, 22, 175, 195, 125, 247, 97, 39, 248, 54, 144, 135, 139, 134, 208, 161, 26, 104, 116, 220, 23, 217, 93, 7, 112, 236, 172, 229, 243, 165, 93, 11, 42, 42, 237, 234, 79, 63, 110, 38, 38, 14, 212, 193, 71, 210, 195, 198, 65, 46, 72, 20, 44, 113, 127, 55, 30, 15, 159, 168, 126, 24, 250, 35, 69, 144, 139, 4, 63, 95, 194, 52, 99, 68, 245, 169, 148, 198, 202, 167, 6, 95, 37, 11, 195, 244, 142, 177, 214, 232, 223, 88, 25, 144, 79, 230, 86, 55, 158, 235, 204, 95, 11, 54, 45, 20, 60, 115, 136, 184, 35, 132, 175, 201, 20, 234, 220, 15, 241, 178, 181, 114, 174, 0, 170, 249, 12, 11, 119, 121, 112, 106, 22, 194, 70, 238, 128, 134, 166, 102, 186, 215, 201, 20, 216, 248, 215, 189, 137, 205, 97, 233, 55, 174, 28, 195, 55, 199, 29, 198, 154, 169, 233, 81, 165, 19, 212, 91, 141, 61, 26, 16, 6, 232, 27, 29, 179, 24, 200, 240, 248, 158, 165, 108, 61, 170, 113, 149, 22, 209, 240, 186, 148, 102, 201, 212, 74, 232, 210, 253, 68, 27, 129, 33, 232, 95, 151, 144, 194, 241, 182, 226, 171, 63, 255, 56, 154, 147, 167, 168, 156, 193, 175, 136, 252, 140, 43, 10, 140, 247, 131, 22, 48, 217, 252, 63, 38, 14, 166, 158, 243, 151, 213, 180, 14, 22, 170, 28, 143, 18, 68, 60, 203, 223, 153, 211, 22, 147, 219, 218, 45, 111, 154, 158, 112, 253, 31, 167, 179, 145, 168, 57, 18, 110, 38, 230, 1, 168, 104, 212, 37, 221, 115, 91, 126, 196, 162, 143, 171, 247, 56, 200, 92, 154, 149, 99, 53, 44, 213, 15, 254, 114, 175, 63, 54, 91, 139, 41, 220, 226, 80, 67, 235, 53, 166, 187, 40, 220, 135, 149, 156, 167, 207, 206, 110, 117, 145, 84, 9, 41, 188, 43, 38, 63, 164, 158, 48, 3, 25, 128, 18, 109, 152, 7, 6, 230, 164, 124, 100, 119, 48, 144, 120, 215, 27, 53, 159, 199, 62, 252, 231, 227, 178, 213, 152, 83, 157, 12, 150, 54, 58, 79, 192, 114, 251, 226, 136, 201, 102, 116, 117, 68, 120, 52, 232, 156, 119, 155, 180, 153, 30, 208, 183, 10, 199, 52, 143, 163, 217, 158, 21, 131, 173, 11, 66, 190, 22, 38, 140, 126, 250, 76, 30, 202, 162, 103, 59, 193, 168, 251, 208, 89, 12, 34, 233, 131, 69, 114, 198, 250, 217, 193, 27, 3, 192, 154, 60, 198, 2, 196, 186, 30, 5, 197, 143, 214, 60, 120, 196, 160, 182, 129, 207, 240, 217, 16, 147, 179, 120, 147, 100, 75, 160, 98, 171, 223, 37, 27, 40, 181, 157, 133, 51, 203, 42, 26, 75, 113, 92, 193, 0, 55, 10, 242, 163, 250, 195, 41, 76, 246, 77, 122, 50, 207, 123, 169, 110, 52, 172, 90, 91, 135, 166, 67, 40, 63, 100, 94, 162, 66, 66, 150, 245, 30, 159, 40, 92, 15, 144, 155, 31, 43, 221, 80, 14, 242, 158, 229, 94, 43, 158, 218, 118, 227, 62, 253, 218, 240, 106, 176, 87, 244, 6, 149, 20, 83, 28, 188, 0, 18, 197, 70, 246, 67, 24, 139, 212, 187, 14, 247, 210, 177, 140, 207, 63, 110, 208, 88, 75, 129, 246, 151, 197, 154, 80, 78, 50, 9, 193, 37, 164, 235, 221, 73, 2, 27, 49, 248, 160, 23, 49, 188, 244, 248, 152, 181, 219, 255, 29, 100, 90, 150, 72, 79, 93, 202, 250, 115, 162, 6, 156, 75, 202, 9, 46, 47, 86, 142, 150, 231, 25, 229, 217, 67, 233, 31, 172, 72, 7, 158, 111, 86, 160, 101, 61, 220, 63, 22, 6, 236, 58, 164, 248, 34, 245, 3, 104, 252, 175, 197, 84, 212, 23, 65, 205, 32, 157, 157, 177, 63, 3, 218, 81, 146, 255, 65, 169, 114, 99, 84, 166, 44, 193, 65, 137, 248, 73, 73, 68, 188, 166, 153, 137, 132, 158, 221, 248, 156, 27, 118, 33, 30, 6, 147, 125, 134, 172, 108, 98, 71, 206, 116, 30, 81, 34, 98, 136, 145, 240, 105, 179, 103, 21, 136, 145, 218, 138, 55, 68, 1, 95, 87, 149, 82, 26, 31, 67, 215, 205, 190, 61, 198, 43, 42, 41, 97, 111, 23, 109, 142, 192, 28, 188, 88, 154, 62, 123, 250, 238, 209, 40, 64, 155, 55, 65, 43, 135, 33, 215, 233, 197, 144, 169, 246, 213, 87, 133, 80, 217, 46, 53, 135, 147, 60, 196, 14, 65, 108, 120, 161, 110, 14, 68, 206, 0, 163, 25, 86, 83, 114, 31, 142, 82, 2, 21, 237, 82, 199, 191, 221, 57, 108, 220, 144, 81, 182, 94, 73, 127, 32, 235, 43, 125, 122, 106, 242, 29, 67, 89, 141, 63, 20, 23, 90, 155, 224, 219, 16, 217, 65, 173, 229, 127, 254, 100, 15, 239, 126, 252, 112, 153, 142, 172, 81, 217, 40, 29, 166, 99, 71, 146, 219, 224, 3, 220, 4, 120, 214, 116, 107, 108, 154, 137, 2, 23, 36, 169, 136, 234, 191, 49, 221, 161, 155, 158, 61, 232, 100, 31, 151, 218, 30, 24, 221, 228, 51, 182, 34, 211, 155, 153, 87, 41, 65, 96, 246, 177, 72, 110, 64, 66, 162, 198, 90, 226, 223, 96, 98, 255, 23, 107, 53, 54, 120, 237, 237, 85, 24, 229, 92, 4, 107, 245, 76, 163, 252, 204, 11, 149, 99, 208, 124, 239, 139, 44, 224, 87, 200, 24, 13, 237, 72, 13, 65, 80, 210, 75, 155, 182, 92, 163, 80, 198, 192, 164, 28, 87, 147, 178, 108, 76, 61, 37, 101, 62, 137, 119, 46, 112, 196, 38, 137, 247, 142, 156, 12, 87, 83, 190, 109, 88, 203, 99, 72, 99, 131, 170, 80, 235, 35, 26, 254, 143, 75, 130, 18, 183, 3, 3, 180, 118, 148, 48, 69, 131, 141, 110, 180, 97, 240, 220, 55, 154, 32, 175, 63, 197, 241, 20, 65, 241, 32, 191, 192, 114, 215, 107, 96, 4, 175, 232, 119, 37, 12, 169, 49, 102, 132, 228, 182, 13, 168, 244, 228, 251, 10, 21, 254, 115, 251, 96, 75, 75, 220, 24, 102, 190, 171, 12, 252, 55, 170, 234, 140, 37, 147, 82, 152, 134, 230, 124, 19, 224, 246, 110, 140, 1, 222, 66, 237, 175, 72, 135, 48, 180, 148, 81, 247, 42, 127, 196, 70, 225, 92, 69, 71, 151, 238, 161, 98, 23, 87, 251, 147, 135, 163, 93, 147, 109, 199, 203, 189, 217, 50, 4, 96, 196, 110, 149, 169, 30, 38, 101, 192, 188, 254, 191, 95, 144, 166, 209, 149, 161, 139, 81, 153, 226, 116, 124, 122, 161, 228, 56, 195, 186, 188, 50, 67, 191, 82, 151, 115, 212, 125, 100, 83, 67, 30, 3, 31, 125, 97, 126, 189, 37, 221, 19, 142, 124, 10, 2, 23, 120, 3, 219, 46, 71, 102, 153, 184, 186, 207, 165, 170, 67, 195, 104, 164, 36, 143, 203, 185, 211, 12, 130, 255, 214, 250, 128, 215, 213, 78, 95, 41, 161, 167, 196, 55, 192, 75, 212, 126, 103, 116, 169, 33, 160, 185, 131, 235, 180, 248, 206, 69, 186, 47, 181, 58, 44, 87, 250, 65, 45, 250, 120, 171, 139, 184, 186, 3, 44, 103, 27, 68, 180, 26, 3, 115, 135, 134, 177, 200, 176, 168, 212, 89, 186, 203, 15, 35, 90, 44, 220, 139, 185, 198, 17, 81, 165, 207, 235, 240, 170, 13, 31, 202, 30, 235, 183, 187, 60, 159, 251, 106, 91, 23, 60, 239, 103, 247, 172, 59, 30, 122, 63, 46, 21, 126, 170, 93, 206, 209, 136, 15, 18, 98, 70, 58, 206, 97, 31, 71, 194, 244, 93, 41, 28, 140, 9, 158, 192, 40, 141, 19, 255, 42, 158, 72, 34, 243, 250, 205, 38, 243, 166, 212, 32, 191, 166, 178, 5, 162, 234, 28, 59, 205, 83, 13, 89, 198, 237, 238, 52, 147, 99, 193, 5, 240, 193, 205, 16, 48, 218, 155, 57, 42, 61, 212, 153, 202, 18, 117, 16, 48, 35, 63, 195, 32, 177, 145, 215, 118, 78, 96, 30, 131, 170, 232, 28, 187, 202, 137, 181, 203, 227, 14, 240, 119, 75, 156, 119, 128, 95, 30, 158, 150, 192, 12, 29, 26, 71, 48, 181, 128, 241, 78, 172, 235, 180, 165, 98, 173, 46, 92, 98, 226, 222, 161, 38, 199, 235, 153, 57, 117, 188, 251, 1, 245, 184, 214, 10, 171, 34, 25, 98, 236, 233, 112, 195, 77, 50, 173, 219, 84, 200, 136, 43, 27, 107, 181, 150, 50, 163, 29, 26, 148, 56, 89, 255, 231, 167, 59, 2, 254, 8, 160, 149, 204, 152, 186, 206, 39, 149, 167, 145, 227, 39, 253, 93, 79, 42, 118, 73, 70, 237, 40, 140, 52, 234, 241, 129, 231, 172, 159, 193, 92, 78, 78, 66, 55, 44, 175, 166, 160, 120, 141, 171, 135, 198, 54, 77, 39, 151, 154, 220, 221, 196, 206, 203, 177, 82, 101, 85, 58, 45, 245, 76, 94, 37, 98, 176, 239, 218, 170, 191, 253, 67, 20, 123, 197, 64, 25, 245, 150, 135, 234, 141, 8, 214, 180, 185, 88, 216, 203, 233, 65, 192, 199, 18, 87, 183, 92, 208, 255, 118, 158, 24, 220, 86, 52, 245, 197, 49, 183, 181, 241, 156, 234, 172, 194, 247, 21, 224, 188, 82, 58, 89, 204, 220, 89, 79, 18, 79, 8, 128, 237, 72, 123, 176, 45, 80, 254, 95, 49, 58, 60, 241, 202, 246, 165, 165, 7, 204, 53, 43, 252, 134, 69, 104, 25, 75, 118, 172, 148, 138, 252, 72, 4, 135, 143, 246, 205, 18, 31, 146, 28, 207, 230, 77, 2, 57, 226, 28, 60, 77, 233, 234, 190, 247, 222, 213, 87, 138, 220, 146, 157, 42, 162, 190, 143, 127, 226, 196, 225, 82, 54, 204, 123, 181, 30, 160, 62, 70, 64, 163, 254, 191, 43, 78, 230, 103, 35, 11, 66, 244, 45, 161, 170, 176, 241, 251, 231, 236, 197, 11, 220, 45, 38, 227, 131, 99, 84, 179, 69, 198, 243, 114, 83, 134, 47, 209, 223, 28, 73, 137, 228, 152, 1, 181, 128, 90, 59, 44, 233, 227, 190, 47, 253, 207, 144, 31, 234, 166, 5, 73, 113, 233, 45, 220, 50, 105, 183, 140, 19, 157, 153, 130, 229, 33, 92, 228, 5, 51, 154, 73, 10, 141, 169, 32, 157, 142, 52, 198, 185, 102, 11, 218, 17, 230, 145, 117, 31, 75, 17, 25, 222, 125, 57, 113, 228, 30, 152, 101, 239, 236, 201, 186, 182, 91, 255, 180, 231, 32, 184, 42, 129, 54, 136, 78, 110, 220, 157, 18, 243, 80, 174, 6, 177, 116, 165, 249, 101, 12, 161, 217, 200, 204, 164, 45, 75, 10, 235, 83, 169, 41, 87, 15, 7, 151, 194, 141, 83, 94, 6, 46, 24, 232, 101, 197, 33, 39, 169, 139, 116, 208, 28, 54, 238, 188, 127, 242, 54, 127, 59, 139, 87, 187, 123, 47, 42, 248, 46, 193, 88, 45, 135, 241, 55, 230, 208, 182, 69, 64, 22, 205, 215, 142, 139, 177, 18, 147, 33, 54, 173, 253, 47, 194, 209, 211, 0, 152, 45, 182, 4, 247, 100, 243, 67, 253, 13, 144, 47, 155, 174, 190, 208, 210, 248, 93, 182, 230, 237, 75, 214, 98, 6, 64, 178, 215, 238, 233, 246, 89, 189, 229, 46, 238, 198, 56, 195, 104, 216, 57, 56, 146, 93, 181, 46, 168, 208, 31, 22, 71, 0, 40, 118, 165, 181, 198, 220, 13, 218, 194, 228, 129, 84, 14, 68, 37, 145, 97, 245, 112, 120, 225, 110, 5, 97, 13, 208, 154, 46, 178, 85, 53, 143, 163, 59, 252, 109, 119, 154, 124, 16, 12, 72, 6, 45, 145, 93, 174, 247, 187, 89, 128, 240, 78, 100, 115, 95, 102, 235, 59, 210, 43, 202, 103, 45, 106, 142, 141, 128, 97, 214, 11, 167, 103, 167, 14, 36, 246, 6, 143, 80, 3, 67, 146, 3, 242, 160, 150, 69, 92, 140, 207, 170, 218, 165, 178, 151, 129, 134, 225, 140, 110, 115, 163, 35, 104, 233, 74, 175, 218, 203, 26, 95, 145, 8, 87, 242, 34, 248, 169, 15, 227, 135, 211, 177, 144, 118, 179, 32, 137, 15, 102, 213, 228, 155, 49, 183, 8, 102, 43, 127, 13, 71, 197, 236, 240, 59, 38, 9, 203, 94, 148, 228, 194, 236, 8, 44, 19, 83, 16, 92, 144, 151, 113, 204, 248, 90, 135, 38, 49, 97, 60, 164, 16, 83, 182, 250, 78, 150, 198, 220, 159, 95, 54, 102, 255, 231, 108, 24, 211, 185, 106, 187, 253, 234, 199, 38, 32, 39, 185, 162, 11, 128, 141, 1, 224, 180, 112, 47, 73, 119, 159, 102, 9, 13, 162, 111, 55, 48, 135, 146, 135, 47, 92, 131, 138, 177, 67, 61, 142, 190, 140, 147, 183, 69, 158, 82, 10, 227, 130, 189, 3, 34, 170, 57, 43, 240, 235, 11, 71, 179, 232, 96, 115, 207, 30, 97, 42, 110, 214, 134, 31, 71, 242, 45, 28, 173, 205, 66, 73, 213, 247, 165, 252, 226, 166, 178, 192, 228, 233, 4, 123, 162, 190, 119, 97, 53, 59, 168, 82, 75, 47, 53, 251, 15, 134, 105, 140, 143, 155, 174, 132, 123, 179, 50, 17, 239, 171, 42, 12, 200, 88, 57, 126, 213, 199, 13, 153, 127, 215, 87, 112, 92, 121, 167, 35, 242, 136, 170, 102, 222, 225, 54, 202, 207, 17, 86, 8, 235, 181, 79, 223, 139, 231, 167, 191, 225, 240, 79, 51, 0, 177, 229, 203, 218, 187, 190, 128, 140, 38, 204, 85, 8, 3, 208, 179, 35, 223, 172, 243, 186, 56, 125, 38, 105, 61, 27, 169, 181, 75, 136, 88, 130, 51, 34, 155, 23, 150, 160, 225, 193, 169, 200, 63, 246, 173, 95, 22, 123, 32, 183, 60, 134, 71, 141, 47, 96, 217, 162, 35, 155, 20, 176, 88, 239, 250, 33, 253, 56, 171, 184, 65, 83, 244, 47, 171, 197, 240, 237, 93, 136, 90, 1, 202, 150, 46, 66, 69, 110, 177, 236, 95, 122, 101, 168, 71, 45, 56, 215, 36, 141, 248, 165, 246, 117, 40, 49, 232, 37, 42, 24, 123, 210, 34, 149, 122, 184, 189, 169, 139, 27, 134, 246, 91, 136, 243, 209, 167, 191, 140, 114, 166, 207, 211, 254, 138, 116, 176, 242, 18, 83, 111, 129, 107, 183, 76, 136, 82, 23, 38, 58, 87, 216, 45, 156, 192, 253, 1, 112, 166, 26, 190, 145, 212, 190, 9, 201, 120, 194, 174, 195, 186, 137, 170, 66, 198, 250, 145, 43, 208, 157, 197, 236, 101, 113, 75, 188, 27, 178, 133, 183, 238, 113, 223, 211, 48, 54, 23, 110, 249, 82, 195, 146, 124, 28, 142, 182, 48, 177, 176, 16, 71, 155, 3, 191, 92, 174, 42, 165, 194, 63, 226, 186, 19, 28, 224, 200, 126, 246, 25, 18, 124, 76, 210, 146, 162, 122, 184, 85, 165, 63, 109, 245, 239, 4, 153, 87, 221, 197, 40, 68, 168, 142, 156, 44, 169, 115, 85, 174, 151, 166, 107, 201, 168, 223, 211, 144, 179, 16, 230, 30, 26, 170, 127, 129, 55, 9, 193, 65, 239, 216, 180, 117, 210, 167, 50, 84, 151, 44, 174, 129, 160, 188, 209, 237, 89, 19, 142, 204, 153, 125, 169, 246, 234, 100, 25, 219, 131, 32, 66, 72, 255, 220, 97, 241, 76, 227, 125, 125, 67, 237, 105, 14, 114, 175, 92, 134, 29, 123, 236, 6, 250, 75, 72, 71, 140, 182, 54, 139, 194, 211, 208, 252, 250, 120, 159, 153, 163, 3, 124, 226, 240, 94, 170, 83, 204, 193, 62, 205, 86, 86, 76, 224, 227, 233, 45, 111, 124, 235, 84, 35, 29, 110, 173, 156, 50, 29, 68, 239, 25, 57, 87, 7, 220, 201, 142, 183, 175, 247, 96, 65, 202, 207, 92, 9, 85, 117, 102, 116, 120, 57, 170, 162, 180, 228, 151, 111, 181, 177, 184, 137, 74, 59, 180, 21, 143, 134, 152, 13, 134, 96, 68, 134, 27, 161, 228, 129, 138, 191, 121, 135, 158, 54, 166, 72, 232, 253, 233, 190, 197, 124, 51, 91, 154, 181, 247, 252, 159, 200, 186, 128, 63, 166, 183, 164, 69, 82, 166, 72, 177, 57, 250, 241, 84, 8, 151, 38, 197, 181, 136, 251, 204, 93, 23, 55, 130, 185, 125, 92, 182, 132, 205, 140, 186, 49, 69, 85, 56, 248, 154, 81, 217, 191, 121, 202, 99, 118, 248, 56, 63, 11, 211, 182, 58, 64, 36, 90, 163, 96, 128, 70, 98, 241, 185, 111, 94, 157, 198, 191, 198, 215, 193, 86, 57, 111, 53, 236, 214, 17, 232, 70, 190, 43, 34, 161, 232, 158, 179, 140, 56, 36, 121, 228, 107, 134, 128, 154, 152, 148, 182, 204, 22, 254, 45, 242, 61, 109, 205, 149, 100, 174, 80, 206, 239, 88, 221, 182, 180, 253, 125, 60, 243, 220, 214, 158, 119, 47, 39, 52, 152, 6, 150, 237, 83, 67, 198, 63, 169, 51, 100, 2, 94, 222, 235, 166, 109, 118, 52, 135, 197, 45, 218, 210, 78, 31, 5, 114, 159, 99, 99, 155, 86, 162, 16, 150, 171, 65, 93, 48, 120, 0, 195, 38, 148, 143, 157, 161, 223, 218, 147, 86, 174, 68, 9, 198, 38, 142, 99, 253, 152, 58, 86, 141, 220, 246, 171, 242, 15, 126, 12, 2, 217, 249, 163, 225, 2, 98, 53, 23, 25, 227, 243, 138, 243, 38, 92, 199, 255, 65, 232, 167, 77, 181, 95, 73, 229, 190, 98, 193, 35, 208, 39, 139, 154, 46, 167, 139, 51, 74, 20, 25, 241, 186, 112, 93, 31, 217, 163, 137, 101, 7, 45, 2, 42, 104, 187, 158, 101, 172, 167, 158, 197, 252, 248, 202, 65, 255, 244, 80, 172, 200, 155, 247, 138, 191, 6, 106, 96, 206, 230, 62, 165, 168, 182, 92, 177, 183, 7, 29, 150, 98, 236, 126, 152, 87, 57, 147, 111, 78, 108, 251, 94, 173, 22, 99, 58, 239, 236, 134, 154, 188, 111, 28, 55, 83, 117, 120, 54, 239, 71, 168, 100, 27, 74, 162, 216, 139, 188, 190, 142, 129, 189, 254, 108, 76, 5, 139, 144, 179, 78, 60, 175, 81, 76, 202, 198, 54, 80, 201, 206, 74, 4, 228, 159, 214, 226, 91, 60, 96, 179, 117, 207, 23, 111, 206, 230, 96, 92, 215, 234, 26, 143, 53, 11, 155, 76, 215, 20, 68, 25, 65, 135, 137, 158, 177, 196, 69, 184, 212, 80, 141, 125, 218, 179, 192, 47, 167, 222, 108, 166, 201, 229, 142, 175, 219, 64, 226, 157, 246, 246, 12, 40, 98, 237, 81, 108, 62, 148, 56, 148, 248, 152, 203, 26, 168, 19, 177, 97, 218, 50, 113, 116, 241, 122, 236, 41, 1, 250, 135, 95, 194, 197, 94, 76, 234, 217, 15, 243, 231, 24, 141, 1, 119, 83, 195, 227, 45, 191, 217, 179, 244, 15, 229, 128, 198, 78, 136, 119, 112, 230, 125, 103, 2, 72, 230, 180, 69, 199, 247, 128, 126, 176, 226, 60, 208, 11, 44, 31, 38, 224, 130, 84, 6, 103, 50, 63, 205, 42, 239, 192, 121, 38, 184, 149, 192, 18, 244, 128, 132, 192, 178, 213, 165, 146, 57, 64, 55, 48, 121, 220, 8, 99, 255, 218, 181, 45, 204, 122, 75, 223, 172, 166, 41, 21, 171, 198, 28, 183, 144, 161, 20, 41, 231, 21, 161, 207, 109, 36, 251, 115, 91, 167, 79, 3, 162, 160, 255, 82, 237, 22, 73, 202, 175, 139, 241, 47, 172, 151, 129, 197, 46, 127, 116, 149, 235, 58, 29, 181, 251, 202, 47, 248, 93, 141, 140, 66, 205, 44, 61, 111, 6, 48, 120, 134, 99, 234, 241, 156, 246, 105, 16, 164, 177, 58, 127, 79, 15, 14, 232, 43, 11, 85, 81, 104, 245, 72, 103, 2, 129, 146, 129, 117, 208, 199, 65, 110, 254, 167, 154, 213, 118, 171, 210, 36, 235, 3, 4, 43, 52, 169, 3, 38, 0, 51, 83, 252, 82, 43, 241, 73, 226, 225, 182, 159, 108, 164, 205, 221, 154, 51, 180, 194, 104, 82, 129, 180, 90, 224, 247, 48, 191, 53, 6, 164, 35, 140, 85, 120, 41, 76, 171, 92, 129, 251, 73, 8, 62, 60, 122, 126, 165, 59, 229, 154, 49, 76, 29, 149, 214, 25, 37, 126, 63, 174, 220, 5, 140, 173, 193, 38, 173, 210, 229, 71, 75, 241, 209, 167, 225, 217, 78, 35, 10, 91, 232, 150, 145, 21, 30, 108, 89, 223, 79, 182, 4, 177, 62, 144, 37, 239, 242, 104, 71, 11, 176, 46, 127, 99, 224, 112, 25, 252, 84, 126, 192, 27, 92, 182, 78, 45, 209, 55, 227, 63, 179, 160, 171, 192, 254, 118, 71, 221, 2, 51, 68, 206, 128, 84, 198, 134, 220, 249, 140, 157, 164, 243, 173, 148, 188, 65, 31, 135, 210, 31, 222, 198, 141, 80, 112, 129, 110, 93, 187, 249, 176, 133, 81, 0, 115, 61, 215, 148, 254, 113, 130, 136, 49, 250, 9, 4, 50, 186, 120, 4, 156, 132, 202, 242, 64, 16, 203, 85, 206, 14, 63, 122, 197, 236, 235, 191, 9, 250, 154, 233, 138, 210, 49, 75, 245, 78, 109, 220, 147, 113, 206, 22, 49, 42, 168, 70, 167, 248, 34, 48, 95, 250, 95, 130, 192, 170, 137, 33, 77, 152, 84, 102, 122, 187, 89, 101, 180, 94, 87, 125, 156, 229, 180, 173, 77, 191, 150, 110, 191, 129, 242, 103, 4, 0, 30, 159, 251, 200, 144, 136, 164, 228, 190, 172, 38, 212, 119, 100, 46, 58, 93, 131, 153, 71, 180, 159, 251, 104, 234, 45, 215, 178, 142, 16, 125, 206, 1, 213, 127, 252, 196, 176, 108, 250, 84, 239, 109, 85, 208, 48, 208, 221, 97, 22, 110, 108, 90, 37, 244, 205, 16, 43, 181, 131, 218, 145, 170, 34, 33, 240, 212, 119, 209, 173, 251, 7, 164, 218, 10, 139, 29, 33, 222, 180, 209, 16, 25, 98, 244, 15, 70, 124, 143, 95, 150, 223, 76, 116, 65, 203, 28, 221, 128, 196, 147, 25, 19, 41, 69, 199, 12, 72, 243, 174, 27, 19, 0, 46, 144, 95, 231, 184, 200, 185, 176, 217, 20, 10, 202, 10, 62, 82, 193, 234, 211, 84, 229, 184, 125, 240, 115, 9, 251, 73, 36, 126, 95, 11, 0, 115, 229, 195, 40, 154, 137, 173, 194, 244, 93, 147, 160, 74, 178, 105, 153, 60, 68, 177, 143, 232, 86, 170, 98, 179, 73, 42, 224, 3, 189, 10, 150, 104, 65, 17, 120, 68, 20, 9, 55, 118, 58, 3, 241, 201, 87, 16, 213, 116, 46, 9, 115, 102, 44, 212, 45, 242, 89, 124, 52, 2, 13, 134, 169, 117, 211, 20, 187, 209, 141, 226, 99, 128, 78, 181, 191, 179, 174, 145, 1, 64, 148, 45, 52, 197, 138, 38, 243, 149, 188, 211, 157, 38, 162, 159, 64, 138, 83, 82, 159, 54, 172, 126, 155, 175, 61, 224, 23, 150, 116, 225, 95, 110, 245, 137, 207, 72, 66, 208, 8, 95, 232, 151, 117, 1, 98, 166, 244, 237, 206, 52, 126, 79, 132, 97, 225, 180, 240, 188, 152, 24, 161, 228, 154, 132, 80, 129, 62, 80, 118, 60, 71, 141, 133, 189, 0, 15, 189, 30, 92, 211, 96, 34, 207, 102, 241, 226, 68, 20, 231, 144, 55, 95, 167, 77, 241, 79, 115, 203, 163, 200, 235, 209, 39, 196, 214, 207, 228, 153, 103, 229, 208, 64, 68, 126, 13, 94, 6, 190, 240, 235, 6, 13, 149, 216, 34, 128, 167, 190, 145, 138, 211, 165, 124, 96, 126, 187, 109, 62, 242, 178, 23, 232, 206, 188, 61, 187, 234, 150, 130, 110, 100, 171, 166, 3, 168, 16, 251, 211, 198, 22, 136, 76, 113, 249, 250, 141, 218, 52, 235, 29, 165, 69, 93, 187, 236, 201, 79, 37, 195, 4, 155, 55, 92, 34, 223, 186, 85, 74, 107, 229, 116, 195, 235, 234, 176, 138, 155, 63, 69, 209, 166, 107, 136, 168, 236, 214, 165, 93, 51, 198, 144, 193, 130, 135, 229, 48, 217, 238, 114, 97, 235, 52, 241, 239, 76, 56, 103, 99, 125, 75, 147, 41, 128, 51, 146, 36, 195, 241, 60, 230, 213, 52, 101, 144, 145, 131, 201, 248, 102, 9, 0, 155, 71, 190, 113, 154, 189, 174, 165, 8, 212, 237, 140, 3, 229, 230, 198, 174, 240, 171, 176, 172, 59, 63, 3, 149, 190, 48, 172, 35, 54, 10, 241, 201, 112, 202, 184, 49, 42, 79, 173, 79, 20, 170, 189, 131, 171, 229, 230, 69, 78, 76, 152, 187, 244, 255, 148, 132, 229, 228, 171, 202, 198, 253, 67, 8, 7, 122, 43, 109, 6, 118, 14, 89, 29, 134, 12, 173, 90, 28, 121, 203, 188, 245, 84, 189, 190, 99, 236, 85, 4, 7, 125, 76, 148, 207, 172, 35, 17, 228, 47, 239, 68, 36, 183, 202, 37, 249, 63, 169, 10, 4, 123, 50, 213, 228, 81, 158, 56, 132, 208, 87, 175, 124, 111, 37, 124, 37, 24, 13, 74, 144, 52, 97, 111, 99, 78, 157, 51, 63, 76, 84, 131, 35, 147, 225, 248, 200, 248, 4, 255, 25, 151, 50, 210, 43, 149, 165, 152, 1, 253, 181, 182, 139, 237, 93, 79, 188, 104, 226, 182, 44, 136, 191, 171, 175, 100, 188, 191, 105, 38, 109, 14, 160, 154, 231, 172, 195, 51, 234, 191, 104, 201, 61, 50, 76, 124, 35, 86, 35, 231, 111, 70, 3, 95, 40, 113, 103, 147, 224, 68, 8, 14, 150, 2, 146, 62, 128, 41, 37, 109, 173, 57, 158, 236, 206, 74, 86, 105, 136, 55, 70, 90, 182, 222, 62, 57, 230, 146, 13, 248, 99, 91, 57, 158, 185, 26, 97, 246, 248, 192, 148, 63, 144, 28, 189, 62, 170, 133, 203, 243, 250, 87, 111, 42, 219, 189, 166, 21, 214, 209, 37, 170, 82, 20, 231, 250, 128, 185, 17, 106, 141, 11, 52, 175, 128, 50, 202, 174, 95, 221, 98, 35, 13, 14, 10, 223, 21, 43, 166, 62, 94, 184, 204, 197, 119, 6, 250, 177, 225, 242, 199, 68, 1, 235, 101, 0, 18, 146, 149, 176, 16, 168, 115, 160, 220, 85, 48, 171, 230, 124, 72, 121, 234, 178, 36, 65, 228, 35, 107, 124, 115, 155, 216, 106, 100, 207, 186, 141, 78, 94, 237, 38, 87, 89, 173, 185, 130, 139, 196, 206, 49, 7, 127, 62, 143, 157, 158, 51, 182, 175, 95, 34, 175, 42, 138, 103, 179, 207, 47, 4, 16, 79, 88, 47, 21, 78, 182, 110, 30, 24, 146, 176, 192, 238, 186, 102, 175, 120, 101, 245, 179, 144, 4, 148, 226, 110, 156, 17, 98, 62, 245, 108, 249, 104, 213, 184, 137, 214, 96, 234, 43, 68, 14, 130, 213, 57, 247, 71, 125, 79, 249, 61, 154, 19, 89, 174, 75, 215, 208, 124, 89, 197, 109, 214, 202, 137, 42, 211, 253, 221, 223, 35, 32, 13, 211, 91, 17, 10, 244, 53, 194, 146, 89, 138, 108, 137, 7, 182, 229, 67, 129, 232, 235, 223, 237, 241, 226, 146, 239, 38, 48, 162, 217, 57, 7, 28, 28, 149, 49, 206, 83, 63, 247, 112, 121, 141, 5, 2, 85, 236, 191, 223, 69, 33, 64, 247, 121, 190, 141, 17, 161, 239, 156, 189, 157, 181, 76, 221, 218, 28, 4, 48, 82, 248, 171, 68, 133, 155, 173, 81, 250, 144, 166, 211, 176, 243, 166, 22, 45, 86, 105, 165, 11, 144, 119, 163, 72, 77, 229, 165, 114, 168, 241, 221, 61, 224, 61, 134, 114, 45, 94, 93, 108, 50, 208, 181, 2, 68, 210, 117, 186, 156, 99, 81, 2, 157, 151, 218, 97, 18, 20, 55, 129, 97, 155, 132, 209, 132, 14, 182, 201, 186, 238, 216, 255, 112, 167, 19, 192, 88, 57, 152, 32, 108, 114, 172, 20, 75, 154, 146, 143, 175, 238, 204, 135, 46, 146, 202, 113, 74, 16, 184, 105, 3, 31, 58, 18, 138, 228, 89, 40, 187, 171, 24, 248, 34, 211, 208, 241, 81, 145, 106, 158, 165, 154, 149, 205, 6, 213, 69, 91, 102, 246, 85, 62, 2, 51, 178, 140, 45, 108, 1, 218, 34, 31, 31, 44, 196, 125, 119, 227, 70, 111, 125, 133, 133, 199, 15, 8, 32, 213, 36, 173, 148, 84, 66, 230, 37, 4, 148, 49, 112, 101, 132, 122, 187, 113, 123, 95, 93, 14, 146, 202, 237, 218, 174, 210, 26, 211, 123, 107, 84, 43, 132, 128, 76, 185, 4, 189, 212, 244, 251, 225, 51, 255, 255, 70, 37, 231, 229, 5, 181, 215, 175, 112, 117, 249, 225, 73, 35, 209, 164, 101, 100, 36, 195, 108, 162, 97, 23, 169, 206, 171, 250, 157, 241, 9, 134, 131, 243, 142, 116, 85, 15, 57, 11, 91, 214, 159, 24, 176, 215, 124, 65, 238, 42, 41, 84, 104, 207, 21, 174, 136, 235, 58, 130, 229, 24, 9, 162, 225, 230, 133, 213, 86, 219, 122, 245, 39, 16, 124, 172, 185, 114, 6, 246, 126, 27, 166, 165, 14, 191, 54, 221, 197, 200, 86, 217, 95, 134, 24, 9, 253, 87, 134, 54, 66, 166, 160, 154, 52, 119, 38, 118, 140, 180, 209, 199, 114, 174, 47, 191, 125, 92, 65, 145, 18, 3, 192, 68, 208, 123, 24, 139, 169, 55, 67, 177, 42, 244, 200, 73, 207, 152, 225, 246, 140, 108, 14, 170, 64, 163, 95, 36, 38, 2, 16, 247, 122, 101, 245, 132, 60, 130, 196, 42, 214, 232, 218, 125, 199, 59, 173, 147, 107, 194, 227, 170, 38, 171, 199, 140, 93, 185, 53, 66, 42, 158, 110, 15, 7, 15, 189, 123, 7, 50, 224, 41, 160, 159, 195, 227, 24, 253, 250, 98, 107, 145, 162, 21, 163, 31, 14, 194, 93, 137, 184, 222, 91, 78, 35, 99, 105, 251, 117, 142, 169, 239, 242, 255, 137, 130, 196, 144, 134, 176, 206, 231, 59, 245, 180, 89, 6, 10, 9, 154, 215, 130, 18, 251, 140, 154, 39, 255, 185, 131, 67, 177, 177, 157, 24, 120, 2, 190, 223, 154, 188, 234, 181, 9, 84, 108, 28, 99, 227, 46, 52, 140, 246, 216, 244, 132, 203, 71, 126, 199, 2, 178, 2, 47, 178, 8, 38, 208, 10, 121, 101, 20, 100, 23, 228, 87, 79, 80, 196, 0, 167, 239, 251, 19, 138, 38, 205, 100, 95, 199, 84, 152, 225, 149, 163, 126, 91, 156, 92, 117, 194, 56, 86, 85, 112, 99, 48, 205, 244, 67, 162, 202, 179, 143, 128, 119, 220, 42, 179, 7, 181, 17, 80, 41, 11, 29, 37, 165, 199, 157, 167, 128, 181, 42, 76, 30, 222, 221, 80, 213, 108, 73, 33, 130, 155, 119, 24, 250, 63, 47, 160, 211, 1, 158, 128, 166, 4, 232, 216, 1, 173, 148, 215, 48, 147, 182, 232, 0, 156, 106, 45, 44, 230, 141, 145, 109, 140, 160, 121, 187, 81, 55, 120, 101, 14, 100, 67, 227, 162, 146, 230, 90, 147, 59, 183, 179, 83, 214, 104, 109, 187, 162, 193, 220, 55, 51, 133, 196, 15, 141, 237, 50, 47, 56, 167, 173, 191, 201, 163, 100, 146, 207, 255, 178, 115, 27, 201, 238, 55, 252, 118, 214, 105, 33, 78, 129, 27, 97, 210, 126, 230, 199, 140, 224, 59, 143, 142, 199, 97, 100, 96, 135, 98, 136, 191, 146, 160, 103, 206, 72, 49, 124, 185, 96, 171, 46, 154, 1, 67, 2, 102, 170, 170, 18, 89, 69, 9, 31, 134, 243, 241, 79, 68, 27, 10, 114, 236, 185, 240, 122, 50, 229, 27, 133, 83, 224, 23, 183, 35, 235, 208, 75, 161, 223, 25, 167, 94, 234, 73, 202, 229, 179, 33, 252, 10, 110, 127, 5, 49, 82, 254, 166, 250, 231, 164, 19, 7, 241, 192, 69, 54, 66, 191, 149, 7, 146, 13, 189, 146, 137, 154, 159, 33, 163, 58, 135, 142, 127, 192, 142, 169, 127, 39, 64, 69, 190, 139, 88, 221, 61, 166, 196, 232, 18, 87, 212, 212, 188, 60, 145, 32, 101, 103, 249, 8, 85, 88, 126, 249, 216, 203, 220, 23, 254, 124, 180, 96, 221, 102, 231, 71, 125, 222, 188, 2, 136, 116, 61, 76, 206, 228, 67, 202, 85, 154, 164, 193, 12, 176, 187, 164, 9, 44, 25, 111, 20, 88, 247, 232, 193, 21, 184, 142, 146, 44, 98, 14, 37, 98, 189, 35, 191, 169, 234, 223, 57, 125, 188, 85, 144, 164, 47, 124, 96, 40, 112, 202, 178, 189, 252, 232, 24, 203, 6, 186, 105, 137, 15, 22, 56, 175, 27, 52, 255, 248, 99, 201, 202, 93, 127, 205, 246, 142, 17, 176, 14, 128, 126, 155, 99, 35, 116, 103, 249, 248, 66, 241, 94, 159, 77, 54, 6, 52, 135, 231, 116, 240, 27, 37, 109, 67, 220, 49, 14, 189, 42, 184, 61, 9, 82, 174, 76, 221, 225, 33, 151, 219, 169, 216, 207, 193, 154, 252, 78, 254, 233, 103, 142, 82, 4, 210, 119, 250, 161, 172, 55, 180, 19, 77, 250, 90, 89, 9, 225, 136, 160, 95, 3, 183, 68, 246, 59, 212, 135, 243, 15, 190, 107, 131, 167, 221, 113, 100, 89, 196, 224, 22, 28, 201, 43, 16, 9, 125, 41, 120, 47, 137, 85, 106, 112, 181, 219, 56, 98, 100, 61, 18, 142, 7, 204, 147, 122, 68, 35, 73, 42, 99, 223, 136, 59, 148, 117, 181, 71, 14, 127, 128, 1, 120, 239, 144, 187, 234, 131, 173, 150, 4, 132, 221, 216, 109, 19, 88, 83, 234, 64, 129, 236, 55, 69, 191, 76, 40, 164, 171, 36, 187, 153, 235, 30, 135, 114, 76, 99, 180, 179, 23, 10, 137, 180, 214, 195, 52, 142, 51, 115, 1, 14, 183, 33, 146, 246, 173, 160, 70, 162, 176, 53, 219, 201, 89, 225, 150, 212, 180, 68, 163, 96, 62, 160, 183, 161, 182, 166, 217, 83, 242, 141, 13, 126, 254, 174, 139, 231, 251, 252, 239, 118, 239, 14, 152, 202, 210, 170, 42, 239, 139, 141, 218, 218, 18, 139, 215, 16, 202, 28, 70, 58, 119, 193, 4, 123, 201, 133, 10, 155, 191, 231, 103, 169, 33, 239, 78, 240, 20, 136, 251, 235, 50, 80, 111, 18, 127, 176, 168, 206, 120, 237, 164, 201, 98, 114, 92, 61, 143, 71, 151, 249, 181, 88, 220, 166, 22, 209, 164, 148, 108, 242, 15, 97, 120, 148, 60, 136, 72, 98, 242, 56, 195, 235, 119, 72, 18, 161, 92, 167, 89, 240, 234, 242, 206, 204, 74, 137, 126, 71, 64, 29, 43, 168, 31, 69, 6, 207, 177, 0, 107, 34, 220, 252, 14, 64, 103, 132, 157, 43, 145, 144, 11, 15, 83, 122, 163, 54, 186, 90, 14, 226, 72, 95, 137, 198, 242, 30, 212, 130, 242, 221, 107, 30, 149, 36, 202, 144, 132, 96, 245, 68, 243, 158, 106, 164, 71, 244, 105, 46, 50, 127, 3, 83, 10, 126, 36, 96, 154, 252, 2, 187, 194, 47, 30, 146, 232, 34, 103, 213, 205, 120, 237, 232, 217, 191, 219, 69, 81, 218, 99, 153, 141, 218, 103, 238, 65, 0, 246, 11, 240, 192, 245, 123, 45, 42, 182, 13, 249, 13, 143, 28, 168, 207, 180, 114, 238, 24, 60, 102, 246, 197, 235, 138, 243, 205, 246, 3, 57, 24, 179, 220, 171, 179, 26, 64, 198, 237, 108, 81, 130, 15, 61, 56, 35, 26, 73, 70, 228, 245, 121, 174, 31, 99, 10, 130, 222, 252, 181, 155, 208, 115, 173, 174, 231, 206, 108, 2, 59, 212, 78, 225, 202, 190, 177, 250, 130, 105, 91, 36, 120, 42, 15, 30, 221, 113, 186, 147, 103, 33, 204, 177, 131, 9, 164, 119, 135, 218, 183, 213, 160, 246, 195, 128, 229, 164, 63, 53, 130, 241, 171, 233, 66, 217, 240, 64, 189, 71, 18, 249, 162, 23, 65, 125, 30, 81, 227, 65, 113, 16, 187, 108, 69, 249, 208, 41, 210, 36, 58, 45, 37, 32, 156, 64, 228, 254, 5, 16, 90, 19, 110, 1, 21, 91, 173, 13, 205, 249, 70, 193, 105, 124, 3, 210, 245, 164, 72, 53, 198, 138, 152, 177, 34, 118, 98, 129, 27, 82, 87, 232, 230, 239, 73, 167, 144, 221, 40, 112, 23, 13, 177, 55, 243, 216, 52, 181, 240, 3, 28, 4, 33, 37, 190, 26, 215, 201, 91, 35, 97, 0, 26, 87, 105, 17, 173, 209, 238, 104, 38, 173, 122, 138, 170, 197, 156, 107, 105, 228, 206, 79, 108, 222, 136, 154, 162, 122, 131, 1, 11, 52, 61, 67, 139, 111, 209, 74, 42, 219, 163, 248, 101, 16, 186, 21, 154, 97, 18, 198, 153, 32, 155, 176, 173, 99, 248]), hexadecimal: '0xc77319bfce98759c21cec7e6585d7652021558ad26629eeb64d10bd0b15c1ce9deaf45b5da7309fdb2b621769cbfb84b68330eab6b8a5ca6f3dd3cbed8d7e6c63c4ab2a664d5c9fd056bfe3f725c716d67872edf6aeea3a2522c68309e852aa9f694f553d8581abc3f7fab0f58be6a2adfa1cdba0e81b090dd5549e192275871819b0ace21b32ae8f7763b8f65bbeb9bece4f8ae724cee343099c99a4808973882ab98310ad005fe8940a96fab1a436430f766fcbdad003174b0b94962ba2832cfc129a3e2a6d2f75f2a0fc3091cbe3a55db676357a049a2b2ee0c1e6ff9915ff057fceb37191782653453365828348322f72d62f0a5f0f633f26be4d298dcc07d2815eca72c2e9b0313059fc170a787770055b3470cf7284efb2e3a401c46941b4da4cd4f58477de18b1fa97c67415cbe1b12ea4e64374cefd8123516e8d8ac3da6561364a7bc7c7e9bb6cb50248a4e6b108d955c1761b9cae97e07810415fc1f8d149d594679eda5b427c85ee2b274de128271dc88bb51cbc8a77573f553903980b1e26f5502caee3d52f5464e7dde4d85285844ac7a162d8350e88933db0dc6a278b4a351848e704cbe619b5e7cf4c69cb1d9b9fb9b27042d695fff79b1e3569a31030b963221a296d2c2b89cce70881be24515099508f677e047c062e14562169f632f1ce0a0bcf1998767227b6cd6539e341f44d395183b2de3ecf1dc06191386b3d6b737a6869aa7376c9caf818c8c27d44555a72149fa21c3a5b68de64f648beb0bd8712e84d21d1cd2f8b9103db0e55f59820aee20e65591264d92ba762690720d2ab8fdadf62d5afbfef4e9863e66092710a0f65b3c51dbd3d850ec4a73edc185fa0263013192a77426dc3df58199ad76657db1ff6d23fd032bacab82e818b32e7847635afab67dd7877439f8e03cf7482ae8287f8412378a0506f5fb8a3c7eb344422e3a5d9766bc166235f21aca372542537c7b1eb6d671c9b8a7df0b310c76f9c3cc13a41e79e8ccc9f4e81275919b9ed19d66414595114d1ad5bbb33aed40a3b5841414776d49cedbd0f353ff7534470272d5bb9424aa26c6f5207d5fea525bbbffa6e06af28986eeae0e0552cea0331b26cf890afafcb39c51055e827bba428c7cb49d552fdda7fccbe16b720136f31a793f5706bd480ff8dcefc27b837e754c4791f8c64d93f96fb23ca75cb4c5893da4c8fb48ead34e2807f2b9180e713f72fce2d59f38f24943d4e8a84af3419d2ca21589e103941d56b3087b8ac01e194cd5f1df51ec92e4e2cadb3876f55eae49ecd62c37874d56c8dd7552fb3657b67ec6b9ab824a4bb24a9a7a6a19893d837575435c1dfe990507c6ba2c751e5ac8ef30a3da74442c32878efadf7075b2b16360c98999eff2a89f16d0fd86133c08ff6001082095ef261e9bbcd492606b7c2367c852578eeee310747ff37e0d771b3e3a0965780afe56c8138cf2c451b6da466b5a1a77c3f3d2a39e18a86c589a7a187e99c4c82bb0676489df30a8701cce07bb64b74dade7a7e9c08cd81e5f537cb333a4dd13449a390e1b256f83615b1a1de468fe04a8d99c999dc84b038fc47a39230f13a8a91ef47ae73c95f7f54779ef915cd1fe74b5aad67dd13643f79f4e32d6604124708c15df0d192668ef7f1835a801a5c9469948f78e5121cc86f23568b2cab2031b34534bf2a9bf7841498aa9e5cb70e680cc513e4f67dd31bb004ac95bb0f1159de7d71e34e0583607aee2ac8b6fa23bcab46bacc2a7f8946a0a675df68554338d27ed37f42cb1dcc9bf315973acca5cba2748adffa5c3e7903243a1ffa479b5311a89bfe115c51d2fb848f71746a8867e7d80cab59cde8c3653f5551d3ca5a4a86c6b0031e3e3bbd29ca260b08071492d8e72c5317b47d392f0c0f980799d5e8b5faca7e5fbe7103e93649f4348ab4a9d8b7c6e85419c6e0937f55eb4535696cd06fc05649b4abfdd38f1ce4995f7da912ede1d2ffccec707249acdc58e89a9528a539ce9187636d4e9ac778d5d56d9903623fed326f9e6d9ae9d354853fa3db166309f0e3d6124ab539849327860264059b3fecc2594db8e5ea24107c12dcb06cf8c80a203a05323989d90b149268348ca201c81be1547ff39375cb52592103cbd8a387303154c50353a391f851fe90b43098dc237ae13fdff233b50ff1c779432dc78e7fc7e72140be45cab3d609890e2dc73362c1fe1261ea5eb091cc356d477344e5f5acc4f0c8365f2d565376c95105afdb517d33107f3bb31ba7358569908a68a61cdcd8400a02526352a35c36a94214e8f7ba9c1c3ddf3a63ce36df0c24e86bd9d14c0aef0c360863746d5fe83bef929d078981eb45d722f9751eeb28cd8e5ef10a1739495ff9a00c5b850d80c1031c50fd489fd369cd8ccdf92f4e1e9e602c0741cba362fa4f0404b337ad93edafc8b0f048295a7eaa9f0daadff60b8625a6353845b9e03bf18c833d1596572d70b0bf6d55ebf5f4ad31e1915cb18e148ae67c202f43095a2304a6081447228d77c509078997bb9bf4a852f4d6bd6e2040be3e038ed22f1b30e879dd6bcbc30eaa22fc1327747ec86000c305bd1de7eec37b88bf965d6480e54ca9e00d3b3380dda9f782c8b4ef3dba136b00378fd15c430f722d84ceee3c8d484cac72a5e58a3db34e17f32443df27363f6f439bccc1ca4da5e2b9eceec456f2b5b9a3c7bcbbbc9aa9a1bd07ef743bf688222a85112e43fbc9dd998c546df6a88942c5d412306f9c18572b1409dcec91511fd48e4426e0acfcf252ec0d78b03c75a094e30065bca2a811d8420dba4b5e33ae10339e7141056ce58c98a8ec6a7e24dd380ded3bfe4422a7c92dc63f680fa25d9b498ced9d520ed53e950d98b1eb7a2fd5e5f950d4c05e609e2eca893d929059149bca7c3735dd91b231bd52487ef1d0f0def01c0c408e6ab7e3dcdfe78be9b2b072d8a1272ff420a1ce78e68f4f6612019a893a87af10a46ea35c700e3c8bb99b44a081fb04d78deffeba0ddea544a38d54630137acfc9d0b048ad53864e33b0e635238387d5e28248e9682ec3069a7a250333549079559602d1632f8bef4f41fe23a2b6b1db287c8e852a7602cfe7d8bdfe177b3667c002fe54243142d8668117a413374a3838c55867c9a3b3ad77115c9245d59f3ea193b19552eb8f7b356a754c94faf9483958a7d26354fcf633f735b69a2907f3ed111cc0d41775a3df2d2534bfda56f12346f9bf62c3c1785b0f7e43df7046225ae3fcad7a550c734b87281761d73b2e9117ae49b600c3d6b783a737bbbe2d65c935930fdfb9f138a393a0adf6c7f920818df80aff9c70b656fe1cb0a23cadab210139866b7d4e25870735d35bd1191f8d61ba23e24a0832d3e55b88869d7da4d36597f788c31e6dde618860c2e24396bc6f0fd2c93de1c1ca85a2d495359be1a05c3749c9433bff09993befb031a9ac1bba80d520146c9f1ccd97a86e04b1837f15a9a9f5577ce9cade1cea5c134959d916b4df86f5f1f35dd61e848eb32f16a272974a6759e7c3ff43821edfc230a9151df613686127e85615d0840f81e05e463169982f82db9a5b1712edf96d0d0bbd0c050554d424672263ad70306fd84b476e29b9561796e2903fca31341cf139060618a1f19afbd1d89285327c2631e01a031487374b21a6ff554256c7fce4b3a6ea007374ef5a53539c4ed9a292d8d8932b81fcea164f4d97d2bcbf7c2ca039d02a11325c6ec352d3c0f6227e5a17cee567229aedb99b66ba146c432eceaabec2d65137892e85c67911afb507686ea7f53f4955b97e7dd73f225f14c97bbec0bb1cac37762fec70e73857cc8b93d6d2d4c37dda07daf503ce2ead6c22f81296ad5e0f515bad67560ca36ac47bf89db40343cbaeb354f41c11850fed0672bd01928be8a3dcea733b84fb9693a651e60114397e749fe491d419ec54a5ce778367bc5c1358300e44db785578bcee24edc4617e1f407a4f9ef7f4c4183c40ba9c15b6b8ae64cb76efb1577da26b0c7d9ea7a8adc021eb9fb7b247a476b5c6c6f5a563ddc1cfd07c35e6a7a5c9c443b969f56fa254fcb5e34ab8288878587c2cb9cf219442c10b366143e02a4a5d2275e49e783c77fd6dfa26ec49f391883bded8a3d818a998213b632a1a049caf12391d29b8f9b394fab55db5deda3e40cbdc7461cd7719975428b045520c14c8665346bb5bb9b1eb7a73f517ee6b60c90907b5e8d20402da24dec5ba9e05868135da636d1cc1d7b011ecdbc03a0dfc8b3365f2ce44f00071ce5a7bca9ef5fdf880bf0ef33d8e2303667198b4559afba3c5f453ea303b42108eb2635ca1622783d65d047ab260a2613dba4eefabba400ab7b1079b2bb9a37c2a6e34f426124a5c08da37c19ffe3c7914c4b4fd5d1f5d96e211b890f28313ffc3b6857b7da03ceeae8d74bd4e1fe58eff15668a0ad6915bbc1be34113afb6d851e86a8aa2ae47c3d7bf411ddb9a2ac52ee4877e545eb4799684df43fe58adebf4376703970796d5ec63b8dca6f9aac90b5e65d14d2f011f6d4742435e47336a88b26547430dcf08c88b559f12a40b59e3920128cdd5c1e5f023aa21d4db46f3d34f9e5e2eaff8a86804786cd9c506a95303f2273499e5cae52657a2305da4debb63d347fca5e5ba78775efdc2cf655ccb71e0474e827648943fb9db963513e1988e72efcfe74c328f4b01459403473904b614967007e0c1ea3551d3729c5005d3f9a53545f20888e7b54613107fd1d476bd02f826bb46fe49f72a914139f3d76a9abb62fda91bce0a9194b78350ca1fec3d734524441d94c10dbffdeb1aebe387929700d76ca046b0c23b5e9d2e598d06cce1dfd97aae615a17ebee677b250220ff79e085d4aa30e02180f4f7f53cd62a21724da29cf0d33415fee7bc73fe2c460f5f0dbafd084e2829ef14f9d994a622686d14757c676be319a0688a2081e450fe786f3733b74c937bf0c431fa778bcde082662c821b1804ced01cfbe64a07eb0f7aa40decd62b2ce0e36e35b2b46ba0072c52c66c079fd74e1a070c092573f6ff694a572945afa5363c25c874e99a6b175f307cdf9d680db9ca020fb42f257c2b845fad4555cacc139231474a8ee970bf1df3627ffa141841785dd9af69b26ab971a3bebe5132bde403502e8c515a116b42e0a773f932ecdc9bd69b81f8295db9067864286be218a3740dd6a992249b818ba00f53e5ba7f6c8e8f1a2b07845513f979e66c5db0e6b40f3618028270bdacdd6e81f30304697466205796794d713a5a595a9d669cf3a110d60c3777c8c562485fe5c296d36287924e86dfce39229dabf63df326b8c0991c356ba8ef9601b3e113aa543d2e90a1ed3ec60eddd634c75a7d917003006cfa6eafee37a4ebbb30c91e2056bc0d7d9b78e2721c20d0374717b5a1017e0b249c2a9c9988496bba99c42930b2c06be2aa30ca6d327770c756168acbe2d8ed41a4ad8f26e3fed04836e3414b206870384d11cbcfbefdfd80625d89e660bab7c417fa80e553ee66593821afd249e1db222661224d4fd6034a89362536dc26cb49c2d424fd89f6a849f6219b1f9c6b6d8493fcffa18fc9aaf3c4144498adb0888bfe46142767138b264a31c94264fdb10beef3ef68930cd1945a2256a66e0e287599951c6a4c6b0c2cd61216afc37df76127f83690878b86d0a11a6874dc17d95d0770ecace5f3a55d0b2a2aedea4f3f6e26260ed4c147d2c3c6412e48142c717f371e0f9fa87e18fa2345908b043f5fc2346344f5a994c6caa7065f250bc3f48eb1d6e8df5819904fe656379eebcc5f0b362d143c7388b82384afc914eadc0ff1b2b572ae00aaf90c0b7779706a16c246ee8086a666bad7c914d8f8d7bd89cd61e937ae1cc337c71dc69aa9e951a513d45b8d3d1a1006e81b1db318c8f0f89ea56c3daa719516d1f0ba9466c9d44ae8d2fd441b8121e85f9790c2f1b6e2ab3fff389a93a7a89cc1af88fc8c2b0a8cf7831630d9fc3f260ea69ef397d5b40e16aa1c8f12443ccbdf99d31693dbda2d6f9a9e70fd1fa7b391a839126e26e601a868d425dd735b7ec4a28fabf738c85c9a9563352cd50ffe72af3f365b8b29dce25043eb35a6bb28dc87959ca7cfce6e7591540929bc2b263fa49e30031980126d980706e6a47c6477309078d71b359fc73efce7e3b2d598539d0c96363a4fc072fbe288c9667475447834e89c779bb4991ed0b70ac7348fa3d99e1583ad0b42be16268c7efa4c1ecaa2673bc1a8fbd0590c22e9834572c6fad9c11b03c09a3cc602c4ba1e05c58fd63c78c4a0b681cff0d91093b37893644ba062abdf251b28b59d8533cb2a1a4b715cc100370af2a3fac3294cf64d7a32cf7ba96e34ac5a5b87a643283f645ea2424296f51e9f285c0f909b1f2bdd500ef29ee55e2b9eda76e33efddaf06ab057f4069514531cbc0012c546f643188bd4bb0ef7d2b18ccf3f6ed0584b81f697c59a504e3209c125a4ebdd49021b31f8a01731bcf4f898b5dbff1d645a96484f5dcafa73a2069c4bca092e2f568e96e719e5d943e91fac48079e6f56a0653ddc3f1606ec3aa4f822f50368fcafc554d41741cd209d9db13f03da5192ff41a9726354a62cc14189f8494944bca69989849eddf89c1b76211e06937d86ac6c6247ce741e5122628891f069b367158891da8a3744015f5795521a1f43d7cdbe3dc62b2a29616f176d8ec01cbc589a3e7bfaeed128409b37412b8721d7e9c590a9f6d5578550d92e3587933cc40e416c78a16e0e44ce00a3195653721f8e520215ed52c7bfdd396cdc9051b65e497f20eb2b7d7a6af21d43598d3f14175a9be0db10d941ade57ffe640fef7efc70998eac51d9281da6634792dbe003dc0478d6746b6c9a89021724a988eabf31dda19b9e3de8641f97da1e18dde433b622d39b9957294160f6b1486e4042a2c65ae2df6062ff176b353678eded5518e55c046bf54ca3fccc0b9563d07cef8b2ce057c8180ded480d4150d24b9bb65ca350c6c0a41c5793b26c4c3d25653e89772e70c42689f78e9c0c5753be6d58cb63486383aa50eb231afe8f4b8212b70303b476943045838d6eb461f0dc379a20af3fc5f11441f120bfc072d76b6004afe877250ca9316684e4b60da8f4e4fb0a15fe73fb604b4bdc1866beab0cfc37aaea8c2593529886e67c13e0f66e8c01de42edaf488730b49451f72a7fc446e15c454797eea1621757fb9387a35d936dc7cbbdd9320460c46e95a91e2665c0bcfebf5f90a6d195a18b5199e2747c7aa1e438c3babc3243bf529773d47d6453431e031f7d617ebd25dd138e7c0a02177803db2e476699b8bacfa5aa43c368a4248fcbb9d30c82ffd6fa80d7d54e5f29a1a7c437c04bd47e6774a921a0b983ebb4f8ce45ba2fb53a2c57fa412dfa78ab8bb8ba032c671b44b41a03738786b1c8b0a8d459bacb0f235a2cdc8bb9c61151a5cfebf0aa0d1fca1eebb7bb3c9ffb6a5b173cef67f7ac3b1e7a3f2e157eaa5dced1880f1262463ace611f47c2f45d291c8c099ec0288d13ff2a9e4822f3facd26f3a6d420bfa6b205a2ea1c3bcd530d59c6edee349363c105f0c1cd1030da9b392a3dd499ca12751030233fc320b191d7764e601e83aae81cbbca89b5cbe30ef0774b9c77805f1e9e96c00c1d1a4730b580f14eacebb4a562ad2e5c62e2dea126c7eb993975bcfb01f5b8d60aab221962ece970c34d32addb54c8882b1b6bb59632a31d1a943859ffe7a73b02fe08a095cc98bace2795a791e327fd5d4f2a764946ed288c34eaf181e7ac9fc15c4e4e42372cafa6a0788dab87c6364d27979adcddc4cecbb15265553a2df54c5e2562b0efdaaabffd43147bc54019f59687ea8d08d6b4b958d8cbe941c0c71257b75cd0ff769e18dc5634f5c531b7b5f19ceaacc2f715e0bc523a59ccdc594f124f0880ed487bb02d50fe5f313a3cf1caf6a5a507cc352bfc864568194b76ac948afc4804878ff6cd121f921ccfe64d0239e21c3c4de9eabef7ded5578adc929d2aa2be8f7fe2c4e15236cc7bb51ea03e4640a3febf2b4ee667230b42f42da1aab0f1fbe7ecc50bdc2d26e3836354b345c6f37253862fd1df1c4989e49801b5805a3b2ce9e3be2ffdcf901feaa6054971e92ddc3269b78c139d9982e5215ce405339a490a8da9209d8e34c6b9660bda11e691751f4b1119de7d3971e41e9865efecc9bab65bffb4e720b82a8136884e6edc9d12f350ae06b174a5f9650ca1d9c8cca42d4b0aeb53a929570f0797c28d535e062e18e865c52127a98b74d01c36eebc7ff2367f3b8b57bb7b2f2af82ec1582d87f137e6d0b6454016cdd78e8bb112932136adfd2fc2d1d300982db604f764f343fd0d902f9baebed0d2f85db6e6ed4bd6620640b2d7eee9f659bde52eeec638c368d83938925db52ea8d01f1647002876a5b5c6dc0ddac2e481540e44259161f57078e16e05610dd09a2eb255358fa33bfc6d779a7c100c48062d915daef7bb5980f04e64735f66eb3bd22bca672d6a8e8d8061d60ba767a70e24f6068f5003439203f2a096455c8ccfaadaa5b2978186e18c6e73a32368e94aafdacb1a5f910857f222f8a90fe387d3b19076b320890f66d5e49b31b708662b7f0d47c5ecf03b2609cb5e94e4c2ec082c1353105c909771ccf85a872631613ca41053b6fa4e96c6dc9f5f3666ffe76c18d3b96abbfdeac7262027b9a20b808d01e0b4702f49779f66090da26f37308792872f5c838ab1433d8ebe8c93b7459e520ae382bd0322aa392bf0eb0b47b3e86073cf1e612a6ed6861f47f22d1cadcd4249d5f7a5fce2a6b2c0e4e9047ba2be7761353ba8524b2f35fb0f86698c8f9bae847bb33211efab2a0cc858397ed5c70d997fd757705c79a723f288aa66dee136cacf115608ebb54fdf8be7a7bfe1f04f3300b1e5cbdabbbe808c26cc550803d0b323dfacf3ba387d26693d1ba9b54b88588233229b1796a0e1c1a9c83ff6ad5f167b20b73c86478d2f60d9a2239b14b058effa21fd38abb84153f42fabc5f0ed5d885a01ca962e42456eb1ec5f7a65a8472d38d7248df8a5f6752831e8252a187bd222957ab8bda98b1b86f65b88f3d1a7bf8c72a6cfd3fe8a74b0f212536f816bb74c885217263a57d82d9cc0fd0170a61abe91d4be09c978c2aec3ba89aa42c6fa912bd09dc5ec65714bbc1bb285b7ee71dfd33036176ef952c3927c1c8eb630b1b010479b03bf5cae2aa5c23fe2ba131ce0c87ef619127c4cd292a27ab855a53f6df5ef049957ddc52844a88e9c2ca97355ae97a66bc9a8dfd390b310e61e1aaa7f813709c141efd8b475d2a73254972cae81a0bcd1ed59138ecc997da9f6ea6419db83204248ffdc61f14ce37d7d43ed690e72af5c861d7bec06fa4b48478cb6368bc2d3d0fcfa789f99a3037ce2f05eaa53ccc13ecd56564ce0e3e92d6f7ceb54231d6ead9c321d44ef19395707dcc98eb7aff76041cacf5c09557566747839aaa2b4e4976fb5b1b8894a3bb4158f86980d866044861ba1e4818abf79879e36a648e8fde9bec57c335b9ab5f7fc9fc8ba803fa6b7a44552a648b139faf154089726c5b588fbcc5d173782b97d5cb684cd8cba31455538f89a51d9bf79ca6376f8383f0bd3b63a40245aa360804662f1b96f5e9dc6bfc6d7c156396f35ecd611e846be2b22a1e89eb38c382479e46b86809a9894b6cc16fe2df23d6dcd9564ae50ceef58ddb6b4fd7d3cf3dcd69e772f2734980696ed5343c63fa93364025edeeba66d763487c52ddad24e1f05729f63639b56a21096ab415d307800c326948f9da1dfda9356ae4409c6268e63fd983a568ddcf6abf20f7e0c02d9f9a3e10262351719e3f38af3265cc7ff41e8a74db55f49e5be62c123d0278b9a2ea78b334a1419f1ba705d1fd9a38965072d022a68bb9e65aca79ec5fcf8ca41fff450acc89bf78abf066a60cee63ea5a8b65cb1b7071d9662ec7e985739936f4e6cfb5ead16633aefec869abc6f1c3753757836ef47a8641b4aa2d88bbcbe8e81bdfe6c4c058b90b34e3caf514ccac63650c9ce4a04e49fd6e25b3c60b375cf176fcee6605cd7ea1a8f350b9b4cd71444194187899eb1c445b8d4508d7ddab3c02fa7de6ca6c9e58eafdb40e29df6f60c2862ed516c3e943894f898cb1aa813b161da327174f17aec2901fa875fc2c55e4cead90ff3e7188d017753c3e32dbfd9b3f40fe580c64e887770e67d670248e6b445c7f7807eb0e23cd00b2c1f26e082540667323fcd2aefc07926b895c012f48084c0b2d5a5923940373079dc0863ffdab52dcc7a4bdfaca62915abc61cb790a11429e715a1cf6d24fb735ba74f03a2a0ff52ed1649caaf8bf12fac9781c52e7f7495eb3a1db5fbca2ff85d8d8c42cd2c3d6f0630788663eaf19cf66910a4b13a7f4f0f0ee82b0b555168f548670281928175d0c7416efea79ad576abd224eb03042b34a90326003353fc522bf149e2e1b69f6ca4cddd9a33b4c2685281b45ae0f730bf3506a4238c5578294cab5c81fb49083e3c7a7ea53be59a314c1d95d619257e3faedc058cadc126add2e5474bf1d1a7e1d94e230a5be89691151e6c59df4fb604b13e9025eff268470bb02e7f63e07019fc547ec01b5cb64e2dd137e33fb3a0abc0fe7647dd023344ce8054c686dcf98c9da4f3ad94bc411f87d21fdec68d5070816e5dbbf9b0855100733dd794fe71828831fa090432ba78049c84caf24010cb55ce0e3f7ac5ecebbf09fa9ae98ad2314bf54e6ddc9371ce16312aa846a7f822305ffa5f82c0aa89214d9854667abb5965b45e577d9ce5b4ad4dbf966ebf81f26704001e9ffbc89088a4e4beac26d477642e3a5d839947b49ffb68ea2dd7b28e107dce01d57ffcc4b06cfa54ef6d55d030d0dd61166e6c5a25f4cd102bb583da91aa2221f0d477d1adfb07a4da0a8b1d21deb4d1101962f40f467c8f5f96df4c7441cb1cdd80c49319132945c70c48f3ae1b13002e905fe7b8c8b9b0d9140aca0a3e52c1ead354e5b87df07309fb49247e5f0b0073e5c3289a89adc2f45d93a04ab269993c44b18fe856aa62b3492ae003bd0a966841117844140937763a03f1c95710d5742e0973662cd42df2597c34020d86a975d314bbd18de263804eb5bfb3ae910140942d34c58a26f395bcd39d26a29f408a53529f36ac7e9baf3de0179674e15f6ef589cf4842d0085fe897750162a6f4edce347e4f8461e1b4f0bc9818a1e49a8450813e50763c478d85bd000fbd1e5cd36022cf66f1e24414e790375fa74df14f73cba3c8ebd127c4d6cfe49967e5d040447e0d5e06bef0eb060d95d82280a7be918ad3a57c607ebb6d3ef2b217e8cebc3dbbea96826e64aba603a810fbd3c616884c71f9fa8dda34eb1da5455dbbecc94f25c3049b375c22dfba554a6be574c3ebeab08a9b3f45d1a66b88a8ecd6a55d33c690c18287e530d9ee7261eb34f1ef4c3867637d4b932980339224c3f13ce6d53465909183c9f86609009b47be719abdaea508d4ed8c03e5e6c6aef0abb0ac3b3f0395be30ac23360af1c970cab8312a4fad4f14aabd83abe5e6454e4c98bbf4ff9484e5e4abcac6fd4308077a2b6d06760e591d860cad5a1c79cbbcf554bdbe63ec5504077d4c94cfac2311e42fef4424b7ca25f93fa90a047b32d5e4519e3884d057af7c6f257c25180d4a9034616f634e9d333f4c54832393e1f8c8f804ff199732d22b95a59801fdb5b68bed5d4fbc68e2b62c88bfabaf64bcbf69266d0ea09ae7acc333eabf68c93d324c7c235623e76f46035f28716793e044080e9602923e8029256dad399eecce4a56698837465ab6de3e39e6920df8635b399eb91a61f6f8c0943f901cbd3eaa85cbf3fa576f2adbbda615d6d125aa5214e7fa80b9116a8d0b34af8032caae5fdd62230d0e0adf152ba63e5eb8ccc57706fab1e1f2c74401eb6500129295b010a873a0dc5530abe67c4879eab22441e4236b7c739bd86a64cfba8d4e5eed265759adb9828bc4ce31077f3e8f9d9e33b6af5f22af2a8a67b3cf2f04104f582f154eb66e1e1892b0c0eeba66af7865f5b3900494e26e9c11623ef56cf968d5b889d660ea2b440e82d539f7477d4ff93d9a1359ae4bd7d07c59c56dd6ca892ad3fddddf23200dd35b110af435c292598a6c8907b6e54381e8ebdfedf1e292ef2630a2d939071c1c9531ce533ff770798d050255ecbfdf452140f779be8d11a1ef9cbd9db54cddda1c043052f8ab44859bad51fa90a6d3b0f3a6162d5669a50b9077a3484de5a572a8f1dd3de03d86722d5e5d6c32d0b50244d275ba9c6351029d97da6112143781619b84d1840eb6c9baeed8ff70a713c0583998206c72ac144b9a928fafeecc872e92ca714a10b869031f3a128ae45928bbab18f822d3d0f151916a9ea59a95cd06d5455b66f6553e0233b28c2d6c01da221f1f2cc47d77e3466f7d8585c70f0820d524ad945442e6250494317065847abb717b5f5d0e92caeddaaed21ad37b6b542b84804cb904bdd4f4fbe133ffff4625e7e505b5d7af7075f9e14923d1a4656424c36ca26117a9ceabfa9df1098683f38e74550f390b5bd69f18b0d77c41ee2a295468cf15ae88eb3a82e51809a2e1e685d556db7af527107cacb97206f67e1ba6a50ebf36ddc5c856d95f861809fd57863642a6a09a347726768cb4d1c772ae2fbf7d5c41911203c044d07b188ba93743b12af4c849cf98e1f68c6c0eaa40a35f24260210f77a65f5843c82c42ad6e8da7dc73bad936bc2e3aa26abc78c5db935422a9e6e0f070fbd7b0732e029a09fc3e318fdfa626b91a215a31f0ec25d89b8de5b4e236369fb758ea9eff2ff8982c49086b0cee73bf5b459060a099ad78212fb8c9a27ffb98343b1b19d187802bedf9abceab509546c1c63e32e348cf6d8f484cb477ec702b2022fb20826d00a7965146417e4574f50c400a7effb138a26cd645fc75498e195a37e5b9c5c75c2385655706330cdf443a2cab38f8077dc2ab307b51150290b1d25a5c79da780b52a4c1ededd50d56c4921829b7718fa3f2fa0d3019e80a604e8d801ad94d73093b6e8009c6a2d2ce68d916d8ca079bb513778650e6443e3a292e65a933bb7b353d6686dbba2c1dc373385c40f8ded322f38a7adbfc9a36492cfffb2731bc9ee37fc76d669214e811b61d27ee6c78ce03b8f8ec7616460876288bf92a067ce48317cb960ab2e9a01430266aaaa125945091f86f3f14f441b0a72ecb9f07a32e51b8553e017b723ebd04ba1df19a75eea49cae5b321fc0a6e7f053152fea6fae7a41307f1c0453642bf9507920dbd92899a9f21a33a878e7fc08ea97f274045be8b58dd3da6c4e81257d4d4bc3c91206567f90855587ef9d8cbdc17fe7cb460dd66e7477ddebc0288743d4ccee443ca559aa4c10cb0bba4092c196f1458f7e8c115b88e922c620e2562bd23bfa9eadf397dbc5590a42f7c602870cab2bdfce818cb06ba69890f1638af1b34fff863c9ca5d7fcdf68e11b00e807e9b63237467f9f842f15e9f4d36063487e774f01b256d43dc310ebd2ab83d0952ae4cdde12197dba9d8cfc19afc4efee9678e5204d277faa1ac37b4134dfa5a5909e188a05f03b744f63bd487f30fbe6b83a7dd716459c4e0161cc92b10097d29782f89556a70b5db3862643d128e07cc937a4423492a63df883b9475b5470e7f800178ef90bbea83ad960484ddd86d135853ea4081ec3745bf4c28a4ab24bb99eb1e87724c63b4b3170a89b4d6c3348e3373010eb72192f6ada046a2b035dbc959e196d4b444a3603ea0b7a1b6a6d953f28d0d7efeae8be7fbfcef76ef0e98cad2aa2aef8b8ddada128bd710ca1c463a77c1047bc9850a9bbfe767a921ef4ef01488fbeb32506f127fb0a8ce78eda4c962725c3d8f4797f9b558dca616d1a4946cf20f6178943c884862f238c3eb774812a15ca759f0eaf2cecc4a897e47401d2ba81f4506cfb1006b22dcfc0e4067849d2b91900b0f537aa336ba5a0ee2485f89c6f21ed482f2dd6b1e9524ca908460f544f39e6aa447f4692e327f03530a7e24609afc02bbc22f1e92e82267d5cd78ede8d9bfdb4551da63998dda67ee4100f60bf0c0f57b2d2ab60df90d8f1ca8cfb472ee183c66f6c5eb8af3cdf6033918b3dcabb31a40c6ed6c51820f3d38231a4946e4f579ae1f630a82defcb59bd073adaee7ce6c023bd44ee1cabeb1fa82695b24782a0f1edd71ba936721ccb18309a47787dab7d5a0f6c380e5a43f3582f1abe942d9f040bd4712f9a217417d1e51e3417110bb6c45f9d029d2243a2d25209c40e4fe05105a136e01155bad0dcdf946c1697c03d2f5a44835c68a98b1227662811b5257e8e6ef49a790dd2870170db137f3d834b5f0031c042125be1ad7c95b2361001a576911add1ee6826ad7a8aaac59c6b69e4ce4f6cde889aa27a83010b343d438b6fd14a2adba3f86510ba159a6112c699209bb0ad63f8', bigint: BigInt('1857111686977555205051772703330307656506832618422827238131050978750856699589964072089237303184346250647364778288292535067996890619661760866918946260866715478596967814760691101915421209606332320886049827280904661203778779538364337595677188155890060811120788328698020675486147217054189274813613035770466760733633277752402679610845185086483999042526715610902235742728839333176453578889728656526861694498669556370889632877391174158101540167473509471477851717391464061451707225509375057638999226148775147378647492442681467478562214510523190069375425435495489938176841600995231829498475037708173324602764915145074066886905117262496786937906063473252953267182146720431219040177725444647172095289455723105859469468641411456810072422604184967020347111244194966024513088870849338123719058396340982079891657653863071080399737449457045408846402718399327842189824849539349225366778809743868839625706560400211748429015460737161617880781239656774314310718081617333096555911432384521270893083752404837801111703368417250959600324851214671243912416932132969018690082093959679609862313905588091350839594613795007078675367071470775923901682654198702940775558975986155478400466575946126632158191436595749719255466182094086966320534494126022387047827396122259166344960709347888168868881764298531036484907873117135885384239085403422059288819854857711577107567365044452393376099116219152809844076325174437152795077220936149275705906522000895193688231666117584266157261675211169452715138198645314934204215027922017032001038999371139959710236120962712491044934614427020682961993402134005867944720894913269092488889295958078832479744518843010617457502092716475608471617828827737873805403425908901398492208221404036282862735445730706005243692169228597647218460669679109583972442541248532278250350765389804054274670318571217156374267988700409340035243421403116809961028157368870454760783030548386269223054738736595840008598315575340717289210442983356525114937869056563676108786234709744180216044421428348148314084804131784068955053898330065122157314142191191167219710994873052895141671964534947396269061465873311240124886386653758516186644637770943519312429823684690345457555467320036591120365066692068008638229961910730428745920675590020626699008163218567813194376397670783520838259600294034165843477670201486068926968217418091271414461032802811861769177281425533773776168074053552685772143561480421665813159418871361274466750096436706159761185194473891611763098941503790405759192681679360900277129660525179314162819845450409946283327058117522862011187645382678196826094958309197134576067598377426085444085123422231824060589720729451559135812933060946081818806053722590646287450400320741696997750922320406228656176274919180112829604308651530834442244143242934122370147295991412414936699094117328100605990283108810241934186127169120140146642059853945766969886819236944832150017761399714372696058368397959221290688112790758907183327009431725056154898212795191355555042194798213365893888277830641886471048129714011095680550250328843740726491939165682842945493579513040703705927405597118652869741996459339390032817042422432749547472805336350153801591417375361749811578373988449553016905362871805263788706852871620438231619091920580254090240006935917140361088924304210651970416856529138696296206102781187640719613587373372600157031908790780688555745851285090610089355483815830939253698737631032300215183275946660053658942803929233936492664366136334212598180029620710504687690234831987762007047433421809230089699244956751177945084685509605559691233624634719797864295270963012899842730979171094576234270104113046086880203358915567475463009702424991048272423274059189621996586781916338485457622606191616471635499367518139715913451590129950211894129518820915725060904361425935059634746061774151362579528429449516871356891592899182799745275497130220167989995834388218577225388823497913541309287009490756990973321132790306854375017144143224001799456642103428625470625408497631087237194864620833693494808695982621137486994322232945872237836167743163321596030592278025264644759260601512465963835486793599522519728397214387034328941375112725026389369726605630531961786426002030196912268103997044908039441812250594683982746317509451972009720356134030659388546922523698046539948072307396918565111550657251464926873862634670485768893551960042221152126756494004345283954269633790689542476495032610169367884109302319497752516804208988160733434274666607720909428708387610434201511421725593161757802636543129309215361186281964537348083824800719300205155260869277171813172019057101206656255946378296555115218940043915575551656368138540367968230813638404341535506660006488555808181217414549108602445485256376283008981878024782224020896256994520956223172501921586311034684224711029341654492386438794189544567864127899736942441959369683324940394059106065658045728468359775069381439681451437264857581119411314289861711261197161385769049483792809494905183558996427132894417081760743038576822617498503715283141504002821495572427946741966623325558867618462757464948913201669208191007791387179437198293155294351907681922776384591680851061355790586703629409395687872756741401730445902638428739773071878685051843632628882058954725213869588786903883180612757329588356528298049283464556760355082294733888742547289703069146511973028561888600965566949614527025681825635103095143459972957300904290133139129508186946089341061827609504992731413695625602185961430501446328250910706203177656694985991432073056949770430589936193788960061654441256832344863940266889508140305112783933232434184233958120647297538402279970405145982259483346078738543750541776083716470606660109441036102254561450554611124047950837954616001536553143655631591305470399803618540840593453626711364214213427384661578544504288198347097177402537273558499593769094731145511000234869016147858350693608924287882418212701050380925964393391563011896575701783126971596647940946732810415040326366457407847697279357708065250638968560329043942608797124386780871566473494237295531776826610589032201408227812061825631014762086223804837235869369267804601810463367706211450490285326502680773042742985685298028668463395202220117392893153087727041798565887334606443270976746827316162575354346928828442249500420607379228098139058134025287579999395989572913672214866207546469304937472828489167275403957213427644220397065259391929138234121771433057012403393592975101248812940645920908054392199076730225336467241189790507503084598575266831069100706625382891240002793289007417248566069419040924695958138576021576755971371894145318918841789835079937414385120658054094564812680215561753664134667641419561504204773016625790296586664754958581286054275272656355915450547120441926764719164104574700339276377180410303270815214552641022482261857208307298773897241606370480196841928547561101175683734196804780763689436441193078334540093992819545794168181476350581679785370386809427673535700899906163216495236633809374092021595398622074248193502119491627724592478675321068725203451011623372294839400030069147177387161313931657309202998027908580686254131324005922223414310798035738847044237283403435522665437983506960613517007245346711937440284743436205770955719256237667574873823219383686207576942088144849318096838204276221442523898468025073233158298880308812507130321669806982756453219551934498576322341139073528835370081147569710592770677511716598692016196707054648542736951961166490908081227986603406670385200600067874703705912921500438876925134171645598237900250394263391315075892852633863046150255875751133517342854159768538818773158487497364481430920305601475077128765244173353794980990883523403603970791198062786974858592658665243199482399765993793393469263106408335053074416996163436568235849229650527923896043000530915085029927052237261655321034518917982130693254628988418585590884572597893266647619982005642402197528314306967699876954801717238828118235142718026376536012470434996025114593497010864599763001493796894074784309766485462894638547353736204736061273214259441787854954506544059854931992386159672276199650971883597208095625727612539524221266594169440405755645172349120968542796435039217714493409148120564371128364867057219490100843259428171712594007047687710200060013072984350823778084774087193322214952068484879414950956349051293271039940765310386503441908721775350864140484325330974443647295360828161639526428371232795349368000937756400534341449698772594694119243689998192381007559927540317149737185913780731342278813769468300977808560113554742613100806639712518072834552967461186334011647431623983253057006527053849058906651886838384822125439167879693842822651924026652279649621644648763345721243038167776549162907636089929452324345243253838917130669924810610399907812747384133640739546788460729899755741337188578342693265427620277518477129981161780256470172579386364407932487926081224791823560796163332063995857251607592778745998759782502105632921510592287587007432918105094096048167582474594944642953917183957284244151562746168988669931259614217742257390598696797934988350480177251715684176477664881740321564962154949259570516557518163499555267465370734886331765902949651187039626973056559987417017739700583205416411376974065166670080597180269470334808463199777113611049047032018532014536324430365073094551350346355724839938689279928071975407686462011951050447117473664790601107226775816676789694457306799393542082562435511460546790136589061635110640530046289208676116364849966957853454883670964967250851747816060338030069894147824206544957970406208156609436626059118168495253836613478011591769890447529272756312393234710562652320746899843923739869429486680552391960221643871903720394387721065967074640170691925552488834732337637950716838913339341050090487237779494003572134532414525733195085518867260068833712476904709737453182820899419272317299070554825321138980105924550448209039093958024953223400299251610703869502100000148756049596123728157322332729374312621177684223910964197805315241217854943221936183069664500793707575196129923049560381495261406642383335661838752629064830281358524700489258622533199427114190065413707598855276997244660987347865910253282277222685071801804306556378332592228878637228780944423916554777070618153544945236218517066380206016389170472276489843563487476024482296590899940001115048935933821472103353597866742288827750604999898312668925605495963483125780534026351915270185390973317503553307204399966778347319857806469492564002869433735014551761841384311476974964782062917474730810002596556744629973515527001924127947199926415894848348875457109481879340000699970395827583263643221127955417955299711013550679087013703618852530872041847746804804026803665724350315684015718222517408185786075631139420487684141870937192839669577227276327699858814592921589590189107540993994652905165445083185913772825855453163084526248470325120159324294814822227341356625590669935587536288152097413912566609476704961169381156988085910867575086281494645649214347207070055439850106962494508144406556910825110229201185278559573609084227876876233427749772538920696096799514620651913037209736945969166883071875345664489058723260628150153219957283713613977774354152417424724981802391036030013437104392094764849953647633559088320350702436721063890596222094597147507862099779014167089041496796041067614110889521363865541821482846785594542431224027847403918484891252633810779617308240526851104238032957862081261289257010144501288036724748237316357511087711987308390106387691943308801046475306090040285617916967635188346843110235559545513437506445173981944393507522930445585653968177095133956910034259143777558091624380513837136522578307410687878902986094804579775493292808151755797497281757418388564338852492657121598375055415572561204850638017970194892469622321687618930894118239830333929241059070459668135246038956132335434509928013280484967837884871463521699497600823890253212481297680349798679307018350089176406400679475969350464912523395289292788032307945571733154402182756466919540840466363183829299936639606589834499568509079020900430275102812354117592264388892692791184001370783845003203169355334405690152873998100998389063750708936469784835600191806489729402042109252360678420289333735429020533062453467911593105559733871096789177042583967357045305280853211458692054262043283971935743564302619750989354794878815781041508464258647190825202206963454532457876234704491013728029842891845429878050651730075616797049130771882785649022461011758238644594874731401321208360753507484594774980214728821300853952053450216581577263688951206795091440984730057484238674326525423672799292963364644928651663713543630452286016604026903770721131794031827689122550777535549132270482937883676554769233345147783032480052886236362406431019591202337500688099896546933372579314450555875728446923771188220581449360411448399080702329464592069546305075668635025286134847737671024664116599810238615229277150329314413138371479346202211300629177653787193652840019514928003342098908713970363542002161758334074738940150982147009817274188739375799536609533984829843731045684431950173620509249276083024199334461484710673129759819878329168424353503322211242982029779196595112528788310052146174106607137818367353276475948009183640714738022556490707610958745137896486171597994392165955449977250800370078331592707192121511033743022562733376916462878333575092083439024213268332649200684072706536287433957235940084890236143796275336676735567026660455816660218919628438992677141391499244977437241863415831653838333753132503152507362785573632464958962538813658222288595175082464484176084252945791265163330822672312485804128235242857259394761852034194490501105618442014714842343662157872238679013350640119699054563014588786641646992917721959574298127772357219135355041267000085374752140781584709883445869278385338633017245663021429814417707258196764167217684169551285116817925808988855658893156503271479231956234369659124637589103886228424371380208928659275177882288292525445841161744364728693212262512873096324440346658178959780959770094730438058233208633537999681620373059338044124403508803824001103711666270469640599660498211914741370454690998766755367957252554518851444948363120309360978288882348808318947587014241300022477623347710022720941890996963985141589386516096110757422327059760078648387410772657451749983544498073662002607850210370639337496366457578863917114993184087379777562609129800018173546846034077858877227657720481631435580407817476060640997741320055432597711965750737592834477046932092290278462803632318710900284455428451535549547204193836813306049444326152502900951206194304442191852029146857622691703880575187906843054509381466988441084396222005407187901857262908388322998595561823539148812267623466347517788879518156198034514816831217421358763616642968883244873618961469556086006958578437876347406650067676512144378152142127811012579477781761857506441126628589841373804002048556523912442062483731776526710883462295008456988573153868430366166821088900084630421384845119581678706329914922714643429301621960067292452303291689353033812923158480656572086801364967530524272277941057010707066762881128552895683292312383467619253528573051868364673784486473204647592803734994730393811233850864386837974729123876929855258067625514534572485385973733815390255672750846744211728811678891046334135436516906749351382878817421855926135789473013086443110801547312225388285715350051258790466376107278548330279958911757348859057162823358623869584145417961180614508803533159683977704015214037059511060084476853293253074498095953713976526673003613190288700880541647865137161594358838088208384635140323191367776279078576877058353299136197940171528789873636341644287269680197189557409108272964482130934771408012474446371808747293548018319857792101879201302353617295580377561961548193501319847772474696909747243391381370632233175630412756342546855114107607078720669698816542061053615958804899610533897511909541412701013424507923833608280936375141752860680355926930513845170297473682395587685235299350243288862116891536012598239668474840711704542930948209556423591662334607990634467436573355963904444287247603934409267438121684011121663231839829319539790129622811523779024131166367097352702305094203924136379824027358122385616991449693780281836306069210164555085963647746134167587798919458497009018152343178968519035317513886702723629249772595701722014422258502099181502627337439505863760144845451194066627941745605531287664527644303704837274296925261064082230183810659913878799955792258723308472668722647114309022632437557725021959918590379857098100785894272478687826086404097295404723402006525116061301000957530363735461343981957615687960073258087261498834601474165675014315441919762279692151215658788968125839917741883813864895345753137527281361505360771253556996294670331233632883590620336697569597383828399816315918373466000470818298255886225044317343919582793577578892507662514385253001868309028259405985858081732667339107033105948747369846945242143472098584436348482068550778845093783888243621503515857895994158988143748186196383534627317704219613531255116609881496277519856193277888144517455342951391850925866802803677447591536702769797690883853836075032498526932511655095978381225240139326154187227908404697778258519757294967429151784699723734737956277782929431893514924539559027217267695838602377019972309199575085348082309055362278670429178507744985837206669214334005053317698391147478279829837709544546476232801052251684735808650284629000059577853245028489974827978313687345388885536231405360481407570148964372940574808287505451406026348240676266260536797389838314880340162530955852826672340133242824535181243991668680204937331331355711087308137102902539165979417596135389218754672360179806682782449202257746705428416485475450795976688396756119103365678257544676066007165265306352210849062249310429608601362370811341929322852120111706092100901824913869682080238688287540514042213029276710434964479802205692989588535826710062145753507790029101885843443320688262685167723796295854142980690608010129637457489775025286597759829516387193867756540324713701869928396561552322134197583981117043309513194950327204711735028717698427581611937112097795326382808938847507027881861908299573446176667226981132650760533074819797949920362104362482584981149394507976964912568086742515461418151636198658142114973957301437842128114158517957360717128020740164308861318444523985293645978497153792093469914400408399851364501578583223996538791274555329130761362594871935613380914614136786464732489403073050713179103350354043528477993047344620797047035250112026765976889704277027769272020712648706943303400625370369330168955861351218115288687791985401216097031628573010668622066838588183974143133331082687997303117065488261032556591011311393486325121543499315468071698440329705887036825885662354567760241469855896329714869909593755558454416149020964371962305400555919825871555890703560078179938424454925940843365598420102582955024807493053939102839180329517152232052239189253298511938521987052874901428925927318439186236710349274601134998621961189035327097219982340295996198288939794434667794275605074335869034005863709864083141245546237833641323202135269996124233830124959369126651249520613102530845620189834876518700658148957529849603926003483508486490116167092554393530692860608758407432688155502776672401505310791137271114891718915787365529435260025353515391369475496860176596906372142607305422554892381123667341568395734869341937161602396952758245589989732070399894142179114434432749547716310073900604293472990470613103392976500019576629023078976589321238637829824754233095761693121941818296425047311597496329011749967075100326422079711661308697000486364917596440701965944502609770134034612369693676468040832791855446843845359791698403973537917902230907407424282783206251427070297954696515441156758477693068353832878961544065871283992646532142589167937289503459815292975359840360086008247156412170924514737320621923886151343925648188685042025979306866740533138751055471777481989993916280208335950533753501161551969058932339274339990809586221480474801223660966286655409945694793940936088576267442337680389205010958318124072791133660026786901529675563386837258061534481673494074881709182314411741486480534899981010700478778264927449403943977652150270248569715680037272943210952754670397018404305448037227756420195856338926850035001182290698959919518758248023158406308324833258469339817915902131367888853211101877191030099799351524031504602525970116976201920361382140181203570758067698753738862621886153418310938431974475605601080453362906463781291708636212627988829600411422608693706126667218590907913766084585435096487549338750939208330063311842487579847540829210668579060772493853380766090571268935103887800302278775158109842389533300998712963737206814161667392932461610331662835676357211655140841801352512845866628669900348474928741769674834471742038591132801860610469876177873790016109033434469415520139962071283039695350825757653110901397934045563397153925308184333416019176453081928593336174566484276974612168912955844141573128513995775901546687526803871726045580983011168233614394017622490191097540694987986890957230422420096983656401328567232292864026391546854188826879307645804668730451893640914236311573947414521519145347493003379677730902598355321751566000918254482778446693581185590179686211497089400229609316361603687413260847432801872732868849174964924280248957207373915235506268123738340521778288932079864888132828428100286894904735806728054059942378241282232836227056117421918568545920408284580123270068163694185090881379394641350696167687804493163949423960466674397641962710048168225822340310825435892894560935938220466316203713384644334630162369801212695289722630559249482468265086130002891488674814798390378826220763498523580700533872409469479695466985971611810145950145042752129032290904852839838555841674112676885638296627031026552941614824455710230628078870651722732487740818252473967023264151883330071750732329846428257336126203804681716743210519366380460051559325751407861755107366975090786335305812656731328339176190804871380490255745480598061879031263008118813729336385338093817976136635574272438007060630922112576626755227332545212226184498364676260903258338703349104093487584327195266747762373146563930710194746848578625317492022753120681955263026185991321980675068151334079346973124771527361089075615864166748857188263686891116603452709017997196156411393771827744896252014679158862835631048331690337856318343180930399010246491607947528720260488418152513136297051371675363775005122974908109920443715695777258667136692726908526325519092767361843787501836592015137628180031186661888914716173778809064383126221144891080526266097508943860309707782190759750327849331165090140840908137061411910726656108657296069699926217072857548916815111869061518333646855459057774129913057913340643185161006373699150678526251758245103371609589517467233835806315300745628981786341500158292944462578535239819944743242082202899728788206200947540785812255257551454997027094035728059919735019821024182123542502430702609867087217206309849294399117358003498851697667112990452869992554044587164992553883975079675331266818337562454489817093461014672163868044812258936305619028894348674145979706189726893235453145693341348729259442069453952000986613452216520960583869342000305674103420880720063690457213688960298338364483183930194481781261525310856136081222012120368092746422217615048219180730094374354715490186746425399168551097674910170566438971186959075220892901044371537711043541091544638635298645805548721561218524867043512553912211408100386769640894397163615149131304065177182237372154730378975940366479921836162644958904608013599960129404262751905601265652674383473639587917190344554419356971690010532569351310707427256312372767691408614795338618808505604541247474037209007249997454189721785291780830447687922107426216109510450719490801872031408496845297683401751047839994433066191921297159710333775044535423971831905212427137264469221130250250642884772135393628252392252394123011913258426767466155915171480113522627682871449941871564023582981765108569691621029890940215449668363257963814071196914714482379810986153328204797550137082397841972483772868530194343222604521139862018508461501247756972080323669382340726664094521079717495670078444839119962804052776811878055379338558260436985842795184488540743052334520932303813275839084184475914604300963788090775116839810987664300704516628200258606208014988056187299134917176335831555416831788728118226511040791256898274698493000070114055284346565287167623172517885155561144995508509905048544175236535686530573596999843277408394900092759931523506311841496375550238966190820843405177564886465021276984839338564055941174727097263729585985137802559127209438250058807840149366976568590036530707591572003505544967655703085098571794677732168779882311086200331265016'), + base64: 'x3MZv86YdZwhzsfmWF12UgIVWK0mYp7rZNEL0LFcHOner0W12nMJ/bK2IXacv7hLaDMOq2uKXKbz3Ty+2NfmxjxKsqZk1cn9BWv+P3JccW1nhy7fau6jolIsaDCehSqp9pT1U9hYGrw/f6sPWL5qKt+hzboOgbCQ3VVJ4ZInWHGBmwrOIbMq6Pd2O49lu+ub7OT4rnJM7jQwmcmaSAiXOIKrmDEK0AX+iUCpb6saQ2Qw92b8va0AMXSwuUliuigyz8Epo+Km0vdfKg/DCRy+OlXbZ2NXoEmisu4MHm/5kV/wV/zrNxkXgmU0UzZYKDSDIvctYvCl8PYz8mvk0pjcwH0oFeynLC6bAxMFn8Fwp4d3AFWzRwz3KE77LjpAHEaUG02kzU9YR33hix+pfGdBXL4bEupOZDdM79gSNRbo2Kw9plYTZKe8fH6btstQJIpOaxCNlVwXYbnK6X4HgQQV/B+NFJ1ZRnntpbQnyF7isnTeEoJx3Ii7UcvIp3Vz9VOQOYCx4m9VAsruPVL1Rk593k2FKFhErHoWLYNQ6Ikz2w3Goni0o1GEjnBMvmGbXnz0xpyx2bn7mycELWlf/3mx41aaMQMLljIhopbSwricznCIG+JFFQmVCPZ34EfAYuFFYhafYy8c4KC88ZmHZyJ7bNZTnjQfRNOVGDst4+zx3AYZE4az1rc3poaapzdsnK+BjIwn1EVVpyFJ+iHDpbaN5k9ki+sL2HEuhNIdHNL4uRA9sOVfWYIK7iDmVZEmTZK6diaQcg0quP2t9i1a+/706YY+ZgknEKD2WzxR29PYUOxKc+3BhfoCYwExkqd0Jtw99YGZrXZlfbH/bSP9Ayusq4LoGLMueEdjWvq2fdeHdDn44Dz3SCroKH+EEjeKBQb1+4o8frNEQi46XZdmvBZiNfIayjclQlN8ex621nHJuKffCzEMdvnDzBOkHnnozMn06BJ1kZue0Z1mQUWVEU0a1buzOu1Ao7WEFBR3bUnO29DzU/91NEcCctW7lCSqJsb1IH1f6lJbu/+m4GryiYburg4FUs6gMxsmz4kK+vyznFEFXoJ7ukKMfLSdVS/dp/zL4WtyATbzGnk/Vwa9SA/43O/Ce4N+dUxHkfjGTZP5b7I8p1y0xYk9pMj7SOrTTigH8rkYDnE/cvzi1Z848klD1OioSvNBnSyiFYnhA5QdVrMIe4rAHhlM1fHfUeyS5OLK2zh29V6uSezWLDeHTVbI3XVS+zZXtn7GuauCSkuySpp6ahmJPYN1dUNcHf6ZBQfGuix1HlrI7zCj2nRELDKHjvrfcHWysWNgyYmZ7/KonxbQ/YYTPAj/YAEIIJXvJh6bvNSSYGt8I2fIUleO7uMQdH/zfg13Gz46CWV4Cv5WyBOM8sRRttpGa1oad8Pz0qOeGKhsWJp6GH6ZxMgrsGdkid8wqHAczge7ZLdNreen6cCM2B5fU3yzM6TdE0SaOQ4bJW+DYVsaHeRo/gSo2ZyZnchLA4/EejkjDxOoqR70euc8lff1R3nvkVzR/nS1qtZ90TZD959OMtZgQSRwjBXfDRkmaO9/GDWoAaXJRplI945RIcyG8jVossqyAxs0U0vyqb94QUmKqeXLcOaAzFE+T2fdMbsASslbsPEVnefXHjTgWDYHruKsi2+iO8q0a6zCp/iUagpnXfaFVDONJ+039Cyx3Mm/MVlzrMpcuidIrf+lw+eQMkOh/6R5tTEaib/hFcUdL7hI9xdGqIZ+fYDKtZzejDZT9VUdPKWkqGxrADHj47vSnKJgsIBxSS2OcsUxe0fTkvDA+YB5nV6LX6yn5fvnED6TZJ9DSKtKnYt8boVBnG4JN/VetFNWls0G/AVkm0q/3TjxzkmV99qRLt4dL/zOxwckms3FjompUopTnOkYdjbU6ax3jV1W2ZA2I/7TJvnm2a6dNUhT+j2xZjCfDj1hJKtTmEkyeGAmQFmz/swllNuOXqJBB8EtywbPjICiA6BTI5idkLFJJoNIyiAcgb4VR/85N1y1JZIQPL2KOHMDFUxQNTo5H4Uf6QtDCY3CN64T/f8jO1D/HHeUMtx45/x+chQL5FyrPWCYkOLcczYsH+EmHqXrCRzDVtR3NE5fWsxPDINl8tVlN2yVEFr9tRfTMQfzuzG6c1hWmQimimHNzYQAoCUmNSo1w2qUIU6Pe6nBw93zpjzjbfDCToa9nRTArvDDYIY3RtX+g775KdB4mB60XXIvl1HusozY5e8QoXOUlf+aAMW4UNgMEDHFD9SJ/Tac2MzfkvTh6eYCwHQcujYvpPBASzN62T7a/IsPBIKVp+qp8Nqt/2C4YlpjU4RbngO/GMgz0VllctcLC/bVXr9fStMeGRXLGOFIrmfCAvQwlaIwSmCBRHIo13xQkHiZe7m/SoUvTWvW4gQL4+A47SLxsw6Hnda8vDDqoi/BMndH7IYADDBb0d5+7De4i/ll1kgOVMqeANOzOA3an3gsi07z26E2sAN4/RXEMPci2Ezu48jUhMrHKl5Yo9s04X8yRD3yc2P29Dm8zByk2l4rns7sRW8rW5o8e8u7yaqaG9B+90O/aIIiqFES5D+8ndmYxUbfaoiULF1BIwb5wYVysUCdzskVEf1I5EJuCs/PJS7A14sDx1oJTjAGW8oqgR2EINukteM64QM55xQQVs5YyYqOxqfiTdOA3tO/5EIqfJLcY/aA+iXZtJjO2dUg7VPpUNmLHrei/V5flQ1MBeYJ4uyok9kpBZFJvKfDc13ZGyMb1SSH7x0PDe8BwMQI5qt+Pc3+eL6bKwctihJy/0IKHOeOaPT2YSAZqJOoevEKRuo1xwDjyLuZtEoIH7BNeN7/66Dd6lRKONVGMBN6z8nQsEitU4ZOM7DmNSODh9XigkjpaC7DBpp6JQMzVJB5VZYC0WMvi+9PQf4jorax2yh8joUqdgLP59i9/hd7NmfAAv5UJDFC2GaBF6QTN0o4OMVYZ8mjs613EVySRdWfPqGTsZVS6497NWp1TJT6+Ug5WKfSY1T89jP3NbaaKQfz7REcwNQXdaPfLSU0v9pW8SNG+b9iw8F4Ww9+Q99wRiJa4/ytelUMc0uHKBdh1zsukReuSbYAw9a3g6c3u74tZck1kw/fufE4o5OgrfbH+SCBjfgK/5xwtlb+HLCiPK2rIQE5hmt9TiWHBzXTW9EZH41huiPiSggy0+VbiIadfaTTZZf3iMMebd5hiGDC4kOWvG8P0sk94cHKhaLUlTWb4aBcN0nJQzv/CZk777AxqawbuoDVIBRsnxzNl6huBLGDfxWpqfVXfOnK3hzqXBNJWdkWtN+G9fHzXdYehI6zLxaicpdKZ1nnw/9Dgh7fwjCpFR32E2hhJ+hWFdCED4HgXkYxaZgvgtuaWxcS7fltDQu9DAUFVNQkZyJjrXAwb9hLR24puVYXluKQP8oxNBzxOQYGGKHxmvvR2JKFMnwmMeAaAxSHN0shpv9VQlbH/OSzpuoAc3TvWlNTnE7ZopLY2JMrgfzqFk9Nl9K8v3wsoDnQKhEyXG7DUtPA9iJ+WhfO5Wcimu25m2a6FGxDLs6qvsLWUTeJLoXGeRGvtQdobqf1P0lVuX591z8iXxTJe77AuxysN3Yv7HDnOFfMi5PW0tTDfdoH2vUDzi6tbCL4EpatXg9RW61nVgyjasR7+J20A0PLrrNU9BwRhQ/tBnK9AZKL6KPc6nM7hPuWk6ZR5gEUOX50n+SR1BnsVKXOd4NnvFwTWDAORNt4VXi87iTtxGF+H0B6T5739MQYPEC6nBW2uK5ky3bvsVd9omsMfZ6nqK3AIeuft7JHpHa1xsb1pWPdwc/QfDXmp6XJxEO5afVvolT8teNKuCiIeFh8LLnPIZRCwQs2YUPgKkpdInXknng8d/1t+ibsSfORiDve2KPYGKmYITtjKhoEnK8SOR0puPmzlPq1XbXe2j5Ay9x0Yc13GZdUKLBFUgwUyGZTRrtbubHrenP1F+5rYMkJB7Xo0gQC2iTexbqeBYaBNdpjbRzB17AR7NvAOg38izNl8s5E8ABxzlp7yp71/fiAvw7zPY4jA2ZxmLRVmvujxfRT6jA7QhCOsmNcoWIng9ZdBHqyYKJhPbpO76u6QAq3sQebK7mjfCpuNPQmEkpcCNo3wZ/+PHkUxLT9XR9dluIRuJDygxP/w7aFe32gPO6ujXS9Th/ljv8VZooK1pFbvBvjQROvtthR6GqKoq5Hw9e/QR3bmirFLuSHflRetHmWhN9D/lit6/Q3ZwOXB5bV7GO43Kb5qskLXmXRTS8BH21HQkNeRzNqiLJlR0MNzwjIi1WfEqQLWeOSASjN1cHl8COqIdTbRvPTT55eLq/4qGgEeGzZxQapUwPyJzSZ5crlJleiMF2k3rtj00f8peW6eHde/cLPZVzLceBHToJ2SJQ/uduWNRPhmI5y78/nTDKPSwFFlANHOQS2FJZwB+DB6jVR03KcUAXT+aU1RfIIiOe1RhMQf9HUdr0C+Ca7Rv5J9yqRQTnz12qau2L9qRvOCpGUt4NQyh/sPXNFJEQdlMENv/3rGuvjh5KXANdsoEawwjtenS5ZjQbM4d/Zeq5hWhfr7md7JQIg/3nghdSqMOAhgPT39TzWKiFyTaKc8NM0Ff7nvHP+LEYPXw26/QhOKCnvFPnZlKYiaG0UdXxna+MZoGiKIIHkUP54bzczt0yTe/DEMfp3i83ggmYsghsYBM7QHPvmSgfrD3qkDezWKyzg4241srRroAcsUsZsB5/XThoHDAklc/b/aUpXKUWvpTY8Jch06ZprF18wfN+daA25ygIPtC8lfCuEX61FVcrME5IxR0qO6XC/HfNif/oUGEF4XdmvabJquXGjvr5RMr3kA1AujFFaEWtC4Kdz+TLs3JvWm4H4KV25BnhkKGviGKN0DdapkiSbgYugD1Plun9sjo8aKweEVRP5eeZsXbDmtA82GAKCcL2s3W6B8wMEaXRmIFeWeU1xOlpZWp1mnPOhENYMN3fIxWJIX+XCltNih5JOht/OOSKdq/Y98ya4wJkcNWuo75YBs+ETqlQ9LpCh7T7GDt3WNMdafZFwAwBs+m6v7jek67swyR4gVrwNfZt44nIcINA3Rxe1oQF+CyScKpyZiElrupnEKTCywGviqjDKbTJ3cMdWForL4tjtQaStjybj/tBINuNBSyBocDhNEcvPvv39gGJdieZgurfEF/qA5VPuZlk4Ia/SSeHbIiZhIk1P1gNKiTYlNtwmy0nC1CT9ifaoSfYhmx+ca22Ek/z/oY/JqvPEFESYrbCIi/5GFCdnE4smSjHJQmT9sQvu8+9okwzRlFoiVqZuDih1mZUcakxrDCzWEhavw333YSf4NpCHi4bQoRpodNwX2V0HcOys5fOlXQsqKu3qTz9uJiYO1MFH0sPGQS5IFCxxfzceD5+ofhj6I0WQiwQ/X8I0Y0T1qZTGyqcGXyULw/SOsdbo31gZkE/mVjee68xfCzYtFDxziLgjhK/JFOrcD/GytXKuAKr5DAt3eXBqFsJG7oCGpma618kU2PjXvYnNYek3rhzDN8cdxpqp6VGlE9RbjT0aEAboGx2zGMjw+J6lbD2qcZUW0fC6lGbJ1Ero0v1EG4Eh6F+XkMLxtuKrP/84mpOnqJzBr4j8jCsKjPeDFjDZ/D8mDqae85fVtA4WqhyPEkQ8y9+Z0xaT29otb5qecP0fp7ORqDkSbibmAaho1CXdc1t+xKKPq/c4yFyalWM1LNUP/nKvPzZbiync4lBD6zWmuyjch5Wcp8/ObnWRVAkpvCsmP6SeMAMZgBJtmAcG5qR8ZHcwkHjXGzWfxz785+Oy1ZhTnQyWNjpPwHL74ojJZnR1RHg06Jx3m7SZHtC3Csc0j6PZnhWDrQtCvhYmjH76TB7Komc7waj70FkMIumDRXLG+tnBGwPAmjzGAsS6HgXFj9Y8eMSgtoHP8NkQk7N4k2RLoGKr3yUbKLWdhTPLKhpLcVzBADcK8qP6wylM9k16Ms97qW40rFpbh6ZDKD9kXqJCQpb1Hp8oXA+Qmx8r3VAO8p7lXiue2nbjPv3a8GqwV/QGlRRTHLwAEsVG9kMYi9S7DvfSsYzPP27QWEuB9pfFmlBOMgnBJaTr3UkCGzH4oBcxvPT4mLXb/x1kWpZIT13K+nOiBpxLygkuL1aOlucZ5dlD6R+sSAeeb1agZT3cPxYG7Dqk+CL1A2j8r8VU1BdBzSCdnbE/A9pRkv9BqXJjVKYswUGJ+ElJRLymmYmEnt34nBt2IR4Gk32GrGxiR850HlEiYoiR8GmzZxWIkdqKN0QBX1eVUhofQ9fNvj3GKyopYW8XbY7AHLxYmj57+u7RKECbN0ErhyHX6cWQqfbVV4VQ2S41h5M8xA5BbHihbg5EzgCjGVZTch+OUgIV7VLHv905bNyQUbZeSX8g6yt9emryHUNZjT8UF1qb4NsQ2UGt5X/+ZA/vfvxwmY6sUdkoHaZjR5Lb4APcBHjWdGtsmokCFySpiOq/Md2hm5496GQfl9oeGN3kM7Yi05uZVylBYPaxSG5AQqLGWuLfYGL/F2s1Nnjt7VUY5VwEa/VMo/zMC5Vj0HzviyzgV8gYDe1IDUFQ0kubtlyjUMbApBxXk7JsTD0lZT6Jdy5wxCaJ946cDFdTvm1Yy2NIY4OqUOsjGv6PS4IStwMDtHaUMEWDjW60YfDcN5ogrz/F8RRB8SC/wHLXa2AEr+h3JQypMWaE5LYNqPTk+woV/nP7YEtL3BhmvqsM/Deq6owlk1KYhuZ8E+D2bowB3kLtr0iHMLSUUfcqf8RG4VxFR5fuoWIXV/uTh6Ndk23Hy73ZMgRgxG6VqR4mZcC8/r9fkKbRlaGLUZnidHx6oeQ4w7q8MkO/Updz1H1kU0MeAx99YX69Jd0TjnwKAhd4A9suR2aZuLrPpapDw2ikJI/LudMMgv/W+oDX1U5fKaGnxDfAS9R+Z3SpIaC5g+u0+M5Fui+1OixX+kEt+niri7i6AyxnG0S0GgNzh4axyLCo1Fm6yw8jWizci7nGEVGlz+vwqg0fyh7rt7s8n/tqWxc872f3rDseej8uFX6qXc7RiA8SYkY6zmEfR8L0XSkcjAmewCiNE/8qnkgi8/rNJvOm1CC/prIFouocO81TDVnG7e40k2PBBfDBzRAw2ps5Kj3UmcoSdRAwIz/DILGR13ZOYB6Dqugcu8qJtcvjDvB3S5x3gF8enpbADB0aRzC1gPFOrOu0pWKtLlxi4t6hJsfrmTl1vPsB9bjWCqsiGWLs6XDDTTKt21TIiCsba7WWMqMdGpQ4Wf/npzsC/giglcyYus4nlaeR4yf9XU8qdklG7SiMNOrxgeesn8FcTk5CNyyvpqB4jauHxjZNJ5ea3N3EzsuxUmVVOi31TF4lYrDv2qq//UMUe8VAGfWWh+qNCNa0uVjYy+lBwMcSV7dc0P92nhjcVjT1xTG3tfGc6qzC9xXgvFI6WczcWU8STwiA7Uh7sC1Q/l8xOjzxyvalpQfMNSv8hkVoGUt2rJSK/EgEh4/2zRIfkhzP5k0COeIcPE3p6r733tVXitySnSqivo9/4sThUjbMe7UeoD5GQKP+vytO5mcjC0L0LaGqsPH75+zFC9wtJuODY1SzRcbzclOGL9HfHEmJ5JgBtYBaOyzp474v/c+QH+qmBUlx6S3cMmm3jBOdmYLlIVzkBTOaSQqNqSCdjjTGuWYL2hHmkXUfSxEZ3n05ceQemGXv7Mm6tlv/tOcguCqBNohObtydEvNQrgaxdKX5ZQyh2cjMpC1LCutTqSlXDweXwo1TXgYuGOhlxSEnqYt00Bw27rx/8jZ/O4tXu3svKvguwVgth/E35tC2RUAWzdeOi7ESkyE2rf0vwtHTAJgttgT3ZPND/Q2QL5uuvtDS+F225u1L1mIGQLLX7un2Wb3lLu7GOMNo2Dk4kl21LqjQHxZHACh2pbXG3A3awuSBVA5EJZFh9XB44W4FYQ3Qmi6yVTWPozv8bXeafBAMSAYtkV2u97tZgPBOZHNfZus70ivKZy1qjo2AYdYLp2enDiT2Bo9QA0OSA/KglkVcjM+q2qWyl4GG4Yxuc6MjaOlKr9rLGl+RCFfyIvipD+OH07GQdrMgiQ9m1eSbMbcIZit/DUfF7PA7JgnLXpTkwuwILBNTEFyQl3HM+FqHJjFhPKQQU7b6TpbG3J9fNmb/52wY07lqu/3qxyYgJ7miC4CNAeC0cC9Jd59mCQ2ibzcwh5KHL1yDirFDPY6+jJO3RZ5SCuOCvQMiqjkr8OsLR7PoYHPPHmEqbtaGH0fyLRytzUJJ1fel/OKmssDk6QR7or53YTU7qFJLLzX7D4ZpjI+broR7szIR76sqDMhYOX7Vxw2Zf9dXcFx5pyPyiKpm3uE2ys8RVgjrtU/fi+env+HwTzMAseXL2ru+gIwmzFUIA9CzI9+s87o4fSZpPRuptUuIWIIzIpsXlqDhwanIP/atXxZ7ILc8hkeNL2DZoiObFLBY7/oh/TiruEFT9C+rxfDtXYhaAcqWLkJFbrHsX3plqEctONckjfil9nUoMeglKhh70iKVeri9qYsbhvZbiPPRp7+McqbP0/6KdLDyElNvgWu3TIhSFyY6V9gtnMD9AXCmGr6R1L4JyXjCrsO6iapCxvqRK9CdxexlcUu8G7KFt+5x39MwNhdu+VLDknwcjrYwsbAQR5sDv1yuKqXCP+K6ExzgyH72GRJ8TNKSonq4VaU/bfXvBJlX3cUoRKiOnCypc1Wul6Zryajf05CzEOYeGqp/gTcJwUHv2LR10qcyVJcsroGgvNHtWROOzJl9qfbqZBnbgyBCSP/cYfFM4319Q+1pDnKvXIYde+wG+ktIR4y2NovC09D8+nifmaMDfOLwXqpTzME+zVZWTODj6S1vfOtUIx1urZwyHUTvGTlXB9zJjrev92BBys9cCVV1ZnR4OaqitOSXb7WxuIlKO7QVj4aYDYZgRIYboeSBir95h542pkjo/em+xXwzW5q19/yfyLqAP6a3pEVSpkixOfrxVAiXJsW1iPvMXRc3grl9XLaEzYy6MUVVOPiaUdm/ecpjdvg4PwvTtjpAJFqjYIBGYvG5b16dxr/G18FWOW817NYR6Ea+KyKh6J6zjDgkeeRrhoCamJS2zBb+LfI9bc2VZK5Qzu9Y3ba0/X0889zWnncvJzSYBpbtU0PGP6kzZAJe3uumbXY0h8Ut2tJOHwVyn2Njm1aiEJarQV0weADDJpSPnaHf2pNWrkQJxiaOY/2YOlaN3Par8g9+DALZ+aPhAmI1Fxnj84rzJlzH/0Hop021X0nlvmLBI9Ani5oup4szShQZ8bpwXR/Zo4llBy0CKmi7nmWsp57F/PjKQf/0UKzIm/eKvwZqYM7mPqWotlyxtwcdlmLsfphXOZNvTmz7Xq0WYzrv7IaavG8cN1N1eDbvR6hkG0qi2Iu8vo6Bvf5sTAWLkLNOPK9RTMrGNlDJzkoE5J/W4ls8YLN1zxdvzuZgXNfqGo81C5tM1xREGUGHiZ6xxEW41FCNfdqzwC+n3mymyeWOr9tA4p329gwoYu1RbD6UOJT4mMsaqBOxYdoycXTxeuwpAfqHX8LFXkzq2Q/z5xiNAXdTw+Mtv9mz9A/lgMZOiHdw5n1nAkjmtEXH94B+sOI80AssHybgglQGZzI/zSrvwHkmuJXAEvSAhMCy1aWSOUA3MHncCGP/2rUtzHpL36ymKRWrxhy3kKEUKecVoc9tJPtzW6dPA6Kg/1LtFknKr4vxL6yXgcUuf3SV6zodtfvKL/hdjYxCzSw9bwYweIZj6vGc9mkQpLE6f08PDugrC1VRaPVIZwKBkoF10MdBbv6nmtV2q9Ik6wMEKzSpAyYAM1P8UivxSeLhtp9spM3dmjO0wmhSgbRa4PcwvzUGpCOMVXgpTKtcgftJCD48en6lO+WaMUwdldYZJX4/rtwFjK3BJq3S5UdL8dGn4dlOIwpb6JaRFR5sWd9PtgSxPpAl7/JoRwuwLn9j4HAZ/FR+wBtctk4t0TfjP7Ogq8D+dkfdAjNEzoBUxobc+YydpPOtlLxBH4fSH97GjVBwgW5du/mwhVEAcz3XlP5xgogx+gkEMrp4BJyEyvJAEMtVzg4/esXs678J+prpitIxS/VObdyTcc4WMSqoRqf4IjBf+l+CwKqJIU2YVGZ6u1lltF5XfZzltK1Nv5Zuv4HyZwQAHp/7yJCIpOS+rCbUd2QuOl2DmUe0n/to6i3Xso4Qfc4B1X/8xLBs+lTvbVXQMNDdYRZubFol9M0QK7WD2pGqIiHw1HfRrfsHpNoKix0h3rTREBli9A9GfI9flt9MdEHLHN2AxJMZEylFxwxI864bEwAukF/nuMi5sNkUCsoKPlLB6tNU5bh98HMJ+0kkfl8LAHPlwyiaia3C9F2ToEqyaZk8RLGP6FaqYrNJKuADvQqWaEEReEQUCTd2OgPxyVcQ1XQuCXNmLNQt8ll8NAINhql10xS70Y3iY4BOtb+zrpEBQJQtNMWKJvOVvNOdJqKfQIpTUp82rH6brz3gF5Z04V9u9YnPSELQCF/ol3UBYqb07c40fk+EYeG08LyYGKHkmoRQgT5QdjxHjYW9AA+9HlzTYCLPZvHiRBTnkDdfp03xT3PLo8jr0SfE1s/kmWfl0EBEfg1eBr7w6wYNldgigKe+kYrTpXxgfrttPvKyF+jOvD276paCbmSrpgOoEPvTxhaITHH5+o3aNOsdpUVdu+zJTyXDBJs3XCLfulVKa+V0w+vqsIqbP0XRpmuIqOzWpV0zxpDBgoflMNnucmHrNPHvTDhnY31LkymAM5Ikw/E85tU0ZZCRg8n4ZgkAm0e+cZq9rqUI1O2MA+Xmxq7wq7CsOz8Dlb4wrCM2CvHJcMq4MSpPrU8Uqr2Dq+XmRU5MmLv0/5SE5eSrysb9QwgHeittBnYOWR2GDK1aHHnLvPVUvb5j7FUEB31MlM+sIxHkL+9EJLfKJfk/qQoEezLV5FGeOITQV698byV8JRgNSpA0YW9jTp0zP0xUgyOT4fjI+AT/GZcy0iuVpZgB/bW2i+1dT7xo4rYsiL+rr2S8v2kmbQ6gmueswzPqv2jJPTJMfCNWI+dvRgNfKHFnk+BECA6WApI+gCklba05nuzOSlZpiDdGWrbePjnmkg34Y1s5nrkaYfb4wJQ/kBy9PqqFy/P6V28q272mFdbRJapSFOf6gLkRao0LNK+AMsquX91iIw0OCt8VK6Y+XrjMxXcG+rHh8sdEAetlABKSlbAQqHOg3FUwq+Z8SHnqsiRB5CNrfHOb2Gpkz7qNTl7tJldZrbmCi8TOMQd/Po+dnjO2r18iryqKZ7PPLwQQT1gvFU62bh4YkrDA7rpmr3hl9bOQBJTibpwRYj71bPlo1biJ1mDqK0QOgtU590d9T/k9mhNZrkvX0HxZxW3Wyokq0/3d3yMgDdNbEQr0NcKSWYpsiQe25UOB6Ovf7fHiku8mMKLZOQccHJUxzlM/93B5jQUCVey/30UhQPd5vo0Roe+cvZ21TN3aHAQwUvirRIWbrVH6kKbTsPOmFi1WaaULkHejSE3lpXKo8d094D2Gci1eXWwy0LUCRNJ1upxjUQKdl9phEhQ3gWGbhNGEDrbJuu7Y/3CnE8BYOZggbHKsFEuako+v7syHLpLKcUoQuGkDHzoSiuRZKLurGPgi09DxUZFqnqWalc0G1UVbZvZVPgIzsowtbAHaIh8fLMR9d+NGb32FhccPCCDVJK2UVELmJQSUMXBlhHq7cXtfXQ6Syu3artIa03trVCuEgEy5BL3U9PvhM///RiXn5QW1169wdfnhSSPRpGVkJMNsomEXqc6r+p3xCYaD8450VQ85C1vWnxiw13xB7iopVGjPFa6I6zqC5RgJouHmhdVW23r1JxB8rLlyBvZ+G6alDr823cXIVtlfhhgJ/VeGNkKmoJo0dyZ2jLTRx3KuL799XEGREgPARNB7GIupN0OxKvTISc+Y4faMbA6qQKNfJCYCEPd6ZfWEPILEKtbo2n3HO62Ta8Ljqiarx4xduTVCKp5uDwcPvXsHMuApoJ/D4xj9+mJrkaIVox8Owl2JuN5bTiNjaft1jqnv8v+JgsSQhrDO5zv1tFkGCgma14IS+4yaJ/+5g0OxsZ0YeAK+35q86rUJVGwcY+MuNIz22PSEy0d+xwKyAi+yCCbQCnllFGQX5FdPUMQAp+/7E4omzWRfx1SY4ZWjflucXHXCOFZVcGMwzfRDosqzj4B33CqzB7URUCkLHSWlx52ngLUqTB7e3VDVbEkhgpt3GPo/L6DTAZ6ApgTo2AGtlNcwk7boAJxqLSzmjZFtjKB5u1E3eGUOZEPjopLmWpM7t7NT1mhtu6LB3DczhcQPje0yLzinrb/Jo2SSz/+ycxvJ7jf8dtZpIU6BG2HSfubHjOA7j47HYWRgh2KIv5KgZ85IMXy5YKsumgFDAmaqqhJZRQkfhvPxT0QbCnLsufB6MuUbhVPgF7cj69BLod8Zp17qScrlsyH8Cm5/BTFS/qb656QTB/HARTZCv5UHkg29komanyGjOoeOf8COqX8nQEW+i1jdPabE6BJX1NS8PJEgZWf5CFVYfvnYy9wX/ny0YN1m50d93rwCiHQ9TM7kQ8pVmqTBDLC7pAksGW8UWPfowRW4jpIsYg4lYr0jv6nq3zl9vFWQpC98YChwyrK9/OgYywa6aYkPFjivGzT/+GPJyl1/zfaOEbAOgH6bYyN0Z/n4QvFen002BjSH53TwGyVtQ9wxDr0quD0JUq5M3eEhl9up2M/BmvxO/ulnjlIE0nf6oaw3tBNN+lpZCeGIoF8Dt0T2O9SH8w++a4On3XFkWcTgFhzJKxAJfSl4L4lVanC12zhiZD0SjgfMk3pEI0kqY9+IO5R1tUcOf4ABeO+Qu+qDrZYEhN3YbRNYU+pAgew3Rb9MKKSrJLuZ6x6HckxjtLMXCom01sM0jjNzAQ63IZL2raBGorA128lZ4ZbUtESjYD6gt6G2ptlT8o0Nfv6ui+f7/O927w6YytKqKu+LjdraEovXEMocRjp3wQR7yYUKm7/nZ6kh707wFIj76zJQbxJ/sKjOeO2kyWJyXD2PR5f5tVjcphbRpJRs8g9heJQ8iEhi8jjD63dIEqFcp1nw6vLOzEqJfkdAHSuoH0UGz7EAayLc/A5AZ4SdK5GQCw9TeqM2uloO4khficbyHtSC8t1rHpUkypCEYPVE855qpEf0aS4yfwNTCn4kYJr8ArvCLx6S6CJn1c147ejZv9tFUdpjmY3aZ+5BAPYL8MD1ey0qtg35DY8cqM+0cu4YPGb2xeuK8832AzkYs9yrsxpAxu1sUYIPPTgjGklG5PV5rh9jCoLe/LWb0HOtrufObAI71E7hyr6x+oJpWyR4Kg8e3XG6k2chzLGDCaR3h9q31aD2w4DlpD81gvGr6ULZ8EC9RxL5ohdBfR5R40FxELtsRfnQKdIkOi0lIJxA5P4FEFoTbgEVW60NzflGwWl8A9L1pEg1xoqYsSJ2YoEbUlfo5u9Jp5DdKHAXDbE389g0tfADHAQhJb4a18lbI2EAGldpEa3R7mgmrXqKqsWca2nkzk9s3oiaonqDAQs0PUOLb9FKKtuj+GUQuhWaYRLGmSCbsK1j+A==' }, /* eslint-enable */ // 100 KiB of 1s. @@ -113,6 +127,7 @@ export const LARGE_BYTES_FIXTURES = [ bytes: new Uint8Array(102400).fill(1), hexadecimal: `0x${'01'.repeat(102400)}`, bigint: BigInt(`0x${'01'.repeat(102400)}`), + base64: `${'AQEB'.repeat(34133)}AQ==`, }, ]; diff --git a/src/bytes.test.ts b/src/bytes.test.ts index 2c424e599..d40fe6c02 100644 --- a/src/bytes.test.ts +++ b/src/bytes.test.ts @@ -8,7 +8,9 @@ import { } from './__fixtures__'; import { assertIsBytes, + base64ToBytes, bigIntToBytes, + bytesToBase64, bytesToBigInt, bytesToHex, bytesToNumber, @@ -170,6 +172,30 @@ describe('bytesToString', () => { ); }); +describe('bytesToBase64', () => { + it.each(BYTES_FIXTURES)( + 'returns a base64 string from a byte array', + ({ bytes, base64 }) => { + expect(bytesToBase64(bytes)).toBe(base64); + }, + ); + + it.each(LARGE_BYTES_FIXTURES)( + 'returns a base64 string from a large byte array', + ({ bytes, base64 }) => { + expect(bytesToBase64(bytes)).toBe(base64); + }, + ); + + it.each(INVALID_BYTES_FIXTURES)( + 'throws an error for invalid byte arrays', + (value) => { + // @ts-expect-error Invalid type. + expect(() => bytesToBase64(value)).toThrow('Value must be a Uint8Array.'); + }, + ); +}); + describe('hexToBytes', () => { it.each(BYTES_FIXTURES)( 'returns a byte array from a hex string', @@ -364,6 +390,22 @@ describe('stringToBytes', () => { ); }); +describe('base64ToBytes', () => { + it.each(BYTES_FIXTURES)( + 'returns a byte array from a base64 string', + ({ bytes, base64 }) => { + expect(base64ToBytes(base64)).toStrictEqual(bytes); + }, + ); + + it.each(LARGE_BYTES_FIXTURES)( + 'returns a byte array from a large base64 string', + ({ bytes, base64 }) => { + expect(base64ToBytes(base64)).toStrictEqual(bytes); + }, + ); +}); + describe('valueToBytes', () => { it.each(BYTES_FIXTURES)( 'returns a byte array from a value', diff --git a/src/bytes.ts b/src/bytes.ts index 028cd78ce..92965df28 100644 --- a/src/bytes.ts +++ b/src/bytes.ts @@ -1,3 +1,5 @@ +import { base64 } from '@scure/base'; + import { assert } from './assert'; import type { Hex } from './hex'; import { add0x, assertIsHexString, remove0x } from './hex'; @@ -167,6 +169,18 @@ export function bytesToString(bytes: Uint8Array): string { return new TextDecoder().decode(bytes); } +/** + * Convert a `Uint8Array` to a base64 encoded string. + * + * @param bytes - The bytes to convert to a base64 encoded string. + * @returns The base64 encoded string. + */ +export function bytesToBase64(bytes: Uint8Array): string { + assertIsBytes(bytes); + + return base64.encode(bytes); +} + /** * Convert a hexadecimal string to a `Uint8Array`. The string can optionally be * prefixed with `0x`. It accepts even and odd length strings. @@ -318,6 +332,18 @@ export function stringToBytes(value: string): Uint8Array { return new TextEncoder().encode(value); } +/** + * Convert a base64 encoded string to a `Uint8Array`. + * + * @param value - The base64 encoded string to convert to bytes. + * @returns The bytes as `Uint8Array`. + */ +export function base64ToBytes(value: string): Uint8Array { + assert(typeof value === 'string', 'Value must be a string.'); + + return base64.decode(value); +} + /** * Convert a byte-like value to a `Uint8Array`. The value can be a `Uint8Array`, * a `bigint`, a `number`, or a `string`. diff --git a/yarn.lock b/yarn.lock index 5b0f27d37..b3b430514 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1102,6 +1102,7 @@ __metadata: "@metamask/eslint-config-nodejs": ^12.0.0 "@metamask/eslint-config-typescript": ^12.0.0 "@noble/hashes": ^1.3.1 + "@scure/base": ^1.1.3 "@swc/cli": ^0.1.62 "@swc/core": ^1.3.66 "@types/debug": ^4.1.7 @@ -1273,10 +1274,10 @@ __metadata: languageName: node linkType: hard -"@scure/base@npm:~1.1.0": - version: 1.1.1 - resolution: "@scure/base@npm:1.1.1" - checksum: b4fc810b492693e7e8d0107313ac74c3646970c198bbe26d7332820886fa4f09441991023ec9aa3a2a51246b74409ab5ebae2e8ef148bbc253da79ac49130309 +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0": + version: 1.1.3 + resolution: "@scure/base@npm:1.1.3" + checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c languageName: node linkType: hard