From 01b612cff50133ae68c1e8cb6bdccc94189c80f0 Mon Sep 17 00:00:00 2001 From: Sergey Lyubka Date: Wed, 27 Dec 2023 15:38:41 +0000 Subject: [PATCH] WCH FW build fix. Introduce phy_addr for STM32F driver --- examples/modbus-dashboard/packed_fs.c | 1370 ++++++++--------- examples/modbus-dashboard/web_root/main.js | 6 +- .../ch32v307-make-baremetal-builtin/Makefile | 20 +- .../wch/ch32v307-make-baremetal-builtin/hal.h | 33 +- .../ch32v307-make-baremetal-builtin/link.ld | 36 - .../ch32v307-make-baremetal-builtin/main.c | 49 +- .../vendor/link.ld | 258 ++-- .../vendor/startup_ch32v30x_D8.S | 369 ----- mongoose.c | 32 +- mongoose.h | 2 + src/drivers/stm32f.c | 28 +- src/drivers/stm32f.h | 2 + src/queue.c | 4 +- 13 files changed, 881 insertions(+), 1328 deletions(-) delete mode 100644 examples/wch/ch32v307-make-baremetal-builtin/link.ld delete mode 100644 examples/wch/ch32v307-make-baremetal-builtin/vendor/startup_ch32v30x_D8.S diff --git a/examples/modbus-dashboard/packed_fs.c b/examples/modbus-dashboard/packed_fs.c index daf9443d..11aebf70 100644 --- a/examples/modbus-dashboard/packed_fs.c +++ b/examples/modbus-dashboard/packed_fs.c @@ -12,7 +12,7 @@ const char *mg_unpack(const char *, size_t *, time_t *); #endif static const unsigned char v1[] = { - 31, 139, 8, 8, 131, 28, 101, 101, 0, 3, 98, 117, // ......ee..bu + 31, 139, 8, 8, 215, 103, 114, 101, 0, 3, 98, 117, // .....gre..bu 110, 100, 108, 101, 46, 106, 115, 0, 173, 60, 139, 114, // ndle.js..<.r 219, 56, 146, 191, 18, 105, 83, 90, 98, 132, 200, 118, // .8...iSZb..v 102, 178, 119, 71, 25, 81, 37, 30, 79, 156, 153, 60, // f.wG.Q%.O..< @@ -652,7 +652,7 @@ static const unsigned char v1[] = { 0, 0 // . }; static const unsigned char v2[] = { - 31, 139, 8, 8, 131, 28, 101, 101, 0, 3, 104, 105, // ......ee..hi + 31, 139, 8, 8, 215, 103, 114, 101, 0, 3, 104, 105, // .....gre..hi 115, 116, 111, 114, 121, 46, 109, 105, 110, 46, 106, 115, // story.min.js 0, 237, 91, 109, 111, 219, 186, 146, 254, 43, 182, 47, // ..[mo....+./ 214, 144, 96, 86, 181, 123, 206, 61, 187, 43, 151, 215, // ..`V.{.=.+.. @@ -1019,7 +1019,7 @@ static const unsigned char v2[] = { 239, 191, 0, 255, 82, 202, 232, 45, 58, 0, 0, 0 // ....R..-:.. }; static const unsigned char v3[] = { - 31, 139, 8, 8, 131, 28, 101, 101, 0, 3, 105, 110, // ......ee..in + 31, 139, 8, 8, 215, 103, 114, 101, 0, 3, 105, 110, // .....gre..in 100, 101, 120, 46, 104, 116, 109, 108, 0, 125, 83, 75, // dex.html.}SK 115, 211, 48, 16, 190, 247, 87, 44, 186, 232, 64, 45, // s.0...W,..@- 191, 31, 233, 88, 153, 41, 165, 7, 14, 12, 28, 128, // ...X.)...... @@ -1069,7 +1069,7 @@ static const unsigned char v3[] = { 199, 3, 0, 0, 0 // .... }; static const unsigned char v4[] = { - 31, 139, 8, 8, 131, 28, 101, 101, 0, 3, 109, 97, // ......ee..ma + 31, 139, 8, 8, 215, 103, 114, 101, 0, 3, 109, 97, // .....gre..ma 105, 110, 46, 99, 115, 115, 0, 221, 27, 107, 143, 227, // in.css...k.. 198, 237, 175, 168, 27, 4, 88, 95, 37, 157, 36, 203, // ......X_%.$. 222, 93, 25, 45, 2, 20, 40, 26, 32, 233, 135, 182, // .].-..(. ... @@ -1383,682 +1383,682 @@ static const unsigned char v4[] = { 188, 236, 254, 3, 183, 232, 20, 14, 252, 57, 0, 0, 0 // .........9.. }; static const unsigned char v5[] = { - 31, 139, 8, 8, 69, 34, 103, 101, 0, 3, 109, 97, // ....E"ge..ma - 105, 110, 46, 106, 115, 0, 221, 92, 249, 115, 219, 70, // in.js....s.F - 150, 254, 221, 127, 69, 135, 147, 29, 82, 27, 2, 194, // ....E...R... - 77, 82, 182, 60, 229, 113, 146, 146, 183, 236, 100, 214, // MR.<.q....d. - 246, 120, 15, 175, 55, 129, 72, 136, 100, 12, 18, 92, // .x..7.H.d... - 0, 212, 17, 13, 255, 247, 253, 190, 215, 141, 139, 162, // ............ - 100, 103, 38, 169, 154, 74, 34, 147, 141, 62, 94, 191, // dg&..J"..>^. - 126, 119, 163, 95, 243, 248, 88, 169, 239, 190, 127, 251, // ~w._..X..... - 205, 137, 122, 246, 151, 23, 106, 26, 167, 105, 161, 86, // ..z...j..i.V - 219, 162, 84, 69, 25, 231, 165, 186, 90, 150, 11, 213, // ..TE....Z... - 143, 55, 203, 227, 190, 90, 174, 85, 150, 207, 146, 92, // .7...Z.U.... - 149, 153, 42, 146, 252, 50, 81, 229, 34, 81, 241, 102, // ..*..2Q."Q.f - 163, 226, 82, 197, 235, 27, 245, 215, 215, 47, 30, 61, // ..R....../.= - 234, 111, 139, 4, 131, 243, 229, 180, 236, 63, 126, 180, // .o.......?~. - 92, 109, 50, 128, 185, 85, 139, 161, 202, 147, 53, 70, // .m2..U....5F - 15, 21, 58, 188, 41, 227, 50, 145, 210, 55, 23, 23, // ..:.).2..7.. - 201, 180, 148, 226, 235, 228, 98, 168, 22, 229, 42, 29, // ......b...*. - 170, 215, 217, 182, 196, 68, 59, 117, 145, 103, 43, 165, // .....D;u.g+. - 250, 246, 241, 249, 118, 61, 75, 19, 251, 167, 2, 64, // ....v=K....@ - 31, 77, 179, 53, 48, 124, 193, 47, 117, 170, 110, 31, // .M.50|./u.n. - 41, 53, 205, 230, 39, 106, 147, 103, 27, 84, 60, 21, // )5..'j.g.T<. - 32, 63, 62, 41, 46, 231, 106, 154, 198, 69, 113, 250, // ?>)..j..Eq. - 229, 173, 52, 217, 242, 180, 83, 215, 171, 116, 93, 156, // ..4...S..t]. - 246, 22, 101, 185, 57, 57, 62, 190, 186, 186, 178, 175, // ..e.99>..... - 124, 59, 203, 231, 199, 158, 227, 56, 199, 24, 214, 83, // |;.....8...S - 23, 203, 52, 61, 237, 173, 179, 117, 210, 83, 151, 203, // ..4=...u.S.. - 228, 234, 207, 217, 245, 105, 207, 81, 142, 242, 2, 252, // .....i.Q.... - 245, 184, 192, 236, 99, 98, 93, 45, 103, 229, 226, 180, // ....cb]-g... - 231, 218, 97, 85, 117, 218, 155, 110, 115, 172, 180, 124, // ..aUu..ns..| - 158, 165, 89, 222, 123, 170, 158, 108, 98, 144, 208, 244, // ..Y.{..lb... - 79, 151, 235, 100, 26, 111, 78, 123, 121, 134, 245, 244, // O..d.oN{y... - 218, 213, 63, 101, 203, 117, 93, 63, 59, 237, 189, 154, // ..?e.u]?;... - 216, 225, 36, 80, 190, 61, 9, 166, 182, 51, 177, 236, // ..$P.=...3.. - 48, 240, 236, 48, 178, 240, 172, 92, 219, 117, 89, 88, // 0..0.....uYX - 160, 102, 226, 79, 237, 48, 4, 102, 174, 237, 120, 182, // .f.O.0.f..x. - 63, 25, 75, 43, 26, 83, 219, 115, 125, 60, 120, 99, // ?.K+.S.s}..."|...E - 217, 0, 167, 1, 123, 250, 227, 16, 70, 113, 185, 190, // ....{...Fq.. - 200, 126, 111, 86, 17, 28, 35, 3, 249, 153, 130, 17, // .~oV..#..... - 96, 179, 227, 197, 180, 1, 163, 138, 161, 52, 117, 227, // `........4u. - 208, 131, 134, 140, 28, 234, 250, 216, 143, 90, 29, 156, // .........Z.. - 170, 131, 95, 15, 119, 95, 121, 46, 233, 58, 81, 19, // .._.w_y..:Q. - 77, 87, 119, 140, 111, 253, 4, 128, 120, 248, 121, 101, // MWw.o...x.ye - 77, 44, 202, 195, 2, 242, 54, 190, 228, 199, 153, 235, // M,....6..... - 189, 27, 3, 137, 59, 68, 63, 207, 210, 242, 247, 70, // ....;D?....F - 116, 46, 93, 65, 83, 195, 212, 117, 236, 208, 18, 234, // t.]AS..u.... - 191, 116, 161, 24, 120, 90, 144, 10, 47, 39, 236, 225, // .t..xZ../'.. - 185, 210, 207, 147, 174, 103, 28, 116, 135, 58, 139, 108, // .....g.t.:.l - 149, 252, 222, 168, 227, 137, 68, 122, 233, 152, 190, 198, // ......Dz.... - 226, 39, 140, 86, 32, 254, 108, 66, 83, 19, 122, 85, // .'.V .lBS.zU - 49, 156, 184, 202, 121, 89, 145, 233, 85, 96, 135, 138, // 1...yY..U`.. - 132, 187, 4, 29, 97, 144, 166, 112, 111, 17, 26, 67, // ....a..po..C - 39, 80, 109, 59, 37, 159, 103, 210, 209, 130, 11, 25, // 'Pm;%.g..... - 161, 163, 85, 117, 180, 90, 93, 116, 121, 65, 116, 166, // ..Uu.Z]tyAt. - 108, 151, 152, 0, 53, 251, 0, 223, 121, 238, 34, 144, // l...5...y.". - 9, 219, 189, 172, 166, 155, 6, 244, 142, 51, 190, 34, // .........3." - 119, 193, 88, 225, 114, 139, 153, 74, 184, 89, 196, 151, // w.X.r..J.Y.. - 191, 59, 110, 194, 9, 132, 138, 178, 251, 142, 37, 145, // .;n.......%. - 242, 128, 52, 24, 161, 154, 53, 239, 216, 182, 130, 109, // ..4...5....m - 56, 115, 199, 207, 132, 245, 242, 65, 83, 225, 57, 44, // 8s.....AS.9, - 69, 151, 174, 183, 215, 0, 27, 34, 109, 103, 209, 94, // E......"mg.^ - 131, 86, 172, 241, 187, 253, 250, 72, 48, 88, 96, 129, // .V.....H0X`. - 156, 105, 97, 77, 238, 88, 153, 56, 47, 252, 223, 27, // .iaM.X.8/... - 233, 133, 26, 145, 44, 28, 132, 54, 86, 199, 147, 135, // ....,..6V... - 149, 37, 124, 9, 65, 32, 121, 238, 210, 99, 135, 61, // .%|.A y..c.= - 193, 197, 118, 61, 45, 151, 217, 90, 189, 77, 174, 203, // ..v=-..Z.M.. - 119, 113, 186, 77, 6, 183, 151, 252, 26, 98, 179, 82, // wq.M.....b.R - 94, 172, 135, 106, 182, 44, 226, 243, 52, 153, 13, 213, // ^..j.,..4... - 38, 141, 167, 201, 34, 75, 101, 59, 82, 222, 108, 208, // &..."Ke;R.l. - 39, 158, 205, 178, 245, 235, 229, 124, 81, 154, 242, 203, // '......|Q... - 228, 130, 197, 178, 68, 151, 213, 18, 195, 87, 241, 53, // ....D....W.5 - 64, 149, 201, 6, 197, 109, 90, 238, 142, 204, 198, 131, // @....mZ..... - 91, 145, 247, 231, 115, 153, 230, 207, 243, 15, 216, 144, // [...s....... - 84, 27, 156, 65, 255, 124, 110, 93, 45, 150, 101, 210, // T..A.|n]-.e. - 63, 122, 140, 190, 245, 118, 103, 48, 56, 34, 211, 110, // ?z...vg08".n - 213, 242, 66, 13, 56, 191, 58, 61, 85, 253, 245, 118, // ..B.8.:=U..v - 117, 158, 228, 253, 35, 53, 93, 36, 211, 143, 192, 125, // u...#5]$...} - 240, 149, 76, 252, 149, 204, 252, 149, 44, 230, 232, 177, // ..L.....,... - 218, 13, 213, 251, 15, 2, 143, 200, 168, 191, 253, 13, // ............ - 67, 221, 190, 70, 74, 158, 220, 199, 53, 94, 21, 36, // C..FJ...5^.$ - 32, 85, 209, 103, 208, 44, 230, 82, 47, 65, 105, 204, // U.g.,.R/Ai. - 247, 177, 85, 130, 29, 122, 171, 63, 254, 81, 93, 170, // ..U..z.?.Q]. - 39, 164, 194, 81, 171, 107, 158, 204, 44, 215, 113, 224, // '..Q.k..,.q. - 240, 184, 41, 148, 71, 72, 83, 103, 108, 124, 173, 199, // ..).GHSgl|.. - 62, 229, 124, 159, 59, 118, 215, 160, 191, 2, 222, 92, // >.|.;v...... - 164, 189, 138, 203, 233, 98, 112, 252, 191, 246, 87, 255, // .....bp...W. - 99, 15, 236, 175, 142, 142, 143, 154, 78, 179, 229, 124, // c.......N..| - 89, 114, 31, 184, 82, 127, 82, 171, 247, 238, 7, 59, // Yr..R.R....; - 77, 214, 115, 72, 224, 137, 114, 154, 94, 217, 122, 186, // M.sH..r.^.z. - 136, 215, 115, 80, 90, 37, 151, 66, 124, 65, 51, 77, // ..sPZ%.B|A3M - 74, 224, 199, 58, 27, 251, 221, 121, 82, 218, 66, 230, // J..:...yR.B. - 102, 13, 119, 185, 163, 7, 170, 251, 184, 100, 214, 175, // f.w......d.. - 4, 236, 87, 131, 13, 20, 53, 249, 54, 205, 226, 114, // ..W...5.6..r - 0, 114, 31, 11, 151, 142, 236, 50, 251, 118, 121, 157, // .r.....2.vy. - 204, 6, 26, 119, 51, 100, 87, 241, 226, 98, 61, 184, // ...w3dW..b=. - 108, 72, 113, 24, 11, 65, 83, 102, 208, 165, 127, 189, // lHq..ASf.... - 31, 114, 158, 148, 219, 124, 173, 77, 196, 163, 39, 179, // .r...|.M..'. - 229, 165, 177, 17, 189, 139, 52, 185, 86, 87, 214, 197, // ......4.VW.. - 54, 77, 21, 216, 190, 42, 172, 41, 212, 24, 251, 110, // 6M...*.)...n - 209, 201, 100, 102, 216, 163, 138, 69, 60, 203, 174, 172, // ..df...E<... - 98, 165, 190, 188, 61, 159, 239, 122, 79, 1, 244, 203, // b...=..zO... - 219, 90, 75, 200, 99, 99, 127, 54, 241, 186, 2, 190, // .ZK.cc.6.... - 92, 83, 199, 45, 153, 227, 34, 91, 151, 214, 58, 203, // .S.-.."[..:. - 87, 144, 196, 50, 135, 32, 66, 57, 212, 230, 198, 114, // W..2. B9...r - 107, 1, 80, 16, 138, 34, 69, 181, 136, 69, 7, 25, // k.P.."E..E.. - 211, 101, 158, 199, 55, 150, 143, 198, 205, 181, 229, 169, // .e..7....... - 18, 74, 174, 171, 66, 84, 201, 211, 117, 209, 123, 218, // .J..BT..u.{. - 194, 106, 247, 228, 248, 248, 233, 143, 66, 212, 39, 203, // .j......B.'. - 245, 102, 91, 138, 162, 195, 48, 10, 45, 255, 246, 55, // .f[...0.-..7 - 213, 231, 168, 254, 174, 54, 11, 104, 170, 138, 59, 77, // .....6.h..;M - 94, 212, 200, 183, 97, 12, 4, 17, 53, 252, 218, 81, // ^...a...5..Q - 23, 80, 198, 231, 142, 162, 205, 98, 124, 189, 83, 210, // .P.....b|.S. - 175, 146, 52, 84, 86, 197, 157, 178, 109, 27, 184, 193, // ..4TV...m... - 152, 104, 88, 134, 70, 66, 206, 46, 117, 184, 18, 16, // .hX.FB..u... - 186, 226, 128, 225, 14, 169, 8, 106, 129, 100, 136, 184, // .......j.d.. - 246, 41, 48, 34, 81, 26, 139, 118, 210, 180, 4, 104, // .)0"Q..v...h - 185, 200, 166, 219, 226, 36, 219, 150, 194, 14, 218, 247, // .....$...... - 122, 197, 39, 48, 220, 69, 150, 163, 178, 180, 226, 52, // z.'0.E.....4 - 205, 174, 48, 97, 221, 6, 134, 8, 12, 242, 163, 174, // ..0a........ - 236, 144, 189, 215, 158, 149, 30, 167, 121, 218, 193, 60, // ........y..< - 55, 66, 34, 102, 245, 87, 144, 146, 244, 87, 145, 18, // 7B"f.W...W.. - 149, 93, 38, 249, 69, 74, 129, 158, 230, 89, 154, 210, // .]&.EJ...Y.. - 39, 221, 164, 112, 99, 224, 166, 118, 111, 39, 42, 116, // '..pc..vo'*t - 254, 229, 113, 45, 77, 130, 126, 45, 78, 242, 253, 184, // ..q-M.~-N... - 235, 114, 222, 36, 41, 172, 250, 65, 167, 147, 109, 216, // .r.$)..A..m. - 163, 104, 188, 79, 199, 111, 148, 217, 139, 117, 9, 45, // .h.O.o...u.- - 190, 166, 69, 186, 166, 134, 139, 189, 64, 229, 0, 246, // ..E.....@... - 242, 79, 157, 167, 19, 117, 253, 128, 57, 211, 102, 67, // .O...u..9.fC - 224, 13, 246, 140, 217, 209, 1, 43, 80, 8, 198, 135, // .......+P... - 101, 213, 176, 198, 136, 94, 37, 137, 109, 238, 24, 187, // e....^%.m... - 208, 136, 163, 219, 34, 117, 116, 88, 232, 42, 201, 126, // ...."utX.*.~ - 64, 248, 122, 7, 117, 81, 11, 146, 161, 35, 60, 193, // @.z.uQ...#<. - 102, 112, 217, 68, 60, 186, 186, 81, 215, 247, 206, 135, // fp.D<..Q.... - 157, 210, 139, 19, 40, 172, 32, 89, 181, 30, 63, 101, // ....(. Y..?e - 133, 251, 65, 243, 242, 232, 62, 102, 94, 45, 225, 108, // ..A...>f^-.l - 14, 48, 179, 195, 57, 144, 43, 93, 78, 63, 238, 209, // .0..9.+]N?.. - 255, 11, 227, 164, 235, 110, 231, 115, 244, 248, 66, 87, // .....n.s..BW - 131, 159, 244, 125, 231, 40, 146, 72, 125, 112, 180, 95, // ...}.(.H}p._ - 105, 25, 189, 95, 51, 170, 204, 187, 163, 202, 60, 94, // i.._3.....<^ - 107, 185, 191, 182, 66, 25, 215, 174, 209, 35, 187, 252, // k...B....#.. - 61, 223, 150, 37, 214, 34, 38, 175, 167, 31, 122, 21, // =..%."&...z. - 206, 154, 217, 44, 237, 186, 134, 168, 173, 140, 11, 43, // ...,.......+ - 130, 241, 113, 93, 109, 122, 138, 69, 190, 92, 127, 180, // ..q]mz.E.... - 28, 101, 152, 182, 65, 232, 214, 114, 20, 90, 82, 140, // .e..A..r.ZR. - 10, 122, 85, 65, 112, 132, 4, 67, 65, 149, 148, 151, // .zUAp..CA... - 164, 175, 53, 101, 152, 88, 168, 217, 54, 143, 229, 25, // ..5e.X..6... - 75, 87, 73, 92, 36, 22, 212, 15, 18, 115, 72, 118, // KWI.$....sHv - 116, 21, 80, 152, 3, 5, 253, 213, 195, 220, 84, 218, // t.P.......T. - 66, 184, 213, 83, 113, 190, 140, 45, 113, 201, 194, 119, // B..Sq..-q..w - 67, 60, 17, 30, 109, 112, 164, 195, 98, 57, 155, 37, // C<..mp..b9.% - 8, 58, 97, 94, 16, 230, 214, 139, 135, 89, 86, 102, // .:a^.....YVf - 73, 86, 114, 9, 124, 11, 61, 175, 33, 200, 121, 154, // IVr.|.=.!.y. - 129, 211, 11, 43, 4, 69, 66, 189, 148, 11, 40, 194, // ...+.EB...(. - 222, 234, 77, 240, 100, 188, 165, 65, 179, 139, 122, 67, // ..M.d..A..zC - 133, 123, 151, 223, 123, 138, 168, 22, 248, 62, 133, 108, // .{..{....>.l - 106, 190, 29, 176, 54, 101, 9, 120, 3, 137, 240, 181, // j...6e.x.... - 76, 50, 140, 209, 78, 238, 180, 137, 127, 171, 224, 65, // L2..N......A - 239, 4, 234, 16, 66, 83, 12, 33, 68, 53, 160, 37, // ....BS.!D5.% - 240, 247, 13, 17, 133, 106, 15, 105, 12, 222, 67, 17, // .....j.i..C. - 70, 179, 11, 41, 196, 227, 206, 243, 229, 76, 241, 131, // F..).....L.. - 66, 80, 64, 82, 230, 241, 6, 159, 43, 216, 248, 190, // BP@R....+... - 102, 85, 26, 159, 39, 105, 39, 62, 233, 88, 249, 202, // fU..'i'>.X.. - 136, 116, 157, 223, 138, 66, 39, 246, 105, 149, 204, 150, // .t...B'.i... - 219, 21, 45, 183, 89, 193, 178, 76, 19, 81, 119, 2, // ..-.Y..L.Qw. - 223, 15, 125, 218, 160, 57, 102, 49, 144, 245, 13, 245, // ..}..9f1.... - 182, 234, 72, 143, 59, 100, 34, 254, 44, 140, 25, 220, // ..H.;d".,... - 10, 248, 97, 165, 87, 237, 29, 6, 86, 60, 84, 75, // ..a.W...V.Cz..' - 12, 140, 43, 91, 245, 167, 170, 52, 160, 55, 89, 67, // ..+[...4.7YC - 106, 155, 56, 151, 61, 225, 161, 201, 242, 76, 63, 218, // j.8.=....L?. - 83, 6, 221, 216, 168, 80, 2, 170, 25, 90, 241, 175, // S....P...Z.. - 193, 110, 64, 93, 170, 131, 222, 122, 156, 217, 226, 104, // .n@]...z...h - 116, 237, 114, 145, 172, 77, 77, 53, 76, 183, 180, 66, // t.r..MM5L..B - 223, 58, 216, 253, 66, 19, 235, 200, 16, 13, 11, 104, // .:..B......h - 155, 77, 77, 194, 147, 170, 38, 108, 135, 39, 85, 101, // .MM...&l.'Ue - 224, 124, 182, 77, 60, 16, 135, 252, 180, 45, 202, 229, // .|.M<....-.. - 197, 77, 37, 115, 29, 1, 212, 2, 91, 249, 68, 6, // .M%s....[.D. - 25, 116, 128, 144, 95, 124, 85, 194, 41, 146, 88, 36, // .t.._|U.).X$ - 171, 229, 57, 98, 33, 93, 219, 182, 12, 58, 142, 214, // ..9b!]...:.. - 107, 219, 177, 148, 22, 187, 158, 32, 123, 1, 133, 193, // k...... {... - 231, 174, 101, 168, 167, 231, 7, 3, 84, 106, 19, 101, // ..e.....Tj.e - 100, 167, 180, 119, 212, 114, 78, 25, 71, 128, 138, 122, // d..w.rN.G..z - 176, 90, 78, 199, 108, 128, 3, 75, 184, 23, 162, 48, // .ZN.l..K...0 - 182, 124, 123, 160, 234, 158, 253, 120, 189, 92, 209, 149, // .|{....x.... - 240, 89, 188, 75, 127, 199, 253, 181, 22, 253, 174, 228, // .Y.K........ - 127, 151, 129, 52, 203, 169, 152, 174, 193, 109, 6, 153, // ...4.....m.. - 231, 250, 40, 239, 89, 145, 116, 100, 88, 106, 206, 203, // ..(.Y.tdXj.. - 181, 22, 222, 215, 201, 197, 128, 2, 215, 146, 92, 57, // ...........9 - 218, 59, 109, 187, 50, 184, 65, 196, 75, 241, 116, 89, // .;m.2.A.K.tY - 34, 176, 80, 197, 234, 164, 221, 180, 87, 1, 202, 183, // ".P.....W... - 29, 102, 182, 15, 201, 169, 33, 49, 84, 220, 27, 218, // .f....!1T... - 246, 181, 239, 185, 193, 135, 80, 190, 205, 187, 122, 6, // ......P...z. - 236, 246, 54, 237, 181, 150, 181, 182, 205, 111, 115, 196, // ..6......os. - 92, 216, 148, 215, 207, 203, 85, 2, 43, 62, 208, 65, // ......U.+>.A - 65, 77, 3, 104, 86, 85, 182, 205, 219, 18, 91, 235, // AM.hVU....[. - 228, 189, 45, 131, 163, 161, 114, 33, 221, 122, 35, 88, // ..-...r!.z#X - 239, 249, 155, 232, 3, 131, 154, 205, 172, 193, 69, 99, // ..........Ec - 221, 70, 68, 250, 13, 149, 79, 64, 90, 197, 238, 26, // .FD...O@Z... - 107, 113, 141, 233, 242, 18, 106, 1, 233, 72, 242, 18, // kq....j..H.. - 197, 90, 51, 126, 6, 1, 15, 58, 199, 248, 188, 200, // .Z3~...:.... - 210, 109, 73, 47, 137, 249, 232, 234, 26, 155, 154, 172, // .mI/........ - 69, 57, 2, 170, 70, 68, 234, 235, 106, 125, 166, 140, // E9..FD..j}.. - 199, 141, 21, 245, 14, 154, 228, 246, 126, 7, 42, 210, // ........~.*. - 85, 62, 248, 197, 41, 121, 27, 52, 16, 49, 145, 0, // U>..)y.4.1.. - 234, 130, 218, 67, 55, 222, 66, 62, 12, 100, 236, 211, // ...C7.B>.d.. - 44, 81, 193, 122, 23, 160, 99, 130, 218, 153, 167, 243, // ,Q.z..c..... - 125, 87, 206, 42, 113, 224, 174, 254, 58, 199, 62, 231, // }W.*q...:.>. - 163, 46, 86, 50, 214, 142, 10, 196, 153, 51, 144, 169, // ..V2.....3.. - 93, 60, 247, 35, 45, 215, 47, 241, 134, 193, 122, 15, // ]<.#-./...z. - 111, 43, 168, 235, 239, 245, 87, 66, 196, 86, 183, 187, // o+....WB.V.. - 29, 235, 112, 173, 211, 75, 140, 67, 246, 177, 54, 13, // ..p..K.C..6. - 40, 158, 152, 226, 69, 188, 76, 107, 219, 160, 35, 191, // (...E.Lk..#. - 72, 153, 206, 125, 227, 107, 147, 100, 45, 118, 85, 162, // H..}.k.d-vU. - 79, 86, 241, 165, 13, 43, 180, 173, 104, 205, 114, 124, // OV...+..h.r| - 124, 31, 114, 171, 212, 242, 1, 219, 169, 247, 179, 37, // |.r........% - 55, 16, 251, 88, 110, 170, 238, 29, 131, 170, 93, 123, // 7..Xn.....]{ - 203, 243, 79, 176, 3, 133, 211, 102, 5, 60, 245, 230, // ..O....f.<.. - 62, 32, 134, 189, 171, 178, 218, 164, 116, 194, 7, 110, // > ......t..n - 99, 159, 62, 91, 223, 80, 160, 37, 215, 33, 86, 112, // c.>[.P.%.!Vp - 4, 31, 213, 20, 17, 227, 26, 81, 28, 223, 132, 170, // .......Q.... - 114, 177, 44, 248, 126, 52, 177, 247, 230, 121, 120, 169, // r.,.~4...yx. - 129, 214, 136, 7, 57, 114, 208, 39, 105, 79, 80, 153, // ....9r.'iOP. - 133, 221, 94, 220, 78, 67, 123, 200, 109, 85, 2, 188, // ..^.NC{.mU.. - 154, 53, 2, 220, 125, 21, 160, 61, 103, 119, 83, 124, // .5..}..=gwS| - 55, 218, 222, 67, 177, 138, 159, 205, 140, 69, 110, 101, // 7..C.....Ene - 235, 244, 166, 247, 244, 57, 17, 169, 98, 213, 253, 1, // .....9..b... - 245, 123, 232, 158, 137, 154, 247, 223, 41, 243, 175, 122, // .{......)..z - 231, 220, 121, 125, 124, 32, 78, 223, 7, 175, 204, 27, // ..y}| N..... - 102, 190, 50, 142, 108, 111, 204, 183, 194, 237, 51, 64, // f.2.lo....3@ - 57, 47, 231, 137, 191, 19, 189, 28, 75, 186, 132, 147, // 9/......K... - 242, 244, 206, 227, 75, 245, 86, 71, 215, 105, 250, 185, // ....K.VG.i.. - 60, 248, 67, 33, 189, 183, 159, 165, 251, 233, 33, 142, // <.C!......!. - 244, 179, 186, 253, 204, 196, 86, 5, 80, 230, 174, 17, // ......V.P... - 252, 121, 79, 77, 14, 200, 207, 93, 129, 106, 63, 182, // .yOM...].j?. - 30, 234, 98, 21, 217, 238, 5, 170, 218, 73, 188, 204, // ..b......I.. - 230, 116, 139, 191, 226, 25, 65, 135, 135, 76, 98, 240, // .t....A..Lb. - 177, 93, 153, 37, 23, 197, 211, 39, 242, 14, 229, 169, // .].%...'.... - 157, 166, 22, 226, 25, 203, 189, 37, 107, 79, 40, 78, // .......%kO(N - 143, 245, 27, 255, 147, 63, 0, 138, 41, 91, 43, 200, // .....?..)[+. - 102, 158, 46, 241, 117, 226, 214, 149, 250, 213, 11, 236, // f...u....... - 193, 230, 250, 49, 20, 90, 3, 124, 114, 172, 193, 207, // ...1.Z.|r... - 213, 18, 236, 126, 25, 223, 36, 249, 15, 94, 79, 205, // ...~..$..^O. - 226, 50, 182, 214, 241, 42, 49, 117, 202, 235, 117, 251, // .2...*1u..u. - 184, 214, 161, 94, 46, 122, 137, 232, 24, 225, 172, 176, // ...^.z...... - 53, 39, 63, 158, 29, 121, 67, 215, 30, 243, 100, 119, // 5'?..yC...dw - 226, 62, 67, 76, 55, 30, 202, 135, 131, 255, 221, 161, // .>CL7....... - 139, 63, 199, 14, 198, 103, 65, 236, 218, 65, 48, 148, // .?...gA..A0. - 15, 105, 178, 92, 38, 40, 60, 179, 163, 9, 254, 76, // .i..&(<....L - 111, 207, 30, 163, 11, 36, 207, 118, 153, 32, 16, 219, // o....$.v. .. - 99, 64, 118, 77, 127, 219, 101, 18, 195, 248, 93, 104, // c@vM..e...]h - 135, 163, 152, 137, 56, 227, 145, 25, 102, 51, 117, 99, // ....8...f3uc - 28, 157, 5, 246, 200, 127, 55, 130, 240, 160, 57, 194, // ......7...9. - 159, 52, 59, 67, 121, 224, 97, 96, 64, 136, 33, 254, // .4;Cy.a`@.!. - 234, 6, 64, 28, 243, 116, 42, 8, 159, 117, 134, 240, // ..@..t*..u.. - 112, 209, 31, 250, 67, 123, 20, 225, 175, 174, 20, 4, // p...C{...... - 99, 219, 155, 224, 79, 87, 18, 77, 252, 227, 186, 38, // c...OW.M...& - 250, 67, 87, 203, 226, 206, 152, 91, 244, 142, 196, 33, // .CW....[...! - 93, 70, 67, 249, 208, 40, 7, 67, 30, 109, 185, 238, // ]FC..(.C.m.. - 157, 134, 134, 160, 255, 221, 59, 126, 144, 242, 36, 171, // ......;~..$. - 38, 238, 59, 247, 46, 225, 193, 13, 129, 117, 118, 112, // &.;......uvp - 122, 76, 14, 214, 188, 99, 162, 212, 93, 12, 48, 0, // zL...c..].0. - 11, 5, 250, 128, 17, 119, 23, 230, 114, 172, 63, 74, // .....w..r.?J - 177, 106, 219, 141, 91, 212, 65, 53, 212, 220, 13, 90, // .j..[.A5...Z - 84, 100, 85, 96, 7, 163, 138, 35, 53, 225, 93, 75, // TdU`...#5.]K - 63, 156, 49, 23, 169, 98, 103, 67, 124, 75, 179, 37, // ?.1..bgC|K.% - 58, 35, 91, 218, 140, 102, 11, 187, 189, 3, 39, 219, // :#[..f....'. - 162, 1, 70, 186, 33, 200, 0, 172, 68, 104, 26, 137, // ..F.!...Dh.. - 98, 139, 111, 187, 238, 176, 43, 123, 142, 94, 133, 16, // b.o...+{.^.. - 248, 120, 110, 254, 201, 177, 216, 99, 99, 6, 94, 101, // .xn....cc.^e - 179, 243, 109, 113, 208, 24, 60, 18, 107, 0, 167, 80, // ..mq..<.k..P - 32, 46, 225, 161, 158, 219, 251, 187, 109, 131, 116, 57, // .......m.t9 - 185, 166, 247, 60, 212, 209, 157, 76, 38, 199, 210, 138, // ...<...L&... - 174, 48, 32, 155, 235, 158, 186, 49, 223, 29, 179, 18, // .0 ....1.... - 133, 158, 114, 39, 12, 10, 180, 77, 49, 190, 145, 94, // ..r'...M1..^ - 235, 120, 90, 20, 189, 167, 202, 94, 157, 255, 80, 148, // .xZ....^..P. - 142, 54, 49, 127, 248, 54, 152, 192, 143, 61, 222, 153, // .61..6...=.. - 106, 183, 170, 126, 254, 220, 105, 85, 123, 166, 218, 241, // j..~..iU{... - 159, 121, 254, 164, 174, 246, 77, 181, 235, 78, 188, 231, // .y....M..N.. - 223, 162, 186, 178, 59, 143, 96, 77, 234, 144, 142, 126, // ....;.`M...~ - 200, 108, 30, 6, 142, 178, 60, 47, 60, 34, 122, 109, // .l....j.+.E - 218, 201, 68, 222, 152, 4, 107, 230, 212, 168, 101, 233, // ..D...k...e. - 205, 60, 91, 119, 176, 67, 248, 34, 187, 88, 60, 51, // .<[w.C.".X<3 - 133, 7, 43, 113, 198, 202, 133, 44, 64, 205, 17, 143, // ..+q...,@... - 34, 168, 117, 69, 229, 157, 9, 162, 209, 16, 230, 128, // ".uE........ - 162, 140, 200, 20, 206, 12, 50, 195, 12, 55, 148, 29, // ......2..7.. - 89, 136, 100, 174, 56, 186, 236, 41, 144, 5, 24, 69, // Y.d.8..)...E - 40, 68, 68, 21, 12, 244, 165, 53, 66, 217, 177, 1, // (DD....5B... - 205, 165, 229, 113, 164, 150, 20, 245, 37, 222, 157, 136, // ...q....%... - 61, 242, 100, 6, 26, 28, 223, 29, 171, 158, 164, 50, // =.d........2 - 126, 2, 119, 159, 202, 230, 123, 136, 65, 148, 27, 192, // ~.w...{.A... - 209, 98, 36, 96, 248, 129, 148, 66, 174, 35, 98, 15, // .b$`...B.#b. - 111, 28, 112, 70, 93, 158, 120, 236, 61, 18, 210, 129, // o.pF].x.=... - 94, 158, 148, 71, 154, 140, 232, 227, 8, 73, 35, 150, // ^..G.....I#. - 195, 72, 198, 10, 182, 81, 32, 244, 117, 184, 114, 159, // .H...Q .u.r. - 125, 124, 201, 68, 115, 133, 208, 88, 151, 39, 54, 213, // }|.Ds..X.'6. - 25, 19, 182, 199, 181, 251, 238, 68, 125, 14, 253, 199, // .......D}... - 130, 54, 5, 73, 49, 115, 26, 74, 0, 30, 170, 145, // .6.I1s.J.... - 88, 98, 20, 71, 66, 116, 244, 96, 194, 177, 148, 161, // Xb.GBt.`.... - 198, 129, 47, 101, 153, 210, 159, 16, 61, 148, 81, 239, // ../e....=.Q. - 201, 114, 132, 97, 84, 239, 145, 144, 30, 168, 50, 225, // .r.aT.....2. - 25, 229, 49, 209, 242, 185, 252, 145, 116, 137, 72, 161, // ..1.....t.H. - 17, 96, 128, 137, 158, 26, 145, 135, 62, 68, 42, 82, // .`......>D*R - 35, 98, 4, 177, 255, 172, 5, 16, 238, 72, 216, 199, // #b.......H.. - 185, 41, 32, 100, 48, 203, 17, 215, 224, 130, 205, 10, // .) d0....... - 142, 133, 148, 66, 80, 168, 56, 41, 152, 48, 81, 161, // ...BP.8).0Q. - 246, 77, 35, 160, 19, 76, 68, 4, 249, 182, 51, 12, // .M#..LD...3. - 132, 255, 148, 5, 176, 130, 112, 153, 199, 22, 10, 69, // ......p....E - 29, 225, 144, 67, 219, 197, 69, 96, 40, 139, 161, 172, // ...C..E`(... - 205, 231, 58, 177, 102, 138, 152, 46, 123, 88, 220, 103, // ..:.f...{X.g - 225, 15, 213, 166, 189, 33, 217, 221, 32, 148, 178, 95, // .....!.. .._ - 137, 211, 88, 86, 226, 209, 178, 251, 190, 22, 173, 168, // ..XV........ - 162, 185, 47, 134, 129, 153, 188, 232, 225, 177, 222, 211, // ../......... - 188, 16, 91, 6, 15, 60, 22, 113, 38, 191, 2, 138, // ..[..<.q&... - 34, 250, 144, 23, 162, 48, 90, 112, 17, 153, 141, 68, // "....0Zp...D - 156, 124, 153, 223, 19, 152, 40, 67, 92, 181, 64, 211, // .|....(C..@. - 27, 143, 209, 255, 179, 214, 49, 246, 5, 55, 81, 163, // ......1..7Q. - 145, 40, 151, 47, 226, 138, 89, 52, 62, 128, 169, 93, // .(./..Y4>..] - 63, 104, 70, 248, 62, 235, 61, 87, 234, 5, 31, 96, // ?hF.>.=W...` - 203, 156, 168, 177, 212, 135, 130, 143, 79, 252, 125, 98, // ........O.}b - 172, 165, 39, 18, 140, 67, 145, 54, 49, 9, 99, 196, // ..'..C.61.c. - 19, 188, 59, 128, 57, 49, 42, 136, 100, 118, 172, 51, // ..;.91*.dv.3 - 24, 115, 205, 99, 129, 37, 237, 247, 174, 193, 111, 27, // .s.c.%....o. - 35, 81, 127, 109, 84, 128, 31, 76, 8, 3, 89, 64, // #Q.mT..L..Y@ - 164, 124, 155, 242, 196, 33, 38, 66, 107, 15, 52, 13, // .|...!&Bk.4. - 77, 189, 23, 214, 165, 192, 169, 161, 120, 94, 171, 12, // M.......x^.. - 122, 4, 34, 70, 128, 62, 145, 213, 235, 153, 52, 181, // z."F.>....4. - 116, 25, 98, 57, 145, 62, 17, 95, 144, 82, 6, 164, // t.b9.>._.R.. - 254, 176, 149, 247, 77, 106, 153, 39, 29, 33, 246, 176, // ....Mj.'.!.. - 229, 30, 205, 51, 237, 56, 24, 97, 5, 150, 23, 88, // ...3.8.a...X - 1, 12, 60, 98, 115, 26, 120, 106, 56, 196, 192, 162, // ..2.}..C*.)z - 90, 129, 200, 56, 103, 193, 50, 69, 121, 16, 31, 61, // Z..8g.2Ey..= - 15, 70, 145, 209, 29, 240, 115, 164, 253, 214, 100, 216, // .F....s...d. - 66, 94, 189, 10, 244, 158, 138, 146, 168, 126, 37, 213, // B^.......~%. - 249, 37, 28, 84, 247, 170, 78, 32, 254, 87, 171, 78, // .%.T..N .W.N - 160, 141, 158, 182, 35, 13, 194, 15, 178, 40, 244, 37, // ....#....(.% - 228, 160, 210, 45, 72, 173, 41, 95, 59, 4, 18, 72, // ...-H.)_;..H - 97, 97, 180, 34, 92, 87, 32, 38, 10, 235, 162, 21, // aa.".W &.... - 134, 100, 211, 42, 210, 86, 69, 83, 65, 210, 129, 102, // .d.*.VESA..f - 121, 22, 133, 157, 175, 103, 44, 77, 36, 225, 166, 40, // y....g,M$..( - 141, 216, 168, 145, 0, 0, 62, 254, 130, 42, 232, 203, // ......>..*.. - 68, 116, 86, 232, 54, 226, 94, 150, 155, 77, 95, 164, // DtV.6.^..M_. - 49, 224, 42, 101, 169, 30, 215, 31, 77, 105, 4, 57, // 1.*e....Mi.9 - 115, 40, 223, 19, 114, 142, 223, 36, 22, 24, 29, 2, // s(..r..$.... - 31, 82, 132, 228, 157, 168, 41, 217, 46, 227, 70, 22, // .R....)...F. - 217, 10, 242, 70, 130, 86, 202, 90, 124, 75, 106, 112, // ...F.V.Z|Kjp - 10, 174, 90, 244, 11, 11, 231, 76, 72, 240, 243, 131, // ..Z....LH... - 84, 138, 96, 136, 104, 87, 125, 14, 230, 30, 192, 33, // T.`.hW}....! - 15, 44, 141, 46, 197, 139, 233, 246, 12, 63, 77, 45, // .,.......?M- - 73, 96, 113, 145, 40, 4, 242, 207, 35, 251, 125, 202, // I`q.(...#.}. - 76, 32, 205, 190, 98, 27, 73, 231, 78, 68, 48, 164, // L ..b.I.ND0. - 5, 114, 78, 154, 6, 66, 52, 217, 15, 136, 172, 131, // .rN..B4..... - 213, 161, 208, 103, 44, 94, 38, 148, 109, 4, 87, 38, // ...g,^&.m.W& - 148, 130, 90, 76, 68, 114, 248, 214, 136, 239, 2, 168, // ..ZLDr...... - 158, 252, 246, 133, 202, 244, 34, 174, 104, 201, 196, 34, // ......".h.." - 27, 24, 104, 45, 200, 192, 73, 133, 1, 53, 194, 17, // ..h-..I..5.. - 43, 57, 178, 130, 75, 138, 223, 194, 170, 214, 41, 182, // +9..K.....). - 207, 19, 12, 199, 24, 234, 9, 192, 64, 152, 20, 10, // ........@... - 186, 174, 248, 63, 78, 206, 127, 110, 32, 60, 244, 132, // ...?N..n <.. - 92, 228, 134, 150, 215, 33, 47, 11, 90, 142, 182, 205, // .....!/.Z... - 62, 47, 40, 76, 3, 249, 166, 85, 244, 44, 217, 143, // >/(L...U.,.. - 72, 33, 18, 74, 202, 6, 11, 43, 103, 21, 231, 30, // H!.J...+g... - 145, 40, 162, 87, 66, 108, 146, 152, 58, 204, 47, 212, // .(.WBl..:./. - 135, 98, 207, 49, 148, 237, 161, 46, 128, 188, 142, 152, // .b.1........ - 48, 106, 156, 108, 188, 40, 142, 40, 60, 143, 28, 137, // 0j.l.(.(<... - 24, 160, 108, 209, 208, 176, 85, 162, 187, 154, 197, 34, // ..l...U...." - 8, 199, 115, 126, 152, 87, 100, 205, 201, 246, 89, 18, // ..s~.Wd...Y. - 207, 146, 124, 112, 155, 102, 243, 108, 171, 47, 164, 234, // ..|p.f.l./.. - 131, 225, 55, 139, 236, 234, 205, 114, 150, 156, 199, 124, // ..7....r...| - 110, 30, 204, 105, 247, 189, 217, 181, 205, 41, 98, 185, // n..i.....)b. - 156, 126, 188, 81, 101, 182, 177, 28, 245, 179, 245, 62, // .~.Qe......> - 24, 127, 80, 215, 87, 157, 156, 169, 115, 30, 148, 122, // ..P.W...s..z - 60, 146, 111, 224, 243, 104, 184, 191, 73, 173, 145, 215, // <.o..h..I... - 223, 181, 243, 167, 98, 12, 187, 123, 180, 200, 247, 84, // ....b..{...T - 119, 142, 84, 37, 9, 210, 204, 196, 100, 61, 102, 218, // w.T%....d=f. - 116, 206, 105, 171, 220, 151, 71, 247, 31, 70, 53, 135, // t.i...G..F5. - 79, 117, 162, 91, 139, 34, 58, 23, 239, 139, 203, 163, // Ou.[.":..... - 93, 247, 208, 78, 14, 218, 3, 167, 57, 239, 122, 242, // ]..N....9.z. - 229, 173, 62, 107, 148, 155, 11, 237, 195, 198, 250, 92, // ..>k........ - 164, 57, 213, 216, 63, 248, 52, 199, 133, 76, 190, 224, // .9..?.4..L.. - 161, 114, 145, 164, 23, 86, 81, 130, 242, 211, 133, 74, // .r...VQ....J - 231, 39, 186, 62, 58, 120, 164, 154, 39, 64, 101, 121, // .'.>:x..'@ey - 153, 180, 206, 226, 120, 10, 208, 58, 75, 121, 40, 43, // ....x..:Ky(+ - 168, 158, 242, 192, 44, 123, 7, 99, 157, 179, 197, 214, // ....,{.c.... - 250, 103, 201, 101, 146, 102, 27, 230, 242, 242, 124, 241, // .g.e.f....|. - 85, 182, 158, 103, 60, 186, 127, 185, 60, 207, 227, 252, // U..g<...<... - 166, 123, 196, 211, 194, 197, 156, 91, 98, 98, 157, 126, // .{.....[bb.~ - 134, 194, 66, 35, 114, 101, 109, 174, 165, 190, 201, 29, // ..B#rem..... - 60, 120, 108, 214, 5, 45, 7, 117, 224, 66, 243, 58, // 31..MR.& - 120, 104, 146, 124, 235, 92, 161, 121, 158, 109, 55, 205, // xh.|...y.m7. - 145, 117, 157, 49, 214, 58, 9, 189, 155, 87, 100, 206, // .u.1.:...Wd. - 70, 205, 224, 157, 150, 28, 205, 125, 191, 125, 202, 186, // F......}.}.. - 169, 50, 140, 193, 245, 20, 214, 131, 9, 1, 81, 55, // .2........Q7 - 251, 167, 45, 254, 123, 9, 56, 17, 83, 44, 123, 53, // ..-.{.8.S,{5 - 193, 91, 57, 60, 66, 237, 154, 234, 63, 62, 152, 194, // .[9.. - 15, 116, 47, 151, 89, 154, 148, 146, 230, 178, 40, 44, // .t/.Y.....(, - 46, 34, 141, 111, 90, 69, 11, 194, 183, 238, 166, 191, // .".oZE...... - 116, 206, 28, 173, 118, 147, 152, 138, 207, 50, 54, 29, // t...v....26. - 24, 23, 188, 115, 96, 44, 92, 154, 92, 48, 27, 228, // ...s`,...0.. - 60, 131, 253, 88, 105, 139, 23, 57, 31, 96, 134, 70, // <..Xi..9.`.F - 94, 115, 48, 93, 229, 253, 119, 160, 180, 115, 184, 153, // ^s0]..w..s.. - 22, 89, 167, 104, 220, 232, 20, 14, 157, 175, 13, 105, // .Y.h.......i - 179, 110, 58, 227, 180, 217, 20, 123, 217, 205, 242, 217, // .n:....{.... - 169, 156, 185, 219, 122, 116, 133, 208, 225, 196, 147, 58, // ....zt.....: - 227, 100, 5, 37, 35, 179, 111, 106, 85, 191, 211, 151, // .d.%#.ojU... - 250, 162, 234, 148, 216, 131, 246, 66, 164, 160, 201, 255, // .......B.... - 186, 78, 219, 118, 33, 236, 218, 197, 61, 93, 36, 11, // .N.v!...=]$. - 248, 106, 237, 191, 178, 109, 174, 254, 140, 245, 204, 62, // .j...m.....> - 207, 58, 86, 43, 104, 131, 54, 234, 7, 255, 65, 225, // .:V+h.6...A. - 58, 237, 125, 29, 23, 139, 243, 44, 206, 103, 61, 81, // :.}....,.g=Q - 195, 211, 202, 40, 243, 90, 230, 206, 232, 219, 113, 143, // ...(.Z....q. - 122, 133, 38, 42, 103, 115, 102, 125, 0, 154, 73, 68, // z.&*gsf}..ID - 45, 246, 128, 77, 179, 121, 13, 171, 168, 187, 220, 133, // -..M.y...... - 121, 143, 105, 105, 108, 203, 215, 198, 116, 230, 223, 101, // y.iil...t..e - 101, 50, 184, 53, 153, 102, 139, 101, 58, 203, 147, 245, // e2.5.f.e:... - 167, 220, 175, 144, 102, 99, 152, 233, 221, 97, 250, 1, // ....fc...a.. - 115, 221, 176, 229, 19, 153, 162, 251, 46, 141, 247, 172, // s........... - 107, 6, 26, 231, 196, 68, 167, 243, 184, 88, 22, 214, // k....D...X.. - 123, 223, 217, 92, 127, 160, 53, 97, 230, 75, 45, 54, // {.....5a.K-6 - 173, 180, 154, 200, 228, 176, 182, 50, 4, 58, 24, 116, // .......2.:.t - 45, 74, 77, 21, 38, 227, 37, 251, 134, 154, 218, 48, // -JM.&.%....0 - 32, 108, 73, 184, 237, 31, 217, 197, 38, 93, 150, 131, // lI.....&].. - 190, 141, 98, 55, 119, 190, 149, 35, 179, 98, 240, 193, // ..b7w..#.b.. - 100, 154, 75, 147, 26, 191, 51, 144, 106, 98, 63, 228, // d.K...3.jb?. - 2, 94, 197, 203, 245, 224, 118, 47, 129, 53, 141, 47, // .^....v/.5./ - 147, 191, 138, 75, 64, 188, 96, 30, 186, 119, 227, 202, // ...K@.`..w.. - 41, 143, 8, 93, 190, 236, 141, 198, 54, 226, 117, 199, // )..]....6.u. - 57, 9, 29, 79, 95, 2, 59, 62, 254, 197, 128, 176, // 9..O_.;>.... - 171, 113, 8, 230, 196, 117, 106, 48, 109, 32, 47, 102, // .q...uj0m /f - 13, 140, 23, 179, 14, 8, 183, 211, 153, 188, 123, 157, // ..........{. - 232, 11, 125, 111, 204, 67, 167, 187, 211, 238, 46, 121, // ..}o.C.....y - 230, 133, 116, 150, 124, 232, 162, 139, 156, 211, 65, 100, // ..t.|.....Ad - 189, 93, 1, 152, 238, 253, 157, 46, 223, 143, 8, 9, // .].......... - 44, 61, 191, 69, 161, 211, 205, 111, 119, 195, 215, 58, // ,=.E...ow..: - 153, 86, 9, 127, 50, 224, 121, 167, 170, 59, 67, 149, // .V..2.y..;C. - 82, 104, 70, 231, 73, 177, 65, 73, 223, 113, 120, 109, // RhF.I.AI.qxm - 30, 186, 75, 224, 10, 90, 153, 135, 201, 117, 50, 173, // ..K..Z...u2. - 19, 15, 7, 173, 81, 236, 73, 169, 115, 143, 104, 138, // ....Q.I.s.h. - 47, 24, 157, 13, 228, 167, 99, 86, 18, 114, 28, 115, // /.....cV.r.s - 96, 95, 13, 77, 242, 228, 42, 41, 23, 217, 12, 158, // `_.M..*).... - 121, 147, 21, 101, 127, 8, 243, 60, 187, 57, 81, 255, // y..e...<.9Q. - 246, 230, 251, 239, 108, 254, 122, 204, 122, 190, 188, 184, // ....l.z.z... - 25, 84, 185, 198, 48, 27, 39, 170, 17, 133, 229, 204, // .T..0.'..... - 60, 145, 167, 121, 50, 63, 81, 53, 211, 204, 0, 205, // <..y2?Q5.... - 149, 19, 165, 111, 199, 233, 236, 115, 167, 209, 134, 97, // ...o...s...a - 91, 27, 234, 75, 54, 151, 71, 71, 213, 248, 82, 147, // [..K6.GG..R. - 238, 68, 237, 83, 151, 76, 57, 81, 154, 53, 107, 76, // .D.S.L9Q.5kL - 93, 48, 145, 90, 24, 169, 19, 153, 143, 152, 10, 186, // ]0.Z........ - 51, 25, 207, 57, 193, 231, 246, 79, 5, 147, 70, 143, // 3..9...O..F. - 164, 67, 171, 161, 77, 186, 189, 117, 99, 167, 193, 108, // .C..M..uc..l - 217, 161, 242, 142, 142, 218, 212, 231, 188, 76, 136, 126, // .........L.~ - 47, 176, 222, 251, 67, 213, 247, 79, 212, 107, 4, 31, // /...C..O.k.. - 234, 213, 54, 45, 151, 155, 52, 81, 103, 176, 18, 0, // ..6-..4Qg... - 131, 218, 249, 178, 128, 189, 42, 250, 31, 244, 170, 222, // ......*..... - 7, 232, 30, 236, 119, 127, 33, 41, 253, 119, 58, 31, // ....w.!).w:. - 31, 171, 247, 17, 250, 71, 39, 234, 63, 114, 122, 236, // .....G'.?rz. - 55, 128, 121, 0, 122, 13, 220, 101, 111, 183, 238, 254, // 7.y.z..eo... - 57, 232, 16, 253, 160, 194, 31, 102, 109, 57, 5, 58, // 9......fm9.: - 95, 235, 246, 15, 173, 85, 131, 80, 160, 49, 137, 221, // _....U.P.1.. - 206, 117, 7, 103, 97, 114, 154, 40, 0, 24, 127, 39, // .u.gar.(...' - 183, 35, 85, 118, 65, 161, 208, 179, 41, 125, 171, 105, // .#UvA...)}.i - 86, 37, 232, 106, 29, 29, 60, 203, 17, 100, 8, 8, // V%.j..<..d.. - 155, 25, 0, 80, 105, 155, 215, 145, 69, 50, 142, 30, // ...Pi...E2.. - 11, 176, 119, 70, 132, 126, 78, 242, 204, 98, 39, 68, // ..wF.~N..b'D - 56, 49, 135, 9, 40, 227, 119, 26, 61, 22, 96, 143, // 81..(.w.=.`. - 213, 221, 255, 0, 234, 217, 122, 198, 158, 242, 123, 73, // ......z...{I - 235, 54, 142, 133, 206, 123, 127, 200, 143, 73, 60, 210, // .6...{...I<. - 189, 55, 161, 119, 66, 129, 90, 205, 78, 90, 149, 119, // .7.wB.Z.NZ.w - 119, 127, 188, 58, 135, 103, 68, 232, 214, 77, 117, 103, // w..:.gD..Mug - 171, 190, 218, 89, 69, 98, 157, 232, 231, 144, 255, 163, // ...YEb...... - 247, 73, 229, 6, 223, 118, 3, 175, 51, 141, 139, 228, // .I...v..3... - 238, 22, 114, 239, 254, 87, 149, 251, 235, 213, 206, 82, // ..r..W.....R - 111, 59, 224, 43, 200, 21, 5, 3, 85, 32, 106, 189, // o;.+....U j. - 63, 176, 145, 237, 176, 64, 249, 156, 181, 115, 154, 123, // ?....@...s.{ - 182, 115, 38, 48, 106, 226, 187, 106, 67, 216, 222, 199, // .s&0j..jC... - 125, 121, 107, 66, 153, 38, 180, 161, 117, 81, 127, 125, // }ykB.&..uQ.} - 253, 178, 87, 223, 45, 171, 204, 207, 78, 223, 245, 210, // ..W.-...N... - 151, 67, 171, 29, 177, 105, 19, 33, 216, 153, 29, 116, // .C...i.!...t - 39, 225, 239, 192, 28, 198, 74, 87, 182, 166, 153, 169, // '.....JW.... - 107, 115, 14, 205, 215, 53, 240, 157, 89, 181, 124, 245, // ks...5..Y.|. - 90, 23, 218, 121, 179, 49, 77, 151, 69, 2, 184, 51, // Z..y.1M.E..3 - 68, 98, 188, 187, 218, 11, 177, 227, 227, 205, 85, 20, // Db........U. - 16, 246, 60, 140, 168, 38, 198, 139, 175, 247, 104, 241, // ..<..&....h. - 98, 118, 47, 41, 94, 204, 14, 226, 36, 51, 187, 102, // bv/)^...$3.f - 98, 47, 244, 187, 88, 186, 202, 182, 149, 212, 126, 2, // b/..X.....~. - 29, 218, 250, 182, 73, 105, 225, 101, 220, 192, 65, 196, // ....Ii.e..A. - 76, 219, 253, 152, 85, 36, 137, 194, 208, 15, 187, 184, // L...U$...... - 57, 196, 205, 212, 63, 140, 93, 133, 20, 100, 124, 187, // 9...?.]..d|. - 110, 49, 213, 120, 137, 6, 179, 198, 170, 61, 72, 38, // n1.x.....=H& - 215, 11, 15, 144, 201, 245, 62, 137, 136, 190, 193, 88, // ......>....X - 28, 13, 85, 98, 207, 49, 66, 101, 185, 114, 135, 222, // ..Ub.1Be.r.. - 208, 239, 117, 111, 55, 23, 135, 136, 101, 204, 164, 38, // ..uo7...e..& - 213, 157, 217, 13, 33, 166, 41, 19, 197, 104, 144, 185, // ....!.)..h.. - 25, 119, 35, 122, 217, 234, 41, 226, 198, 92, 118, 222, // .w#z..)...v. - 250, 165, 68, 127, 247, 9, 116, 191, 53, 118, 189, 193, // ..D...t.5v.. - 142, 160, 14, 225, 198, 158, 29, 38, 234, 235, 105, 189, // .......&..i. - 234, 174, 173, 25, 90, 116, 103, 108, 155, 212, 115, 88, // ....Ztgl..sX - 133, 85, 137, 221, 188, 222, 36, 240, 222, 50, 108, 3, // .U....$..2l. - 236, 24, 76, 29, 175, 46, 232, 91, 62, 221, 28, 251, // ..L....[>... - 47, 111, 245, 173, 175, 93, 119, 179, 195, 159, 251, 233, // /o...]w..... - 102, 104, 51, 204, 169, 87, 245, 13, 30, 182, 101, 210, // fh3..W....e. - 229, 213, 222, 107, 150, 127, 196, 114, 109, 242, 100, 111, // ...k...rm.do - 76, 251, 222, 118, 251, 13, 69, 189, 153, 150, 205, 48, // L..v..E....0 - 175, 65, 44, 172, 40, 96, 208, 95, 133, 128, 187, 131, // .A,.(`._.... - 136, 125, 242, 5, 144, 217, 225, 221, 217, 1, 152, 122, // .}.........z - 29, 70, 155, 135, 78, 96, 185, 119, 31, 232, 61, 127, // .F..N`.w..=. - 77, 6, 1, 17, 2, 7, 61, 166, 126, 124, 104, 84, // M.....=.~|hT - 117, 193, 233, 84, 153, 11, 103, 77, 216, 89, 97, 112, // u..T..gM.Yap - 60, 79, 202, 254, 157, 232, 235, 161, 176, 172, 94, 83, // ......._... - 11, 222, 223, 159, 255, 4, 24, 54, 184, 181, 156, 115, // .......6...s - 199, 52, 84, 215, 136, 134, 223, 127, 252, 112, 162, 46, // .4T......p.. - 119, 12, 244, 84, 43, 204, 38, 53, 234, 48, 251, 208, // w..T+.&5.0.. - 170, 80, 232, 255, 162, 96, 186, 26, 249, 203, 66, 212, // .P...`....B. - 134, 13, 164, 70, 187, 131, 38, 133, 38, 131, 220, 219, // ...F..&.&... - 107, 38, 48, 209, 76, 191, 117, 207, 42, 205, 230, 223, // k&0.L.u.*... - 107, 253, 100, 252, 250, 222, 65, 236, 247, 181, 190, 205, // k.d...A..... - 134, 128, 15, 225, 35, 158, 191, 201, 243, 44, 151, 39, // ....#....,.' - 15, 79, 47, 176, 171, 150, 7, 134, 137, 95, 39, 231, // .O/......_'. - 219, 121, 255, 195, 135, 7, 95, 134, 125, 110, 168, 100, // .y...._.}n.d - 194, 5, 152, 224, 122, 109, 205, 175, 19, 124, 121, 219, // ....zm...|y. - 190, 227, 6, 213, 166, 86, 55, 29, 65, 207, 184, 220, // .....V7.A... - 22, 122, 131, 76, 221, 234, 182, 174, 146, 162, 136, 245, // .z.L........ - 37, 250, 172, 160, 17, 107, 46, 61, 54, 116, 20, 17, // %....k.=6t.. - 166, 117, 250, 113, 247, 232, 159, 58, 102, 251, 247, 183, // .u.q...:f... - 111, 213, 183, 89, 126, 21, 231, 12, 225, 63, 29, 173, // o..Y~....?.. - 133, 234, 243, 12, 215, 1, 243, 255, 205, 154, 162, 160, // ............ - 167, 188, 168, 167, 108, 121, 118, 35, 91, 246, 234, 255, // ....lyv#[... - 202, 242, 135, 100, 109, 126, 167, 163, 242, 14, 70, 1, // ...dm~....F. - 7, 253, 118, 115, 191, 241, 16, 230, 150, 248, 241, 3, // ..vs........ - 24, 200, 212, 111, 248, 187, 166, 249, 94, 224, 215, 153, // ...o....^... - 90, 126, 249, 52, 255, 97, 219, 14, 4, 187, 179, 55, // Z~.4.a.....7 - 61, 250, 173, 88, 176, 117, 139, 243, 139, 123, 22, 243, // =..X.u...{.. - 73, 236, 222, 102, 155, 229, 84, 189, 254, 207, 251, 112, // I..f..T....p - 43, 217, 254, 67, 126, 125, 31, 102, 85, 251, 111, 131, // +..C~}.fU.o. - 215, 219, 79, 224, 85, 126, 2, 175, 242, 239, 199, 235, // ..O.U~...... - 23, 56, 247, 222, 211, 251, 92, 57, 213, 184, 235, 202, // .8.....9.... - 117, 77, 21, 118, 210, 32, 55, 175, 60, 91, 199, 37, // uM.v. 7.<[.% - 109, 23, 185, 167, 207, 123, 47, 188, 219, 199, 7, 162, // m....{/..... - 125, 9, 2, 243, 77, 177, 44, 186, 238, 185, 250, 113, // }...M.,....q - 131, 56, 77, 234, 171, 126, 192, 186, 243, 62, 116, 215, // .8M..~...>t. - 94, 124, 19, 17, 236, 41, 16, 8, 142, 152, 95, 215, // ^|...)...._. - 26, 219, 196, 203, 178, 220, 136, 190, 253, 79, 37, 116, // .........O%t - 135, 139, 73, 242, 27, 217, 133, 212, 80, 226, 106, 191, // ..I.....P.j. - 38, 129, 190, 186, 138, 81, 218, 78, 167, 0, 192, 183, // &....Q.N.... - 211, 55, 74, 174, 87, 230, 217, 28, 14, 121, 54, 228, // .7J.W....y6. - 15, 3, 39, 75, 128, 204, 17, 86, 172, 183, 113, 90, // ..'K...V..qZ - 131, 65, 196, 201, 229, 172, 160, 253, 83, 181, 202, 102, // .A......S..f - 137, 189, 127, 188, 180, 199, 187, 178, 101, 125, 148, 122, // ........e}.z - 11, 44, 95, 87, 88, 242, 70, 222, 121, 66, 87, 60, // .,_WX.F.yBW< - 211, 63, 64, 140, 56, 205, 32, 57, 205, 86, 152, 120, // .?@.8. 9.V.x - 166, 137, 40, 107, 181, 57, 182, 134, 99, 218, 121, 58, // ..(k.9..c.y: - 181, 77, 103, 132, 18, 139, 111, 172, 41, 130, 205, 56, // .Mg...o.)..8 - 41, 114, 145, 241, 119, 72, 72, 53, 30, 112, 196, 229, // )r..wHH5.p.. - 201, 47, 194, 246, 201, 20, 11, 124, 122, 219, 131, 222, // ./.....|z... - 247, 78, 84, 79, 191, 149, 124, 241, 151, 147, 191, 124, // .NTO..|....| - 255, 250, 109, 111, 168, 122, 136, 244, 81, 255, 221, 95, // ..mo.z..Q.._ - 95, 161, 188, 156, 213, 69, 6, 82, 250, 225, 78, 252, // _....E.R..N. - 245, 9, 217, 250, 167, 242, 21, 102, 71, 207, 75, 103, // .......fG.Kg - 191, 169, 159, 0, 124, 245, 146, 122, 112, 192, 214, 32, // ....|..zp.. - 196, 248, 33, 101, 219, 1, 59, 83, 183, 245, 239, 108, // ..!e..;S...l - 27, 234, 159, 140, 194, 54, 207, 242, 219, 219, 136, 38, // .....6.....& - 102, 249, 39, 53, 54, 119, 238, 252, 61, 219, 108, 218, // f.'56w..=.l. - 239, 200, 246, 98, 242, 173, 121, 143, 126, 231, 21, 250, // ...b..y.~... - 113, 247, 117, 121, 39, 227, 161, 115, 222, 223, 25, 102, // q.uy'..s...f - 126, 249, 225, 193, 144, 108, 185, 198, 62, 163, 152, 242, // ~....l..>... - 156, 163, 243, 235, 77, 250, 109, 21, 248, 107, 146, 41, // ....M.m..k.) - 218, 231, 67, 156, 255, 180, 147, 11, 97, 200, 143, 254, // ..C.....a... - 58, 77, 99, 215, 78, 196, 216, 239, 218, 197, 88, 11, // :Mc.N.....X. - 200, 155, 187, 176, 90, 88, 254, 26, 121, 23, 130, 157, // ....ZX..y... - 254, 221, 114, 242, 245, 121, 245, 187, 74, 117, 214, 4, // ..r..y..Ju.. - 95, 15, 37, 151, 54, 86, 8, 9, 92, 44, 139, 50, // _.%.6V...,.2 - 203, 111, 208, 126, 166, 75, 54, 72, 4, 210, 156, 197, // .o.~.K6H.... - 197, 194, 212, 12, 142, 244, 175, 59, 24, 208, 60, 101, // .......;.....gib. + 92, 0, 232, 147, 105, 182, 6, 134, 47, 249, 165, 78, // ....i.../..N + 213, 221, 19, 165, 166, 217, 252, 68, 109, 242, 108, 131, // .......Dm.l. + 138, 51, 1, 242, 211, 179, 226, 106, 174, 166, 105, 92, // .3.....j..i. + 20, 167, 95, 221, 73, 147, 45, 79, 59, 117, 179, 74, // .._.I.-O;u.J + 215, 197, 105, 111, 81, 150, 155, 147, 227, 227, 235, 235, // ..ioQ....... + 107, 251, 218, 183, 179, 124, 126, 236, 57, 142, 115, 140, // k....|~.9.s. + 97, 61, 117, 185, 76, 211, 211, 222, 58, 91, 39, 61, // a=u.L...:['= + 117, 181, 76, 174, 255, 154, 221, 156, 246, 28, 229, 40, // u.L........( + 47, 192, 95, 143, 11, 204, 62, 37, 214, 245, 114, 86, // /._...>%..rV + 46, 78, 123, 174, 29, 86, 85, 167, 189, 233, 54, 199, // .N{..VU...6. + 74, 203, 23, 89, 154, 229, 189, 51, 245, 108, 19, 131, // J..Y...3.l.. + 132, 166, 127, 186, 92, 39, 211, 120, 115, 218, 203, 51, // .....'.xs..3 + 172, 167, 215, 174, 254, 57, 91, 174, 235, 250, 217, 105, // .....9[....i + 239, 245, 196, 14, 39, 129, 242, 237, 73, 48, 181, 157, // ....'...I0.. + 137, 101, 135, 129, 103, 135, 145, 133, 103, 229, 218, 174, // .e..g...g... + 203, 194, 2, 53, 19, 127, 106, 135, 33, 48, 115, 109, // ...5..j.!0sm + 199, 179, 253, 201, 88, 90, 209, 152, 218, 158, 235, 227, // ....XZ...... + 193, 27, 187, 0, 16, 249, 182, 63, 10, 108, 223, 245, // .......?.l.. + 237, 104, 28, 217, 81, 16, 218, 227, 145, 237, 160, 202, // .h..Q....... + 9, 108, 55, 64, 113, 236, 219, 158, 103, 187, 222, 200, // .l7@q...g... + 246, 61, 84, 77, 34, 123, 228, 217, 94, 56, 34, 224, // .=TM"{..^8". + 81, 136, 134, 32, 5, 48, 119, 100, 217, 65, 24, 197, // Q.. .0wd.A.. + 152, 196, 11, 149, 254, 4, 93, 48, 163, 63, 178, 131, // ......]0.?.. + 9, 187, 76, 34, 133, 129, 193, 232, 94, 31, 203, 246, // ..L"....^... + 34, 60, 6, 190, 155, 90, 0, 234, 248, 246, 216, 27, // "<...Z...... + 77, 81, 59, 193, 212, 1, 224, 250, 99, 59, 114, 125, // MQ;.....c;r} + 22, 176, 128, 137, 23, 3, 133, 112, 162, 244, 39, 1, // .......p..'. + 56, 10, 8, 133, 24, 225, 56, 192, 114, 52, 182, 93, // 8.....8.r4.] + 140, 0, 110, 1, 168, 196, 169, 29, 7, 171, 242, 198, // ..n......... + 83, 59, 192, 10, 252, 208, 14, 253, 192, 158, 132, 65, // S;.........A + 53, 45, 103, 245, 64, 160, 7, 176, 195, 18, 162, 9, // 5-g.@....... + 214, 32, 216, 85, 11, 197, 100, 126, 24, 90, 152, 9, // . .U..d~.Z.. + 120, 141, 80, 112, 70, 30, 145, 31, 69, 164, 8, 48, // x.PpF...E..0 + 4, 129, 228, 195, 44, 144, 20, 28, 115, 16, 150, 224, // ....,...s... + 142, 49, 38, 28, 99, 234, 9, 6, 70, 65, 96, 143, // .1&.c...FA`. + 163, 73, 106, 213, 124, 225, 66, 192, 229, 128, 189, 34, // .Ij.|.B...." + 112, 140, 40, 8, 235, 220, 133, 69, 206, 6, 232, 64, // p.(....E...@ + 214, 114, 62, 207, 34, 111, 173, 138, 243, 26, 138, 165, // .r>."o...... + 185, 11, 48, 17, 219, 71, 160, 161, 239, 162, 4, 14, // ..0..G...... + 203, 124, 22, 120, 76, 20, 61, 37, 31, 21, 138, 22, // .|.xL.=%.... + 185, 76, 28, 61, 46, 108, 130, 190, 88, 19, 89, 173, // .L.=.l..X.Y. + 23, 102, 9, 175, 53, 13, 14, 242, 90, 83, 202, 34, // .f..5...ZS." + 187, 133, 162, 35, 235, 48, 69, 65, 119, 75, 179, 155, // ...#.0EAwK.. + 172, 33, 54, 152, 22, 253, 57, 89, 128, 122, 80, 24, // .!6...9Y.zP. + 236, 182, 185, 126, 205, 237, 137, 79, 76, 249, 41, 220, // ...~...OL.). + 182, 132, 219, 100, 54, 23, 55, 38, 19, 198, 154, 9, // ...d6.7&.... + 122, 136, 150, 34, 129, 59, 62, 40, 108, 50, 123, 250, // z..".;>(l2{. + 24, 138, 20, 91, 75, 120, 206, 229, 70, 194, 113, 48, // ...[Kx..F.q0 + 60, 34, 191, 49, 19, 233, 225, 169, 134, 42, 194, 125, // <".1.....*.} + 104, 12, 85, 6, 53, 14, 84, 72, 147, 115, 12, 134, // h.U.5.TH.s.. + 179, 0, 37, 10, 199, 30, 33, 134, 134, 1, 224, 56, // ..%...!....8 + 32, 7, 154, 85, 191, 244, 212, 241, 63, 97, 18, 92, // ..U....?a.. + 160, 238, 197, 190, 242, 169, 238, 174, 21, 225, 75, 63, // ..........K? + 56, 46, 202, 6, 56, 13, 216, 217, 79, 67, 24, 197, // 8...8...OC.. + 229, 250, 50, 251, 163, 89, 69, 112, 140, 12, 228, 103, // ..2..YEp...g + 10, 70, 128, 205, 142, 23, 211, 6, 140, 42, 134, 210, // .F.......*.. + 212, 141, 67, 15, 26, 50, 114, 168, 235, 99, 63, 106, // ..C..2r..c?j + 117, 112, 170, 14, 126, 61, 220, 125, 237, 185, 164, 235, // up..~=.}.... + 68, 77, 52, 93, 221, 49, 190, 245, 19, 0, 226, 225, // DM4].1...... + 151, 149, 53, 177, 40, 15, 11, 200, 219, 248, 138, 31, // ..5.(....... + 231, 174, 247, 126, 12, 36, 238, 17, 253, 34, 75, 203, // ...~.$..."K. + 63, 26, 209, 185, 116, 5, 77, 13, 83, 215, 177, 67, // ?...t.M.S..C + 75, 168, 255, 202, 133, 98, 224, 105, 65, 42, 188, 154, // K....b.iA*.. + 176, 135, 231, 74, 63, 79, 186, 158, 115, 208, 61, 234, // ...J?O..s.=. + 44, 178, 85, 242, 71, 163, 142, 39, 18, 233, 165, 99, // ,.U.G..'...c + 250, 26, 139, 159, 48, 90, 129, 248, 179, 9, 77, 77, // ....0Z....MM + 232, 85, 197, 112, 226, 42, 231, 85, 69, 166, 215, 129, // .U.p.*.UE... + 29, 42, 18, 238, 10, 116, 132, 65, 154, 194, 189, 69, // .*...t.A...E + 104, 12, 157, 64, 181, 237, 148, 124, 158, 75, 71, 11, // h..@...|.KG. + 46, 100, 132, 142, 86, 213, 209, 106, 117, 209, 229, 5, // .d..V..ju... + 209, 153, 178, 93, 98, 2, 212, 236, 3, 124, 239, 185, // ...]b....|.. + 139, 64, 38, 108, 247, 178, 154, 110, 26, 208, 123, 206, // .@&l...n..{. + 248, 154, 220, 5, 99, 133, 203, 45, 102, 42, 225, 102, // ....c..-f*.f + 17, 95, 253, 225, 184, 9, 39, 16, 42, 202, 238, 123, // ._....'.*..{ + 150, 68, 202, 3, 210, 96, 132, 106, 214, 188, 103, 219, // .D...`.j..g. + 10, 182, 225, 220, 29, 63, 23, 214, 203, 7, 77, 133, // .....?....M. + 231, 176, 20, 93, 185, 222, 94, 3, 108, 136, 180, 157, // ...]..^.l... + 71, 123, 13, 90, 177, 198, 239, 247, 235, 35, 193, 96, // G{.Z.....#.` + 129, 5, 114, 166, 133, 53, 185, 103, 101, 226, 188, 240, // ..r..5.ge... + 255, 104, 164, 23, 106, 68, 178, 112, 16, 218, 88, 29, // .h..jD.p..X. + 79, 30, 86, 150, 240, 37, 4, 129, 228, 185, 75, 143, // O.V..%....K. + 29, 246, 4, 151, 219, 245, 180, 92, 102, 107, 245, 46, // ........fk.. + 185, 41, 223, 199, 233, 54, 25, 220, 93, 241, 107, 136, // .)...6..].k. + 205, 74, 121, 185, 30, 170, 217, 178, 136, 47, 210, 100, // .Jy....../.d + 54, 84, 155, 52, 158, 38, 139, 44, 149, 237, 72, 121, // 6T.4.&.,..Hy + 187, 65, 159, 120, 54, 203, 214, 111, 150, 243, 69, 105, // .A.x6..o..Ei + 202, 175, 146, 75, 22, 203, 18, 93, 86, 75, 12, 95, // ...K...]VK._ + 197, 55, 0, 85, 38, 27, 20, 183, 105, 185, 59, 50, // .7.U&...i.;2 + 27, 15, 110, 69, 62, 92, 204, 101, 154, 191, 206, 63, // ..nE>..e...? + 98, 67, 82, 109, 112, 6, 253, 139, 185, 117, 189, 88, // bCRmp....u.X + 150, 73, 255, 232, 41, 250, 214, 219, 157, 193, 224, 136, // .I..)....... + 76, 187, 83, 203, 75, 53, 224, 252, 234, 244, 84, 245, // L.S.K5....T. + 215, 219, 213, 69, 146, 247, 143, 212, 116, 145, 76, 63, // ...E....t.L? + 1, 247, 193, 215, 50, 241, 215, 50, 243, 215, 178, 152, // ....2..2.... + 163, 167, 106, 55, 84, 31, 62, 10, 60, 34, 163, 254, // ..j7T.>.<".. + 241, 15, 12, 117, 251, 26, 41, 121, 114, 159, 214, 120, // ...u..)yr..x + 85, 144, 128, 84, 69, 159, 65, 179, 152, 43, 189, 4, // U..TE.A..+.. + 165, 49, 223, 199, 86, 9, 118, 232, 173, 254, 237, 223, // .1..V.v..... + 212, 149, 122, 70, 42, 28, 181, 186, 230, 201, 204, 114, // ..zF*......r + 29, 7, 14, 143, 155, 66, 121, 132, 52, 117, 198, 198, // .....By.4u.. + 55, 122, 236, 25, 231, 251, 210, 177, 187, 6, 253, 21, // 7z.......... + 240, 230, 34, 237, 85, 92, 78, 23, 131, 227, 255, 111, // ..".U.N....o + 127, 253, 255, 236, 129, 253, 245, 209, 241, 81, 211, 105, // .........Q.i + 182, 156, 47, 75, 238, 3, 87, 234, 47, 106, 245, 193, // ../K..W./j.. + 253, 104, 167, 201, 122, 14, 9, 60, 81, 78, 211, 43, // .h..z..w.@... + 204, 250, 149, 128, 253, 122, 176, 129, 162, 38, 223, 165, // .....z...&.. + 89, 92, 14, 64, 238, 99, 225, 210, 145, 93, 102, 223, // Y..@.c...]f. + 45, 111, 146, 217, 64, 227, 110, 134, 236, 42, 94, 92, // -o..@.n..*^. + 174, 7, 87, 13, 41, 14, 99, 33, 104, 202, 12, 186, // ..W.).c!h... + 244, 63, 31, 134, 156, 39, 229, 54, 95, 107, 19, 241, // .?...'.6_k.. + 228, 217, 108, 121, 101, 108, 68, 239, 50, 77, 110, 212, // ..lyelD.2Mn. + 181, 117, 185, 77, 83, 5, 182, 175, 10, 107, 10, 53, // .u.MS....k.5 + 198, 190, 91, 116, 50, 153, 25, 246, 168, 98, 17, 207, // ..[t2....b.. + 178, 107, 171, 88, 169, 175, 238, 46, 230, 187, 222, 25, // .k.X........ + 128, 126, 117, 87, 107, 9, 121, 108, 236, 207, 38, 94, // .~uWk.yl..&^ + 87, 192, 151, 107, 234, 184, 37, 115, 92, 102, 235, 210, // W..k..%s.f.. + 90, 103, 249, 10, 146, 88, 230, 16, 68, 40, 135, 218, // Zg...X..D(.. + 220, 90, 110, 45, 0, 10, 66, 81, 164, 168, 22, 177, // .Zn-..BQ.... + 232, 32, 99, 186, 204, 243, 248, 214, 242, 209, 184, 185, // . c......... + 177, 60, 85, 66, 201, 117, 85, 136, 42, 121, 186, 41, // .[.7.R...Qh. + 143, 127, 168, 62, 71, 245, 119, 181, 89, 64, 83, 85, // ...>G.w.Y@SU + 220, 105, 242, 162, 70, 190, 13, 99, 32, 136, 168, 225, // .i..F..c ... + 215, 142, 186, 128, 50, 62, 119, 20, 109, 22, 227, 155, // ....2>w.m... + 157, 146, 126, 149, 164, 161, 178, 42, 238, 148, 109, 219, // ..~....*..m. + 192, 13, 198, 68, 195, 50, 52, 18, 114, 118, 169, 195, // ...D.24.rv.. + 149, 128, 208, 21, 7, 12, 119, 72, 69, 80, 11, 36, // ......wHEP.$ + 67, 196, 181, 79, 129, 17, 137, 210, 88, 180, 147, 166, // C..O....X... + 37, 64, 203, 101, 54, 221, 22, 39, 217, 182, 20, 118, // %@.e6..'...v + 208, 190, 215, 43, 62, 129, 225, 46, 178, 28, 149, 165, // ...+>....... + 21, 167, 105, 118, 141, 9, 235, 54, 48, 68, 96, 144, // ..iv...60D`. + 31, 117, 101, 135, 236, 189, 246, 172, 244, 56, 205, 211, // .ue......8.. + 14, 230, 185, 17, 18, 49, 171, 191, 129, 148, 164, 191, // .....1...... + 137, 148, 168, 236, 42, 201, 47, 83, 10, 244, 52, 207, // ....*./S..4. + 210, 148, 62, 233, 54, 133, 27, 3, 55, 181, 123, 59, // ..>.6...7.{; + 81, 161, 243, 63, 158, 214, 210, 36, 232, 215, 226, 36, // Q..?...$...$ + 223, 79, 187, 46, 231, 109, 146, 194, 170, 31, 116, 58, // .O...m....t: + 217, 134, 61, 138, 198, 251, 116, 252, 70, 153, 189, 92, // ..=...t.F... + 151, 208, 226, 27, 90, 164, 27, 106, 184, 216, 11, 84, // ....Z..j...T + 14, 96, 47, 255, 210, 121, 58, 81, 55, 143, 152, 51, // .`/..y:Q7..3 + 109, 54, 4, 222, 96, 207, 152, 29, 29, 176, 2, 133, // m6..`....... + 96, 124, 88, 86, 13, 107, 140, 232, 85, 146, 216, 230, // `|XV.k..U... + 142, 177, 11, 141, 56, 186, 45, 82, 71, 135, 133, 174, // ....8.-RG... + 146, 236, 71, 132, 175, 119, 80, 23, 181, 32, 25, 58, // ..G..wP.. .: + 194, 19, 108, 6, 87, 77, 196, 163, 171, 27, 117, 253, // ..l.WM....u. + 224, 124, 220, 41, 189, 56, 129, 194, 10, 146, 85, 235, // .|.).8....U. + 241, 25, 43, 220, 143, 154, 151, 71, 15, 49, 243, 122, // ..+....G.1.z + 9, 103, 115, 128, 153, 29, 206, 129, 92, 233, 114, 250, // .gs.......r. + 105, 143, 254, 127, 50, 78, 186, 238, 118, 49, 71, 143, // i...2N..v1G. + 63, 233, 106, 240, 147, 190, 239, 2, 69, 18, 169, 15, // ?.j.....E... + 142, 246, 43, 45, 163, 247, 107, 70, 149, 121, 119, 84, // ..+-..kF.ywT + 153, 199, 107, 45, 247, 55, 86, 40, 227, 218, 53, 122, // ..k-.7V(..5z + 100, 151, 191, 23, 219, 178, 196, 90, 196, 228, 245, 244, // d......Z.... + 67, 175, 194, 89, 51, 155, 165, 93, 215, 16, 181, 149, // C..Y3..].... + 113, 97, 69, 48, 62, 174, 171, 77, 79, 177, 200, 151, // qaE0>..MO... + 235, 79, 150, 163, 12, 211, 54, 8, 221, 90, 142, 66, // .O....6..Z.B + 75, 138, 81, 65, 175, 42, 8, 142, 144, 96, 40, 168, // K.QA.*...`(. + 146, 242, 146, 244, 181, 166, 12, 19, 11, 53, 219, 230, // .........5.. + 177, 60, 99, 233, 42, 137, 139, 196, 130, 250, 65, 98, // ..28.*... + 55, 130, 245, 158, 191, 137, 62, 48, 168, 217, 204, 26, // 7.....>0.... + 92, 52, 214, 109, 68, 164, 223, 80, 249, 4, 164, 85, // .4.mD..P...U + 236, 190, 177, 22, 215, 152, 46, 175, 160, 22, 144, 142, // ............ + 36, 47, 81, 172, 53, 227, 23, 16, 240, 160, 115, 140, // $/Q.5.....s. + 47, 138, 44, 221, 150, 244, 146, 152, 143, 174, 174, 177, // /.,......... + 169, 201, 90, 148, 35, 160, 106, 68, 164, 190, 174, 214, // ..Z.#.jD.... + 103, 202, 120, 220, 88, 81, 239, 160, 73, 110, 239, 119, // g.x.XQ..In.w + 160, 34, 93, 229, 131, 95, 156, 146, 183, 65, 3, 17, // ."].._...A.. + 19, 9, 160, 46, 168, 61, 116, 227, 45, 228, 195, 64, // .....=t.-..@ + 198, 62, 205, 18, 21, 172, 119, 1, 58, 38, 168, 157, // .>....w.:&.. + 121, 58, 223, 119, 229, 172, 18, 7, 238, 234, 175, 11, // y:.w........ + 236, 115, 62, 233, 98, 37, 99, 237, 168, 64, 156, 57, // .s>.b%c..@.9 + 3, 153, 218, 197, 115, 63, 210, 114, 253, 18, 111, 24, // ....s?.r..o. + 172, 247, 240, 182, 130, 186, 254, 65, 127, 37, 68, 108, // .......A.%Dl + 117, 187, 223, 177, 14, 215, 58, 189, 196, 56, 100, 159, // u.....:..8d. + 106, 211, 128, 226, 137, 41, 94, 198, 203, 180, 182, 13, // j....)^..... + 58, 242, 139, 148, 233, 220, 55, 190, 54, 73, 214, 98, // :.....7.6I.b + 87, 37, 250, 100, 21, 95, 218, 176, 66, 219, 138, 214, // W%.d._..B... + 44, 199, 199, 15, 33, 183, 74, 45, 31, 176, 157, 122, // ,...!.J-...z + 63, 91, 114, 3, 177, 143, 229, 166, 234, 222, 49, 168, // ?[r.......1. + 218, 181, 183, 60, 255, 4, 59, 80, 56, 109, 86, 192, // ...<..;P8mV. + 83, 111, 30, 2, 98, 216, 187, 42, 171, 77, 74, 39, // So..b..*.MJ' + 124, 224, 54, 246, 236, 249, 250, 150, 2, 45, 185, 14, // |.6......-.. + 177, 130, 35, 248, 164, 166, 136, 24, 215, 136, 226, 248, // ..#......... + 38, 84, 149, 139, 101, 193, 247, 163, 137, 189, 55, 207, // &T..e.....7. + 227, 75, 13, 180, 70, 60, 202, 145, 131, 62, 73, 123, // .K..F<...>I{ + 130, 202, 44, 236, 246, 226, 118, 26, 218, 67, 110, 171, // ..,...v..Cn. + 18, 224, 213, 172, 17, 224, 238, 171, 0, 237, 57, 187, // ..........9. + 155, 226, 251, 209, 246, 30, 138, 85, 252, 108, 102, 44, // .......U.lf, + 114, 43, 91, 167, 183, 189, 179, 23, 68, 164, 138, 85, // r+[.....D..U + 247, 7, 212, 239, 161, 123, 38, 106, 222, 127, 167, 204, // .....{&j.... + 191, 234, 157, 115, 231, 245, 241, 129, 56, 125, 31, 188, // ...s....8}.. + 50, 111, 152, 249, 202, 56, 178, 189, 49, 223, 10, 183, // 2o...8..1... + 207, 0, 229, 188, 156, 39, 254, 78, 244, 106, 44, 233, // .....'.N.j,. + 18, 78, 202, 211, 59, 143, 47, 213, 91, 29, 93, 167, // .N..;./.[.]. + 233, 231, 242, 224, 15, 133, 244, 193, 126, 150, 238, 167, // ........~... + 135, 56, 210, 207, 234, 246, 51, 19, 91, 21, 64, 153, // .8....3.[.@. + 187, 70, 240, 151, 61, 53, 57, 32, 63, 247, 5, 170, // .F..=59 ?... + 253, 216, 122, 168, 139, 85, 100, 187, 23, 168, 106, 39, // ..z..Ud...j' + 241, 42, 155, 211, 45, 254, 134, 103, 4, 29, 30, 50, // .*..-..g...2 + 137, 193, 199, 118, 101, 150, 92, 22, 103, 207, 228, 29, // ...ve...g... + 202, 153, 157, 166, 22, 226, 25, 203, 189, 35, 107, 79, // .........#kO + 40, 78, 79, 245, 27, 255, 147, 63, 3, 138, 41, 91, // (NO....?..)[ + 43, 200, 102, 158, 46, 241, 117, 226, 214, 149, 250, 213, // +.f...u..... + 11, 236, 193, 230, 230, 41, 20, 90, 3, 124, 118, 172, // .....).Z.|v. + 193, 207, 213, 18, 236, 126, 21, 223, 38, 249, 143, 94, // .....~..&..^ + 79, 205, 226, 50, 182, 214, 241, 42, 49, 117, 202, 235, // O..2...*1u.. + 117, 251, 184, 214, 161, 94, 46, 122, 137, 232, 24, 225, // u....^.z.... + 172, 176, 53, 39, 63, 158, 29, 121, 67, 215, 30, 243, // ..5'?..yC... + 100, 119, 226, 62, 71, 76, 55, 30, 202, 135, 131, 255, // dw.>GL7..... + 221, 161, 139, 63, 199, 14, 198, 231, 65, 236, 218, 65, // ...?....A..A + 48, 148, 15, 105, 178, 92, 38, 40, 60, 183, 163, 9, // 0..i..&(<... + 254, 76, 111, 207, 30, 163, 11, 36, 207, 118, 153, 32, // .Lo....$.v. + 16, 219, 99, 64, 118, 77, 127, 219, 101, 18, 195, 248, // ..c@vM..e... + 125, 104, 135, 163, 152, 137, 56, 227, 145, 25, 102, 51, // }h....8...f3 + 117, 99, 28, 157, 7, 246, 200, 127, 63, 130, 240, 160, // uc......?... + 57, 194, 159, 52, 59, 67, 121, 224, 97, 96, 64, 136, // 9..4;Cy.a`@. + 33, 254, 234, 6, 64, 28, 243, 116, 42, 8, 159, 119, // !...@..t*..w + 134, 240, 112, 209, 31, 250, 67, 123, 20, 225, 175, 174, // ..p...C{.... + 20, 4, 99, 219, 155, 224, 79, 87, 18, 77, 252, 227, // ..c...OW.M.. + 186, 38, 250, 67, 87, 203, 226, 206, 153, 91, 244, 158, // .&.CW....[.. + 196, 33, 93, 70, 67, 249, 208, 40, 7, 67, 30, 109, // .!]FC..(.C.m + 185, 238, 189, 134, 134, 160, 255, 183, 119, 252, 40, 229, // ........w.(. + 73, 86, 77, 220, 247, 238, 125, 194, 131, 27, 2, 235, // IVM...}..... + 252, 224, 244, 152, 28, 172, 121, 207, 68, 169, 251, 24, // ......y.D... + 96, 0, 22, 10, 244, 1, 35, 238, 46, 204, 229, 88, // `.....#....X + 127, 148, 98, 213, 182, 27, 183, 168, 131, 106, 168, 185, // ..b......j.. + 27, 180, 168, 200, 170, 192, 14, 70, 21, 71, 106, 194, // .......F.Gj. + 187, 150, 126, 56, 103, 46, 82, 197, 206, 134, 248, 150, // ..~8g.R..... + 102, 75, 116, 78, 182, 180, 25, 205, 22, 118, 123, 15, // fKtN.....v{. + 78, 182, 69, 3, 140, 116, 67, 144, 1, 88, 137, 208, // N.E..tC..X.. + 52, 18, 197, 22, 223, 118, 221, 97, 87, 246, 28, 189, // 4....v.aW... + 10, 33, 240, 241, 220, 252, 147, 99, 177, 167, 198, 12, // .!.....c.... + 188, 206, 102, 23, 219, 226, 160, 49, 120, 34, 214, 0, // ..f....1x".. + 78, 161, 64, 92, 194, 67, 61, 183, 247, 223, 182, 13, // N.@..C=..... + 210, 229, 228, 134, 222, 243, 80, 71, 119, 50, 153, 28, // ......PGw2.. + 75, 43, 186, 194, 128, 108, 110, 122, 234, 214, 124, 119, // K+...lnz..|w + 204, 74, 20, 122, 202, 157, 48, 40, 208, 54, 197, 248, // .J.z..0(.6.. + 70, 122, 173, 227, 105, 81, 244, 206, 148, 189, 186, 248, // Fz..iQ...... + 177, 40, 29, 109, 98, 254, 252, 93, 48, 129, 31, 123, // .(.mb..]0..{ + 186, 51, 213, 110, 85, 253, 226, 133, 211, 170, 246, 76, // .3.nU......L + 181, 227, 63, 247, 252, 73, 93, 237, 155, 106, 215, 157, // ..?..I]..j.. + 120, 47, 190, 67, 117, 101, 119, 158, 192, 154, 212, 33, // x/.Cuew....! + 29, 253, 144, 217, 60, 12, 28, 101, 121, 94, 120, 68, // ....<..ey^xD + 244, 218, 242, 172, 81, 50, 210, 60, 6, 83, 135, 190, // ....Q2.<.S.. + 7, 110, 77, 29, 203, 143, 236, 208, 242, 93, 43, 138, // .nM......]+. + 96, 8, 192, 78, 95, 74, 83, 203, 31, 219, 62, 196, // `..N_JS...>. + 128, 53, 67, 40, 97, 164, 75, 210, 230, 12, 57, 104, // .5C(a.K...9h + 232, 187, 242, 56, 172, 27, 212, 11, 55, 28, 19, 52, // ...8....7..4 + 38, 128, 28, 232, 105, 66, 140, 29, 182, 166, 236, 29, // &...iB...... + 31, 66, 173, 54, 113, 35, 78, 23, 186, 118, 132, 89, // .B.6q#N..v.Y + 120, 176, 205, 100, 142, 16, 53, 246, 216, 226, 135, 148, // x..d..5..... + 166, 22, 91, 128, 156, 84, 179, 131, 85, 119, 192, 138, // ..[..T..Uw.. + 164, 177, 174, 109, 198, 2, 61, 200, 238, 104, 232, 73, // ...m..=..h.I + 181, 153, 138, 89, 129, 195, 214, 180, 143, 163, 55, 161, // ...Y......7. + 170, 123, 35, 223, 14, 127, 23, 244, 198, 68, 198, 11, // .{#......D.. + 70, 64, 210, 76, 21, 146, 182, 173, 105, 31, 69, 207, // F@.L....i.E. + 3, 125, 193, 150, 192, 253, 125, 208, 243, 92, 15, 60, // .}....}....< + 151, 74, 61, 145, 166, 90, 51, 233, 227, 180, 139, 184, // .J=..Z3..... + 8, 127, 226, 218, 254, 239, 66, 187, 144, 200, 248, 17, // ......B..... + 76, 220, 208, 76, 53, 26, 13, 91, 147, 62, 138, 220, // L..L5..[.>.. + 36, 224, 96, 16, 56, 248, 61, 112, 27, 123, 96, 168, // $.`.8.=p.{`. + 15, 182, 70, 67, 61, 17, 184, 234, 13, 155, 57, 31, // ..FC=.....9. + 69, 109, 36, 228, 117, 68, 89, 127, 123, 212, 34, 87, // Em$.uDY.{."W + 36, 139, 180, 147, 137, 188, 49, 9, 214, 204, 169, 81, // $.....1....Q + 203, 210, 219, 121, 182, 238, 96, 135, 240, 69, 118, 177, // ...y..`..Ev. + 120, 102, 10, 15, 86, 226, 140, 149, 11, 89, 128, 154, // xf..V....Y.. + 35, 30, 69, 80, 235, 138, 202, 59, 19, 68, 163, 33, // #.EP...;.D.! + 204, 1, 69, 25, 145, 41, 156, 25, 100, 134, 25, 110, // ..E..)..d..n + 40, 59, 178, 16, 201, 92, 113, 116, 217, 83, 32, 11, // (;....qt.S . + 48, 138, 80, 136, 136, 42, 24, 232, 75, 107, 132, 178, // 0.P..*..Kk.. + 99, 3, 154, 75, 203, 227, 72, 45, 41, 234, 75, 188, // c..K..H-).K. + 59, 17, 123, 228, 201, 12, 52, 56, 190, 59, 86, 61, // ;.{...48.;V= + 73, 101, 252, 12, 238, 62, 149, 205, 247, 16, 131, 40, // Ie...>.....( + 55, 128, 163, 197, 72, 192, 240, 3, 41, 133, 92, 71, // 7...H...)..G + 196, 30, 222, 56, 224, 140, 186, 60, 241, 216, 123, 36, // ...8...<..{$ + 164, 3, 189, 60, 41, 143, 52, 25, 209, 199, 17, 146, // ...<).4..... + 70, 44, 135, 145, 140, 21, 108, 163, 64, 232, 235, 112, // F,....l.@..p + 229, 62, 251, 248, 146, 137, 230, 10, 161, 177, 46, 79, // .>.........O + 108, 170, 51, 38, 108, 143, 107, 247, 221, 137, 250, 18, // l.3&l.k..... + 250, 143, 5, 109, 10, 146, 98, 230, 52, 148, 0, 60, // ...m..b.4..< + 84, 35, 177, 196, 40, 142, 132, 232, 232, 193, 132, 99, // T#..(......c + 41, 67, 141, 3, 95, 202, 50, 165, 63, 33, 122, 40, // )C.._.2.?!z( + 163, 222, 147, 229, 8, 195, 168, 222, 35, 33, 61, 80, // ........#!=P + 101, 194, 51, 202, 99, 162, 229, 115, 249, 35, 233, 18, // e.3.c..s.#.. + 145, 66, 35, 192, 0, 19, 61, 53, 34, 15, 125, 136, // .B#...=5".}. + 84, 164, 70, 196, 8, 98, 255, 69, 11, 32, 220, 145, // T.F..b.E. .. + 176, 143, 115, 83, 64, 200, 96, 150, 35, 174, 193, 5, // ..sS@.`.#... + 155, 21, 28, 11, 41, 133, 160, 80, 113, 82, 48, 97, // ....)..PqR0a + 162, 66, 237, 155, 70, 64, 39, 152, 136, 8, 242, 109, // .B..F@'....m + 103, 24, 8, 255, 41, 11, 96, 5, 225, 50, 143, 45, // g...).`..2.- + 20, 138, 58, 194, 33, 135, 182, 139, 139, 192, 80, 22, // ..:.!.....P. + 67, 89, 155, 207, 117, 98, 205, 20, 49, 93, 246, 176, // CY..ub..1].. + 184, 47, 194, 31, 170, 77, 123, 67, 178, 187, 65, 40, // ./...M{C..A( + 101, 191, 18, 167, 177, 172, 196, 163, 101, 247, 125, 45, // e.......e.}- + 90, 81, 69, 115, 95, 12, 3, 51, 121, 209, 195, 99, // ZQEs_..3y..c + 189, 167, 121, 33, 182, 12, 30, 120, 44, 226, 76, 126, // ..y!...x,.L~ + 5, 20, 69, 244, 33, 47, 68, 97, 180, 224, 34, 50, // ..E.!/Da.."2 + 27, 137, 56, 249, 50, 191, 39, 48, 81, 134, 184, 106, // ..8.2.'0Q..j + 129, 166, 55, 30, 163, 255, 23, 173, 99, 236, 11, 110, // ..7.....c..n + 162, 70, 35, 81, 46, 95, 196, 21, 179, 104, 124, 0, // .F#Q._...h|. + 83, 187, 126, 208, 140, 240, 125, 214, 123, 174, 212, 11, // S.~...}.{... + 62, 192, 150, 57, 81, 99, 169, 15, 5, 31, 159, 248, // >..9Qc...... + 251, 196, 88, 75, 79, 36, 24, 135, 34, 109, 98, 18, // ..XKO$.."mb. + 198, 136, 39, 120, 119, 0, 115, 98, 84, 16, 201, 236, // ..'xw.sbT... + 88, 103, 48, 230, 154, 199, 2, 75, 218, 31, 92, 131, // Xg0....K.... + 223, 54, 70, 162, 254, 218, 168, 0, 63, 152, 16, 6, // .6F.....?... + 178, 128, 72, 249, 54, 229, 137, 67, 76, 132, 214, 30, // ..H.6..CL... + 104, 26, 154, 122, 47, 172, 75, 129, 83, 67, 241, 188, // h..z/.K.SC.. + 86, 25, 244, 8, 68, 140, 0, 125, 34, 171, 215, 51, // V...D..}"..3 + 105, 106, 233, 50, 196, 114, 34, 125, 34, 190, 32, 165, // ij.2.r"}". . + 12, 72, 253, 97, 43, 239, 155, 212, 50, 79, 58, 66, // .H.a+...2O:B + 236, 97, 203, 61, 154, 103, 218, 113, 48, 194, 10, 44, // .a.=.g.q0.., + 47, 176, 2, 24, 120, 196, 230, 52, 240, 212, 112, 136, // /...x..4..p. + 129, 69, 141, 196, 206, 195, 155, 90, 180, 190, 248, 103, // .E.....Z...g + 141, 36, 96, 168, 10, 156, 114, 202, 93, 148, 107, 113, // .$`...r.].kq + 181, 28, 237, 51, 42, 131, 192, 76, 69, 188, 185, 105, // ...3*..LE..i + 225, 10, 232, 27, 60, 54, 163, 48, 165, 174, 32, 102, // ....<6.0.. f + 39, 81, 44, 33, 12, 96, 89, 160, 220, 20, 58, 103, // 'Q,!.`Y...:g + 81, 58, 198, 64, 201, 163, 216, 66, 44, 45, 240, 57, // Q:.@...B,-.9 + 82, 47, 120, 29, 99, 172, 213, 84, 148, 134, 150, 77, // R/x.c..T...M + 199, 7, 245, 154, 212, 107, 223, 17, 189, 240, 233, 199, // .....k...... + 120, 26, 33, 24, 83, 65, 70, 12, 63, 101, 41, 244, // x.!.SAF.?e). + 98, 12, 204, 208, 224, 114, 127, 10, 79, 231, 243, 11, // b....r..O... + 4, 225, 46, 15, 109, 88, 9, 43, 133, 60, 158, 66, // ....mX.+.<.B + 61, 90, 92, 102, 222, 201, 114, 44, 23, 130, 62, 37, // =Z.f..r,..>% + 109, 92, 65, 116, 34, 240, 209, 29, 221, 166, 36, 155, // m.At".....$. + 163, 215, 207, 2, 130, 42, 252, 217, 163, 23, 112, 31, // .....*....p. + 226, 0, 2, 126, 58, 162, 165, 66, 140, 22, 190, 143, // ...~:..B.... + 51, 110, 60, 209, 50, 147, 90, 161, 8, 18, 215, 71, // 3n<.2.Z....G + 190, 129, 104, 22, 215, 134, 10, 32, 102, 73, 125, 197, // ..h.... fI}. + 67, 241, 16, 196, 143, 50, 9, 30, 22, 255, 13, 222, // C....2...... + 141, 52, 227, 160, 123, 154, 113, 100, 14, 2, 4, 144, // .4..{.qd.... + 192, 162, 133, 225, 28, 0, 54, 226, 29, 4, 68, 231, // ......6...D. + 246, 120, 193, 201, 83, 33, 30, 236, 244, 232, 28, 136, // .x..S!...... + 255, 2, 182, 96, 79, 9, 229, 82, 7, 72, 111, 75, // ...`O..R.HoK + 161, 184, 79, 248, 127, 150, 238, 178, 133, 31, 97, 129, // ..O.......a. + 24, 206, 127, 18, 206, 112, 147, 0, 226, 195, 172, 200, // .....p...... + 157, 13, 20, 38, 47, 104, 209, 140, 29, 100, 52, 39, // ...&/h...d4' + 65, 148, 104, 174, 70, 250, 81, 190, 4, 35, 177, 131, // A.h.F.Q..#.. + 8, 12, 68, 161, 120, 39, 134, 244, 24, 91, 62, 209, // ..D.x'...[>. + 133, 44, 79, 45, 145, 126, 135, 143, 48, 18, 246, 200, // .,O-.~..0... + 242, 124, 32, 31, 164, 33, 69, 31, 19, 159, 7, 238, // .| ..!E..... + 228, 85, 224, 104, 231, 22, 146, 124, 163, 20, 40, 90, // .U.h...|..(Z + 244, 116, 83, 79, 200, 62, 161, 20, 15, 233, 153, 60, // .tSO.>.....< + 135, 95, 149, 250, 200, 12, 244, 61, 158, 15, 169, 8, // ._.....=.... + 166, 232, 105, 5, 34, 227, 156, 5, 203, 20, 229, 65, // ..i."......A + 124, 244, 34, 24, 69, 70, 119, 192, 207, 145, 246, 91, // |.".EFw....[ + 147, 97, 11, 121, 245, 58, 208, 123, 42, 74, 162, 250, // .a.y.:.{*J.. + 141, 84, 231, 215, 112, 80, 61, 168, 58, 129, 248, 95, // .T..pP=.:.._ + 173, 58, 129, 54, 122, 218, 142, 52, 8, 63, 202, 162, // .:.6z..4.?.. + 208, 151, 144, 131, 74, 183, 32, 181, 166, 124, 237, 16, // ....J. ..|.. + 72, 32, 133, 133, 209, 138, 112, 93, 129, 152, 40, 172, // H ....p]..(. + 139, 86, 24, 146, 77, 171, 72, 91, 21, 77, 5, 73, // .V..M.H[.M.I + 7, 154, 229, 89, 20, 118, 190, 158, 177, 52, 145, 132, // ...Y.v...4.. + 155, 162, 52, 98, 163, 70, 2, 0, 248, 248, 11, 170, // ..4b.F...... + 160, 47, 19, 209, 89, 161, 219, 136, 123, 89, 110, 54, // ./..Y...{Yn6 + 125, 145, 198, 128, 171, 148, 165, 122, 92, 127, 52, 165, // }......z..4. + 17, 228, 204, 161, 124, 79, 200, 57, 126, 147, 88, 96, // ....|O.9~.X` + 116, 8, 124, 72, 17, 146, 119, 162, 166, 100, 187, 140, // t.|H..w..d.. + 27, 89, 100, 43, 200, 27, 9, 90, 41, 107, 241, 45, // .Yd+...Z)k.- + 169, 193, 41, 184, 106, 209, 47, 44, 156, 115, 33, 193, // ..).j./,.s!. + 47, 143, 82, 41, 130, 33, 162, 93, 245, 57, 152, 123, // /.R).!.].9.{ + 0, 135, 60, 176, 52, 186, 20, 47, 166, 219, 51, 252, // ..<.4../..3. + 52, 181, 36, 129, 197, 69, 162, 16, 200, 63, 143, 236, // 4.$..E...?.. + 247, 41, 51, 129, 52, 251, 138, 109, 36, 157, 59, 17, // .)3.4..m$.;. + 193, 144, 22, 200, 57, 105, 26, 8, 209, 100, 63, 32, // ....9i...d? + 178, 14, 86, 135, 66, 159, 177, 120, 153, 80, 182, 17, // ..V.B..x.P.. + 92, 153, 80, 10, 106, 49, 17, 201, 225, 91, 35, 190, // ..P.j1...[#. + 11, 160, 122, 242, 219, 23, 42, 211, 139, 184, 162, 37, // ..z...*....% + 19, 139, 108, 96, 160, 181, 32, 3, 39, 21, 6, 212, // ..l`.. .'... + 8, 71, 172, 228, 200, 10, 174, 40, 126, 11, 171, 90, // .G.....(~..Z + 167, 216, 62, 79, 48, 28, 99, 168, 39, 0, 3, 97, // ..>O0.c.'..a + 82, 40, 232, 186, 226, 255, 56, 57, 255, 185, 129, 240, // R(....89.... + 208, 19, 114, 145, 27, 90, 94, 135, 188, 44, 104, 57, // ..r..Z^..,h9 + 218, 54, 251, 188, 160, 48, 13, 228, 155, 86, 209, 179, // .6...0...V.. + 100, 63, 34, 133, 72, 40, 41, 27, 44, 172, 156, 85, // d?".H().,..U + 156, 123, 68, 162, 136, 94, 9, 177, 73, 98, 234, 48, // .{D..^..Ib.0 + 191, 80, 31, 138, 61, 199, 80, 182, 135, 186, 0, 242, // .P..=.P..... + 58, 98, 194, 168, 113, 178, 241, 162, 56, 162, 240, 34, // :b..q...8.." + 114, 36, 98, 128, 178, 69, 67, 195, 86, 137, 238, 106, // r$b..EC.V..j + 22, 139, 32, 28, 207, 249, 97, 94, 145, 53, 39, 219, // .. ...a^.5'. + 231, 73, 60, 75, 242, 193, 93, 154, 205, 179, 173, 190, // .I..n-....? + 93, 29, 237, 186, 135, 118, 114, 208, 30, 56, 205, 121, // ]....vr..8.y + 215, 179, 175, 238, 244, 89, 163, 220, 92, 104, 31, 54, // .....Y...h.6 + 214, 231, 34, 205, 169, 198, 254, 193, 167, 57, 46, 100, // .."......9.d + 242, 5, 15, 149, 139, 36, 189, 180, 138, 18, 148, 159, // .....$...... + 46, 84, 58, 63, 209, 245, 209, 193, 35, 213, 60, 1, // .T:?....#.<. + 42, 203, 171, 164, 117, 22, 199, 83, 128, 214, 89, 202, // *...u..S..Y. + 99, 89, 65, 245, 148, 7, 102, 217, 59, 24, 235, 156, // cYA...f.;... + 45, 182, 214, 63, 75, 174, 146, 52, 219, 48, 151, 151, // -..?K..4.0.. + 231, 139, 175, 179, 245, 60, 227, 209, 253, 171, 229, 69, // .....<.....E + 30, 231, 183, 221, 35, 158, 22, 46, 230, 220, 18, 19, // ....#....... + 235, 244, 51, 20, 22, 26, 145, 107, 107, 115, 35, 245, // ..3....kks#. + 77, 238, 224, 193, 99, 179, 46, 104, 57, 168, 3, 23, // M...c..h9... + 154, 215, 193, 45, 38, 184, 14, 185, 240, 43, 78, 152, // ...-&....+N. + 154, 100, 52, 35, 7, 119, 219, 60, 213, 234, 209, 201, // .d4#.w.<.... + 2, 249, 62, 190, 122, 197, 243, 212, 83, 85, 103, 75, // ..>.z...SUgK + 233, 172, 168, 133, 164, 69, 97, 208, 238, 168, 121, 29, // .....Ea...y. + 173, 41, 96, 38, 142, 165, 207, 105, 239, 207, 95, 221, // .)`&...i.._. + 177, 176, 107, 229, 235, 241, 153, 137, 105, 24, 110, 146, // ..k.....i.n. + 42, 53, 193, 67, 147, 228, 91, 231, 10, 205, 243, 108, // *5.C..[....l + 187, 105, 142, 172, 235, 140, 177, 214, 73, 232, 253, 188, // .i......I... + 34, 115, 54, 106, 6, 239, 180, 228, 104, 238, 251, 237, // "s6j....h... + 83, 214, 77, 149, 97, 12, 174, 167, 176, 30, 76, 8, // S.M.a.....L. + 136, 186, 217, 63, 109, 241, 223, 75, 192, 137, 152, 98, // ...?m..K...b + 217, 171, 9, 222, 202, 225, 17, 106, 215, 84, 255, 233, // .......j.T.. + 209, 20, 126, 160, 123, 181, 204, 210, 164, 148, 52, 151, // ..~.{.....4. + 69, 97, 113, 17, 105, 124, 219, 42, 90, 16, 190, 117, // Eaq.i|.*Z..u + 55, 253, 165, 115, 230, 104, 181, 155, 196, 84, 124, 145, // 7..s.h...T|. + 177, 233, 192, 184, 228, 157, 3, 99, 225, 210, 228, 146, // .......c.... + 217, 32, 23, 25, 236, 199, 74, 91, 188, 200, 249, 8, // . ....J[.... + 51, 52, 242, 154, 131, 233, 42, 239, 191, 3, 165, 157, // 34....*..... + 195, 205, 180, 200, 58, 69, 227, 86, 167, 112, 232, 124, // ....:E.V.p.| + 109, 72, 155, 117, 219, 25, 167, 205, 166, 216, 203, 110, // mH.u.......n + 150, 207, 78, 229, 204, 221, 214, 163, 43, 132, 14, 39, // ..N.....+..' + 158, 212, 25, 39, 43, 40, 25, 153, 125, 91, 171, 250, // ...'+(..}[.. + 189, 190, 212, 23, 85, 167, 196, 30, 180, 23, 34, 5, // ....U.....". + 77, 254, 215, 77, 218, 182, 11, 97, 215, 46, 238, 233, // M..M...a.... + 34, 89, 192, 87, 107, 255, 39, 219, 230, 234, 175, 88, // "Y.Wk.'....X + 207, 236, 203, 172, 99, 181, 130, 54, 104, 163, 126, 240, // ....c..6h.~. + 31, 20, 174, 211, 222, 55, 113, 177, 184, 200, 226, 124, // .....7q....| + 214, 19, 53, 60, 173, 140, 50, 175, 101, 238, 140, 190, // ..5<..2.e... + 29, 247, 168, 87, 104, 162, 114, 54, 103, 214, 7, 160, // ...Wh.r6g... + 153, 68, 212, 98, 15, 216, 52, 155, 215, 176, 138, 186, // .D.b..4..... + 203, 125, 152, 15, 152, 150, 198, 182, 124, 99, 76, 103, // .}......|cLg + 254, 125, 86, 38, 131, 59, 147, 105, 182, 88, 166, 179, // .}V&.;.i.X.. + 60, 89, 127, 206, 253, 10, 105, 54, 134, 153, 222, 61, // .)... + 120, 207, 186, 102, 160, 113, 78, 76, 116, 186, 136, 139, // x..f.qNLt... + 101, 97, 125, 240, 157, 205, 205, 71, 90, 19, 102, 190, // ea}....GZ.f. + 212, 98, 211, 74, 171, 137, 76, 14, 107, 43, 67, 160, // .b.J..L.k+C. + 131, 65, 215, 162, 212, 84, 97, 50, 94, 178, 111, 168, // .A...Ta2^.o. + 169, 13, 3, 194, 150, 132, 219, 254, 145, 93, 108, 210, // .........]l. + 101, 57, 232, 219, 40, 118, 115, 231, 91, 57, 50, 43, // e9..(vs.[92+ + 6, 31, 76, 166, 185, 50, 169, 241, 59, 3, 169, 38, // ..L..2..;..& + 246, 99, 46, 224, 117, 188, 92, 15, 238, 246, 18, 88, // .c..u......X + 211, 248, 42, 249, 187, 184, 4, 196, 11, 230, 161, 123, // ..*........{ + 55, 174, 156, 242, 136, 208, 229, 203, 222, 104, 108, 35, // 7........hl# + 94, 119, 156, 147, 208, 241, 244, 37, 176, 227, 227, 95, // ^w.....%..._ + 13, 8, 187, 26, 135, 96, 78, 92, 167, 6, 211, 6, // .....`N..... + 242, 114, 214, 192, 120, 57, 235, 128, 112, 59, 157, 201, // .r..x9..p;.. + 187, 55, 137, 190, 208, 247, 214, 60, 116, 186, 59, 237, // .7.....w. + 109, 24, 182, 181, 161, 190, 100, 115, 117, 116, 84, 141, // m.....dsutT. + 47, 53, 233, 78, 212, 62, 117, 201, 148, 19, 165, 89, // /5.N.>u....Y + 179, 198, 212, 5, 19, 169, 133, 145, 58, 145, 249, 136, // ........:... + 169, 160, 59, 147, 241, 156, 19, 124, 110, 255, 92, 48, // ..;....|n..0 + 105, 244, 72, 58, 180, 26, 218, 164, 219, 91, 55, 118, // i.H:.....[7v + 26, 204, 150, 29, 42, 239, 232, 168, 77, 125, 206, 203, // ....*...M}.. + 132, 232, 15, 2, 235, 131, 63, 84, 125, 255, 68, 189, // ......?T}.D. + 65, 240, 161, 94, 111, 211, 114, 185, 73, 19, 117, 14, // A..^o.r.I.u. + 43, 1, 48, 168, 157, 47, 11, 216, 171, 162, 255, 81, // +.0../.....Q + 175, 234, 67, 128, 238, 193, 126, 247, 151, 146, 210, 127, // ..C...~..... + 175, 243, 241, 177, 250, 16, 161, 127, 116, 162, 254, 119, // ........t..w + 78, 143, 253, 22, 48, 15, 64, 175, 129, 187, 236, 237, // N...0.@..... + 214, 221, 191, 4, 29, 162, 31, 84, 248, 195, 172, 45, // .......T...- + 167, 64, 231, 27, 221, 254, 177, 181, 106, 16, 10, 52, // .@......j..4 + 38, 177, 219, 185, 238, 224, 44, 76, 78, 19, 5, 0, // &.....,LN... + 227, 239, 229, 118, 164, 202, 46, 41, 20, 122, 54, 165, // ...v...).z6. + 111, 53, 205, 170, 4, 93, 173, 163, 131, 231, 57, 130, // o5...]....9. + 12, 1, 97, 51, 3, 0, 42, 109, 243, 58, 178, 72, // ..a3..*m.:.H + 198, 209, 83, 1, 246, 222, 136, 208, 47, 73, 158, 89, // ..S...../I.Y + 236, 132, 8, 39, 230, 48, 1, 101, 252, 78, 163, 199, // ...'.0.e.N.. + 2, 236, 169, 186, 255, 31, 64, 61, 95, 207, 216, 83, // ......@=_..S + 126, 47, 105, 221, 198, 177, 208, 121, 239, 143, 249, 49, // ~/i....y...1 + 137, 71, 186, 247, 38, 244, 78, 40, 80, 171, 217, 73, // .G..&.N(P..I + 171, 242, 254, 238, 143, 87, 231, 240, 140, 8, 221, 186, // .....W...... + 173, 238, 108, 213, 87, 59, 171, 72, 172, 19, 253, 28, // ..l.W;.H.... + 242, 127, 244, 62, 169, 220, 224, 219, 110, 224, 117, 166, // ...>....n.u. + 113, 145, 220, 223, 66, 238, 221, 255, 170, 114, 127, 189, // q...B....r.. + 218, 89, 234, 109, 7, 124, 5, 185, 162, 96, 160, 10, // .Y.m.|...`.. + 68, 173, 15, 7, 54, 178, 29, 22, 40, 95, 178, 118, // D...6...(_.v + 78, 243, 192, 118, 206, 4, 70, 77, 124, 87, 109, 8, // N..v..FM|Wm. + 219, 251, 184, 175, 238, 76, 40, 211, 132, 54, 180, 46, // .....L(..6.. + 234, 239, 111, 94, 245, 234, 187, 101, 149, 249, 217, 233, // ..o^...e.... + 187, 94, 250, 114, 104, 181, 35, 54, 109, 34, 4, 59, // .^.rh.#6m".; + 179, 131, 238, 36, 252, 29, 152, 195, 88, 233, 202, 214, // ...$....X... + 52, 51, 117, 109, 206, 161, 249, 186, 6, 190, 51, 171, // 43um......3. + 150, 175, 94, 235, 66, 59, 111, 54, 166, 233, 178, 72, // ..^.B;o6...H + 0, 119, 134, 72, 140, 119, 87, 123, 33, 118, 124, 188, // .w.H.wW{!v|. + 185, 138, 2, 194, 158, 199, 17, 213, 196, 120, 249, 205, // .........x.. + 30, 45, 94, 206, 30, 36, 197, 203, 217, 65, 156, 100, // .-^..$...A.d + 102, 215, 76, 236, 133, 126, 23, 75, 87, 217, 182, 146, // f.L..~.KW... + 218, 207, 160, 67, 91, 223, 54, 41, 45, 188, 140, 27, // ...C[.6)-... + 56, 136, 152, 105, 123, 24, 179, 138, 36, 81, 24, 250, // 8..i{...$Q.. + 97, 23, 55, 135, 184, 153, 250, 199, 177, 171, 144, 130, // a.7......... + 140, 111, 215, 45, 166, 26, 47, 209, 96, 214, 88, 181, // .o.-../.`.X. + 71, 201, 228, 122, 225, 1, 50, 185, 222, 103, 17, 209, // G..z..2..g.. + 55, 24, 139, 163, 161, 74, 236, 57, 70, 168, 44, 87, // 7....J.9F.,W + 238, 208, 27, 250, 189, 238, 237, 230, 226, 16, 177, 140, // ............ + 153, 212, 164, 186, 55, 187, 33, 196, 52, 101, 162, 24, // ....7.!.4e.. + 13, 50, 55, 227, 110, 68, 47, 91, 61, 69, 220, 152, // .27.nD/[=E.. + 203, 206, 91, 191, 148, 232, 239, 62, 131, 238, 119, 198, // ..[....>..w. + 174, 55, 216, 17, 212, 33, 220, 216, 179, 195, 68, 125, // .7...!....D} + 61, 173, 87, 221, 181, 53, 67, 139, 238, 140, 109, 147, // =.W..5C...m. + 122, 1, 171, 176, 42, 177, 155, 215, 155, 4, 222, 91, // z...*......[ + 134, 109, 128, 29, 131, 169, 227, 213, 5, 125, 203, 167, // .m.......}.. + 155, 99, 255, 213, 157, 190, 245, 181, 235, 110, 118, 248, // .c.......nv. + 115, 63, 221, 12, 109, 134, 57, 245, 170, 190, 197, 195, // s?..m.9..... + 182, 76, 186, 188, 218, 123, 205, 242, 207, 88, 174, 77, // .L...{...X.M + 158, 236, 141, 105, 223, 219, 110, 191, 161, 168, 55, 211, // ...i..n...7. + 178, 25, 230, 53, 136, 133, 21, 5, 12, 250, 171, 16, // ...5........ + 112, 119, 16, 177, 207, 190, 0, 50, 59, 188, 123, 59, // pw.....2;.{; + 0, 83, 175, 195, 104, 243, 208, 9, 44, 247, 238, 3, // .S..h...,... + 125, 224, 175, 201, 32, 32, 66, 224, 160, 199, 212, 143, // }... B..... + 143, 141, 170, 46, 56, 157, 42, 115, 225, 172, 9, 59, // ....8.*s...; + 43, 12, 142, 231, 73, 217, 191, 23, 125, 61, 22, 150, // +...I...}=.. + 213, 107, 202, 143, 246, 238, 0, 153, 233, 204, 117, 156, // .k........u. + 26, 139, 213, 39, 17, 83, 96, 241, 73, 162, 226, 171, // ...'.S`.I... + 125, 64, 114, 193, 251, 135, 139, 159, 1, 195, 6, 183, // }@r......... + 150, 115, 238, 152, 134, 234, 6, 209, 240, 135, 79, 31, // .s........O. + 79, 212, 213, 142, 129, 158, 106, 133, 217, 164, 70, 29, // O.....j...F. + 102, 31, 90, 21, 10, 253, 95, 21, 76, 87, 35, 127, // f.Z..._.LW#. + 93, 136, 218, 176, 129, 212, 104, 119, 208, 164, 208, 100, // ].....hw...d + 144, 123, 123, 205, 4, 38, 154, 233, 183, 238, 89, 165, // .{{..&....Y. + 217, 252, 7, 173, 159, 140, 95, 63, 56, 136, 253, 190, // ......_?8... + 209, 183, 217, 16, 240, 33, 124, 196, 243, 183, 121, 158, // .....!|...y. + 229, 242, 228, 225, 233, 37, 118, 213, 242, 192, 48, 241, // .....%v...0. + 155, 228, 98, 59, 239, 127, 252, 248, 232, 203, 176, 47, // ..b;......./ + 13, 149, 76, 184, 0, 19, 92, 175, 173, 249, 117, 130, // ..L.......u. + 175, 238, 218, 119, 220, 160, 218, 212, 234, 166, 35, 232, // ...w......#. + 25, 151, 219, 66, 111, 144, 169, 91, 221, 214, 85, 82, // ...Bo..[..UR + 20, 177, 190, 68, 159, 21, 52, 98, 205, 165, 199, 134, // ...D..4b.... + 142, 34, 194, 180, 78, 63, 237, 158, 252, 75, 199, 108, // ."..N?...K.l + 255, 235, 221, 59, 245, 93, 150, 95, 199, 57, 67, 248, // ...;.]._.9C. + 207, 71, 107, 161, 250, 50, 195, 117, 192, 252, 127, 187, // .Gk..2.u.... + 166, 40, 232, 41, 47, 235, 41, 91, 158, 221, 200, 150, // .(.)/.)[.... + 189, 250, 207, 178, 252, 49, 89, 155, 223, 233, 168, 188, // .....1Y..... + 131, 81, 192, 65, 191, 221, 220, 111, 60, 132, 185, 37, // .Q.A...o<..% + 126, 252, 8, 6, 50, 245, 91, 254, 174, 105, 190, 23, // ~...2.[..i.. + 248, 117, 166, 150, 95, 62, 205, 127, 220, 182, 3, 193, // .u.._>...... + 238, 236, 77, 143, 254, 209, 238, 243, 83, 190, 203, 54, // ..M.....S..6 + 203, 169, 122, 243, 31, 15, 77, 88, 178, 253, 199, 252, // ..z...MX.... + 230, 161, 233, 170, 246, 95, 49, 217, 187, 207, 76, 86, // ....._1...LV + 126, 102, 178, 114, 111, 178, 95, 225, 91, 123, 103, 15, // ~f.ro._.[{g. + 121, 82, 106, 81, 215, 147, 234, 154, 42, 234, 163, 61, // yRjQ....*..= + 108, 222, 56, 182, 78, 43, 218, 30, 106, 79, 157, 246, // l.8.N+..jO.. + 222, 55, 183, 223, 222, 139, 240, 39, 136, 139, 55, 197, // .7.....'..7. + 178, 232, 122, 199, 234, 183, 5, 226, 52, 169, 111, 218, // ..z.....4.o. + 1, 235, 206, 235, 200, 93, 123, 241, 141, 67, 222, 147, // .....]{..C.. + 95, 80, 17, 33, 183, 174, 53, 166, 129, 119, 85, 185, // _P.!..5..wU. + 15, 124, 247, 31, 74, 136, 9, 11, 159, 228, 183, 178, // .|..J....... + 9, 168, 161, 196, 213, 118, 73, 226, 108, 117, 29, 163, // .....vI.lu.. + 180, 157, 78, 1, 128, 47, 135, 111, 149, 220, 110, 204, // ..N../.o..n. + 179, 57, 252, 225, 108, 200, 223, 229, 77, 150, 0, 153, // .9..l...M... + 195, 171, 175, 183, 113, 90, 131, 65, 192, 199, 229, 172, // ....qZ.A.... + 160, 124, 83, 181, 202, 102, 137, 189, 127, 186, 179, 199, // .|S..f...... + 187, 178, 165, 252, 74, 189, 3, 150, 111, 42, 44, 121, // ....J...o*,y + 33, 238, 34, 161, 39, 156, 233, 223, 255, 69, 152, 100, // !.".'....E.d + 144, 156, 102, 43, 76, 60, 211, 68, 148, 181, 218, 28, // ..f+L<.D.... + 91, 195, 49, 237, 60, 28, 218, 166, 51, 66, 137, 197, // [.1.<...3B.. + 53, 213, 20, 193, 94, 152, 20, 185, 204, 248, 51, 32, // 5...^.....3 + 164, 26, 207, 23, 226, 242, 228, 87, 97, 251, 108, 138, // .......Wa.l. + 5, 158, 221, 245, 160, 118, 189, 19, 213, 211, 47, 5, // .....v..../. + 95, 254, 237, 228, 111, 63, 188, 121, 215, 27, 170, 30, // _...o?.y.... + 2, 109, 212, 127, 255, 247, 215, 40, 47, 103, 117, 145, // .m.....(/gu. + 113, 140, 126, 184, 23, 254, 124, 70, 182, 254, 165, 76, // q.~...|F...L + 181, 217, 80, 243, 206, 215, 239, 106, 166, 1, 95, 189, // ..P....j.._. + 162, 30, 28, 48, 32, 240, 240, 63, 166, 108, 59, 96, // ...0 ..?.l;` + 60, 234, 182, 254, 189, 168, 189, 254, 197, 38, 236, 178, // <........&.. + 44, 191, 29, 197, 55, 33, 195, 191, 168, 177, 185, 119, // ,...7!.....w + 229, 238, 249, 102, 211, 126, 69, 181, 23, 18, 111, 205, // ...f.~E...o. + 107, 236, 123, 111, 176, 143, 187, 111, 171, 59, 9, 7, // k.{o...o.;.. + 157, 227, 246, 206, 48, 243, 195, 11, 143, 70, 68, 203, // ....0....FD. + 53, 194, 252, 98, 202, 99, 134, 206, 143, 39, 233, 151, // 5..b.c...'.. + 69, 224, 175, 201, 101, 104, 31, 207, 112, 254, 211, 78, // E...eh..p..N + 42, 130, 33, 63, 250, 235, 44, 137, 93, 59, 15, 98, // *.!?..,.];.b + 191, 107, 23, 99, 45, 32, 111, 239, 195, 106, 97, 249, // .k.c- o..ja. + 91, 164, 61, 8, 118, 250, 103, 195, 201, 215, 23, 213, // [.=.v.g..... + 207, 26, 213, 73, 11, 124, 59, 147, 92, 217, 88, 33, // ...I.|;...X! + 36, 112, 129, 45, 122, 150, 223, 162, 253, 92, 151, 108, // $p.-z......l + 144, 8, 164, 57, 143, 139, 133, 169, 25, 28, 233, 31, // ...9........ + 87, 48, 160, 121, 200, 177, 83, 179, 228, 50, 70, 4, // W0.y..S..2F. + 199, 95, 17, 3, 241, 15, 250, 91, 200, 42, 83, 141, // ._.....[.*S. + 40, 223, 141, 248, 60, 182, 147, 130, 197, 155, 101, 215, // (...<.....e. + 118, 182, 78, 179, 120, 86, 239, 99, 244, 143, 165, 15, // v.N.xV.c.... + 22, 3, 136, 20, 182, 240, 179, 108, 186, 93, 241, 183, // .......l.].. + 1, 24, 217, 131, 233, 255, 5, 64, 207, 243, 250, 183, // .......@.... + 93, 0, 0, 0 // ].. }; static const unsigned char v6[] = { 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 67, // -----BEGIN C @@ -2125,11 +2125,11 @@ static const struct packed_file { size_t size; time_t mtime; } packed_files[] = { - {"/web_root/bundle.js.gz", v1, sizeof(v1), 1701125251}, - {"/web_root/history.min.js.gz", v2, sizeof(v2), 1701125251}, - {"/web_root/index.html.gz", v3, sizeof(v3), 1701125251}, - {"/web_root/main.css.gz", v4, sizeof(v4), 1701125251}, - {"/web_root/main.js.gz", v5, sizeof(v5), 1701257797}, + {"/web_root/bundle.js.gz", v1, sizeof(v1), 1701996503}, + {"/web_root/history.min.js.gz", v2, sizeof(v2), 1701996503}, + {"/web_root/index.html.gz", v3, sizeof(v3), 1701996503}, + {"/web_root/main.css.gz", v4, sizeof(v4), 1701996503}, + {"/web_root/main.js.gz", v5, sizeof(v5), 1703425774}, {"/certs/server_cert.pem", v6, sizeof(v6), 1692695603}, {"/certs/server_key.pem", v7, sizeof(v7), 1692695603}, {NULL, NULL, 0, 0} diff --git a/examples/modbus-dashboard/web_root/main.js b/examples/modbus-dashboard/web_root/main.js index 4fd7cfb4..8b8c1897 100644 --- a/examples/modbus-dashboard/web_root/main.js +++ b/examples/modbus-dashboard/web_root/main.js @@ -307,9 +307,9 @@ function Settings({}) {
<${Setting} title="Enable MQTT forwarding" value=${settings.mqtt_enabled} setfn=${mksetfn('mqtt_enabled')} type="switch" /> - <${Setting} title="MQTT Server URL" value=${settings.mqtt_server_url} setfn=${mksetfn('mqtt_server_url')} type="" disabled=${!settings.mqtt_enabled} /> - <${Setting} title="MQTT Topic RX" value=${settings.mqtt_topic_rx} setfn=${mksetfn('mqtt_topic_rx')} type="" disabled=${!settings.mqtt_enabled} /> - <${Setting} title="MQTT Topic TX" value=${settings.mqtt_topic_tx} setfn=${mksetfn('mqtt_topic_tx')} type="" disabled=${!settings.mqtt_enabled} /> + <${Setting} title="MQTT Server URL" value=${settings.mqtt_server_url} setfn=${mksetfn('mqtt_server_url')} /> + <${Setting} title="MQTT Topic RX" value=${settings.mqtt_topic_rx} setfn=${mksetfn('mqtt_topic_rx')} /> + <${Setting} title="MQTT Topic TX" value=${settings.mqtt_topic_tx} setfn=${mksetfn('mqtt_topic_tx')} />
<${Button} icon=${Icons.save} onclick=${onsave} title="Save Settings" /> diff --git a/examples/wch/ch32v307-make-baremetal-builtin/Makefile b/examples/wch/ch32v307-make-baremetal-builtin/Makefile index fc1aee48..347ac3a9 100644 --- a/examples/wch/ch32v307-make-baremetal-builtin/Makefile +++ b/examples/wch/ch32v307-make-baremetal-builtin/Makefile @@ -1,16 +1,12 @@ ROOT ?= $(realpath $(PWD)/../../..) PREFIX ?= riscv-none-elf -#PREFIX ?= docker run --platform linux/amd64 --rm -it -v$(ROOT):$(ROOT) -w $(PWD) mdashnet/riscv riscv64-unknown-elf - -CFLAGS = -W -Wall -Wextra -Wno-error -Wundef -Wshadow -Wdouble-promotion -CFLAGS += -Wformat-truncation -fno-common -Wconversion -Wno-sign-conversion -CFLAGS += -ffunction-sections -fdata-sections -CFLAGS += -march=rv32imafc -mabi=ilp32f -CFLAGS += -DSYSCLK_FREQ_144MHz_HSE -I. -Ivendor -g3 -Os $(CFLAGS_EXTRA) - -LDFLAGS = -T link.ld -nostartfiles --specs=nano.specs -LDFLAGS += -lc -lgcc -Wl,--gc-sections #-Wl,-Map=$@.map - +#PREFIX ?= docker run --platform linux/amd64 --rm -it -v$(ROOT):$(ROOT) -w $(PWD) mdashnet/riscv riscv-none-elf +CFLAGS = -W -Wall -Wextra -Wundef -Wshadow -Wdouble-promotion +CFLAGS += -Wformat-truncation -Wconversion -Wno-sign-conversion +CFLAGS += -ffunction-sections -fdata-sections -fno-common +CFLAGS += -DSYSCLK_FREQ_144MHz_HSE -I. -Ivendor -g3 -Os +CFLAGS += -march=rv32imafc -mabi=ilp32 $(CFLAGS_EXTRA) +LDFLAGS = -T vendor/link.ld -nostartfiles --specs=nano.specs --specs=nosys.specs -Wl,--gc-sections SOURCES = main.c mongoose.c net.c packed_fs.c SOURCES += vendor/system_ch32v30x.c vendor/startup_ch32v30x_D8C.S CFLAGS += -DHTTP_URL=\"http://0.0.0.0/\" -DHTTPS_URL=\"https://0.0.0.0/\" @@ -25,7 +21,7 @@ all: firmware.bin firmware.bin: firmware.elf $(PREFIX)-objcopy -O binary $< $@ - ls -l firmware.* + $(PREFIX)-size --format=berkeley $< firmware.elf: $(SOURCES) link.ld hal.h mongoose_custom.h Makefile $(PREFIX)-gcc $(SOURCES) $(CFLAGS) $(LDFLAGS) -o $@ diff --git a/examples/wch/ch32v307-make-baremetal-builtin/hal.h b/examples/wch/ch32v307-make-baremetal-builtin/hal.h index ba49d576..2ddff7c2 100644 --- a/examples/wch/ch32v307-make-baremetal-builtin/hal.h +++ b/examples/wch/ch32v307-make-baremetal-builtin/hal.h @@ -34,7 +34,7 @@ enum { }; enum { GPIO_OTYPE_PP, GPIO_OTYPE_OD, GPIO_OTYPE_AF_PP, GPIO_AF_OD }; enum { GPIO_ITYPE_ANALOG, GPIO_ITYPE_FLOAT, GPIO_ITYPE_PUPD }; -#define GPIO(N) ((GPIO_TypeDef *) (GPIOA_BASE + 0x400 * (N))) +#define GPIO(N) ((GPIO_TypeDef *) (size_t) (GPIOA_BASE + 0x400 * (N))) static GPIO_TypeDef *gpio_bank(uint16_t pin) { return GPIO(PINBANK(pin)); @@ -59,7 +59,10 @@ static inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t cfg) { RCC->APB2PCENR |= BIT(0); // Enable AFIO } volatile uint32_t *r = &gpio->CFGLR; - if (no > 7) r = &gpio->CFGHR, no -= 8; + if (no > 7) { + r = &gpio->CFGHR; + no = (uint8_t) (no - 8); + } uint8_t v = (uint8_t) ((mode & 3U) | ((cfg & 3U) << 2)); CLRSET(*r, 15U << (no * 4), v << (no * 4)); } @@ -106,27 +109,13 @@ static inline uint8_t uart_read_byte(USART_TypeDef *uart) { } static inline void ethernet_init(void) { - // Set 60MHz ethernet clock - RCC->CTLR &= ~BIT(28); // PLL3 off - CLRSET(RCC->CFGR2, 15U << 4, 1U << 4); // 3.4.12: PREDIV2 = 2 - CLRSET(RCC->CFGR2, 15U << 12, 13U << 12); // 3.4.12: PLL3MUL = 15 - RCC->CTLR |= BIT(28); // PLL3 on - - EXTEN->EXTEN_CTR |= EXTEN_ETH_10M_EN; // Enable built-in 10M PHY -#if 0 - // RMII mode - // 27.1.3 : init pins - uint16_t pins[] = {PIN('A', 1), PIN('A', 2), PIN('A', 7), - PIN('B', 11), PIN('B', 12), PIN('B', 13), - PIN('C', 1), PIN('C', 4), PIN('C', 5)}; - for (size_t i = 0; i < sizeof(pins) / sizeof(pins[0]); i++) { - gpio_init(pins[i], GPIO_MODE_OUTPUT_50M, GPIO_OTYPE_AF_PP); - } - AFIO->PCFR1 |= BIT(23); // Use RMII -#endif + RCC->CTLR &= ~BIT(28); // PLL3 off + CLRSET(RCC->CFGR2, 15U << 4, 1U << 4); // 3.4.12: PREDIV2 = 2 + CLRSET(RCC->CFGR2, 15U << 12, 13U << 12); // 3.4.12: PLL3MUL = 15 + RCC->CTLR |= BIT(28); // PLL3 on + EXTEN->EXTEN_CTR |= EXTEN_ETH_10M_EN; // Enable built-in 10M PHY RCC->AHBPCENR |= BIT(14) | BIT(15) | BIT(16); // Enable MAC, TX, RX - NVIC_EnableIRQ(ETH_IRQn); - // NVIC_SetPriority(ETH_IRQn, 0); + NVIC_EnableIRQ(ETH_IRQn); // Enable Ethernet interrupt } // opt: 0: 128/192, 1: 96/224, 2: 64/256, 3: 32/288 diff --git a/examples/wch/ch32v307-make-baremetal-builtin/link.ld b/examples/wch/ch32v307-make-baremetal-builtin/link.ld deleted file mode 100644 index cbbeadb8..00000000 --- a/examples/wch/ch32v307-make-baremetal-builtin/link.ld +++ /dev/null @@ -1,36 +0,0 @@ -ENTRY(_start); -MEMORY { - flash(rx) : ORIGIN = 0x00000000, LENGTH = 288k - sram(rwx) : ORIGIN = 0x20000000, LENGTH = 32k -} -_estack = ORIGIN(sram) + LENGTH(sram); - -SECTIONS { - .init : { _sinit = .; . = ALIGN(4); KEEP(*(SORT_NONE(.init))) . = ALIGN(4); _einit = . ; } > flash - .vector : { KEEP(*(.vector)) } > flash - .text : { *(.text .text.* .rodata .rodata.*) } > flash - .dalign : { . = ALIGN(4); PROVIDE(_data_vma = . ); } > sram AT > flash - .dlalign : { . = ALIGN(4); PROVIDE(_data_lma = . ); } > flash AT > flash - - .data : { - _sdata = .; - *(.data .data.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.* .gnu.linkonce.s.*) /* for weak symbol linking */ - _edata = .; - } > sram AT > flash - - .bss : { _sbss = .; *(.bss .bss.* COMMON) _ebss = .; } > sram - . = ALIGN(8); - _end = .; - - __stack_size = 2048; - .stack ORIGIN(sram) + LENGTH(sram) - __stack_size : { - PROVIDE( _heap_end = . ); - . = ALIGN(4); - PROVIDE(_susrstack = . ); - . = . + __stack_size; - PROVIDE( _eusrstack = . ); - } > sram -} diff --git a/examples/wch/ch32v307-make-baremetal-builtin/main.c b/examples/wch/ch32v307-make-baremetal-builtin/main.c index 9eac1168..efe6d6d6 100644 --- a/examples/wch/ch32v307-make-baremetal-builtin/main.c +++ b/examples/wch/ch32v307-make-baremetal-builtin/main.c @@ -45,7 +45,6 @@ static void timer_fn(void *arg) { gpio_toggle(LED_PIN); // Blink LED_PIN struct mg_tcpip_if *ifp = arg; // And show const char *names[] = {"down", "up", "req", "ready"}; // network stats - return; MG_INFO(("Ethernet: %s, IP: %M, rx:%u, tx:%u, dr:%u, er:%u", names[ifp->state], mg_print_ip4, &ifp->ip, ifp->nrecv, ifp->nsent, ifp->ndrop, ifp->nerr)); @@ -59,30 +58,12 @@ void SysTick_Init(void) { NVIC_EnableIRQ(SysTicK_IRQn); } -static void mg_putchar(char ch, void *param) { - uart_write_byte(param, ch); -} - // https://mongoose.ws/documentation/#2-minute-integration-guide static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { if (ev == MG_EV_HTTP_MSG) { struct mg_http_message *hm = (struct mg_http_message *) ev_data; - if (mg_http_match_uri(hm, "/api/ram")) { - // This endpoint allows to read RAM: - // curl IP:8000/api/ram -d '{"addr":"0x20", "len": 32}' - char *s = mg_json_get_str(hm->body, "$.addr"); - void *buf = (void *) (uintptr_t) (s ? strtoul(s, NULL, 0) : 0); - size_t len = mg_json_get_long(hm->body, "$.len", 4); - mg_hexdump(buf, len); - mg_http_reply(c, 200, "", "{%m:%m}\n", MG_ESC("data"), mg_print_hex, len, - buf); - free(s); - } else { - // For all other URIs, serve static content - mg_http_reply(c, 200, "", "hi tick %llu\n", s_ticks); - } + mg_http_reply(c, 200, "", "ok %p %p\r\n", hm, fn_data); } - (void) fn_data; } int main(void) { @@ -95,10 +76,8 @@ int main(void) { struct mg_mgr mgr; // Initialise mg_mgr_init(&mgr); // Mongoose event manager mg_log_set(MG_LL_DEBUG); // Set log level - mg_log_set_fn(mg_putchar, UART_DEBUG); MG_INFO(("Starting, CPU freq %g MHz", (double) SystemCoreClock / 1000000)); - // MG_INFO(("RCC_RSTSCKR=%#lx", RCC->RSTSCKR)); extern char _end[], _heap_end[]; MG_INFO(("Heap size: %lu bytes", _heap_end - _end)); @@ -106,12 +85,11 @@ int main(void) { const char *sizes[] = {"128/192", "96/224", "64/256", "32/288"}; uint32_t mode = (FLASH->OBR >> 8) & 3U; MG_INFO(("RAM/FLASH configuration: %s", sizes[mode])); - if (mode != 3) set_ram_size(3), mg_device_reset(); + // if (mode != 3) set_ram_size(3), mg_device_reset(); // Initialise Mongoose network stack ethernet_init(); // Initialise ethernet pins - struct mg_tcpip_driver_stm32f_data - driver_data = {.mdc_cr = 1}; + struct mg_tcpip_driver_stm32f_data driver_data = {.mdc_cr = 1, .phy_addr = 1}; struct mg_tcpip_if mif = {.mac = GENERATE_LOCALLY_ADMINISTERED_MAC(), // Uncomment below for static configuration: // .ip = mg_htonl(MG_U32(192, 168, 0, 223)), @@ -129,7 +107,7 @@ int main(void) { MG_INFO(("Initialising application...")); mg_http_listen(&mgr, "http://0.0.0.0:8000", fn, NULL); - web_init(&mgr); + //web_init(&mgr); MG_INFO(("Starting event loop")); for (;;) { @@ -139,12 +117,25 @@ int main(void) { return 0; } -// Newlib syscall for malloc +// Newlib syscalls +int _write(int fd, char *buf, int len) { + if (fd == 1) uart_write_buf(USART1, buf, len); + return len; +} + void *_sbrk(ptrdiff_t incr) { extern char _end[], _heap_end[]; static char *curbrk = _end; - if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) return NULL - 1; - //MG_INFO(("%p %ld", curbrk, incr)); + if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) { + return NULL - 1; + } + // MG_INFO(("%p %ld", curbrk, incr)); curbrk += incr; return curbrk - incr; } + +void _init(void) { +} + +void _fini(void) { +} diff --git a/examples/wch/ch32v307-make-baremetal-builtin/vendor/link.ld b/examples/wch/ch32v307-make-baremetal-builtin/vendor/link.ld index a0613571..487a681b 100644 --- a/examples/wch/ch32v307-make-baremetal-builtin/vendor/link.ld +++ b/examples/wch/ch32v307-make-baremetal-builtin/vendor/link.ld @@ -1,17 +1,8 @@ -ENTRY( _start ) +ENTRY( _start ); __stack_size = 2048; PROVIDE( _stack_size = __stack_size ); - MEMORY { -/* CH32V30x_D8C - CH32V305RB-CH32V305FB - CH32V30x_D8 - CH32V303CB-CH32V303RB -*/ -/* - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -*/ - /* CH32V30x_D8C - CH32V307VC-CH32V307WC-CH32V307RC CH32V30x_D8 - CH32V303VC-CH32V303RC FLASH + RAM supports the following configuration @@ -19,162 +10,129 @@ MEMORY { FLASH-224K + RAM-96K FLASH-256K + RAM-64K FLASH-288K + RAM-32K +*/ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 288K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K -*/ - - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 288k - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32k } -SECTIONS -{ - - .init : - { - _sinit = .; - . = ALIGN(4); - KEEP(*(SORT_NONE(.init))) - . = ALIGN(4); - _einit = .; - } >FLASH AT>FLASH - - .vector : - { - *(.vector); - . = ALIGN(64); +SECTIONS { + .init : { + _sinit = .; + . = ALIGN(4); + KEEP(*(SORT_NONE(.init))) + . = ALIGN(4); + _einit = .; } >FLASH AT>FLASH - .text : - { - . = ALIGN(4); - *(.text) - *(.text.*) - *(.rodata) - *(.rodata*) - *(.gnu.linkonce.t.*) - . = ALIGN(4); - } >FLASH AT>FLASH + .vector : { + *(.vector); + . = ALIGN(64); + } >FLASH AT>FLASH - .fini : - { - KEEP(*(SORT_NONE(.fini))) - . = ALIGN(4); - } >FLASH AT>FLASH + .text : { + . = ALIGN(4); + *(.text) + *(.text.*) + *(.rodata) + *(.rodata*) + *(.gnu.linkonce.t.*) + . = ALIGN(4); + } >FLASH AT>FLASH - PROVIDE( _etext = . ); - PROVIDE( _eitcm = . ); + .fini : { + KEEP(*(SORT_NONE(.fini))) + . = ALIGN(4); + } >FLASH AT>FLASH - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH AT>FLASH - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH AT>FLASH - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH AT>FLASH - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >FLASH AT>FLASH - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >FLASH AT>FLASH + PROVIDE( _etext = . ); + PROVIDE( _eitcm = . ); - .dalign : - { - . = ALIGN(4); - PROVIDE(_data_vma = .); - } >RAM AT>FLASH + .preinit_array : { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH AT>FLASH - .dlalign : - { - . = ALIGN(4); - PROVIDE(_data_lma = .); - } >FLASH AT>FLASH + .init_array : { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH AT>FLASH - .data : - { - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.sdata2.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - . = ALIGN(4); - PROVIDE( _edata = .); - } >RAM AT>FLASH + .fini_array : { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH AT>FLASH - .bss : - { - . = ALIGN(4); - PROVIDE( _sbss = .); - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss*) - *(.gnu.linkonce.b.*) - *(COMMON*) - . = ALIGN(4); - PROVIDE( _ebss = .); - } >RAM AT>FLASH + .ctors : { + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >FLASH AT>FLASH - PROVIDE( _end = _ebss); - PROVIDE( end = . ); + .dtors : { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >FLASH AT>FLASH - .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size : - { - PROVIDE( _heap_end = . ); + .dalign : { + . = ALIGN(4); + PROVIDE(_data_vma = .); + } >RAM AT>FLASH + + .dlalign : { + . = ALIGN(4); + PROVIDE(_data_lma = .); + } >FLASH AT>FLASH + + .data : { + *(.gnu.linkonce.r.*) + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.sdata2.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) . = ALIGN(4); - PROVIDE(_susrstack = . ); - . = . + __stack_size; - PROVIDE( _eusrstack = .); - } >RAM + PROVIDE( _edata = .); + } >RAM AT>FLASH + .bss : { + . = ALIGN(4); + PROVIDE( _sbss = .); + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss*) + *(.gnu.linkonce.b.*) + *(COMMON*) + . = ALIGN(4); + PROVIDE( _ebss = .); + } >RAM AT>FLASH + + PROVIDE( _end = _ebss); + PROVIDE( end = . ); + + .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size : { + PROVIDE( _heap_end = . ); + . = ALIGN(4); + PROVIDE(_susrstack = . ); + . = . + __stack_size; + PROVIDE( _eusrstack = .); + } >RAM } diff --git a/examples/wch/ch32v307-make-baremetal-builtin/vendor/startup_ch32v30x_D8.S b/examples/wch/ch32v307-make-baremetal-builtin/vendor/startup_ch32v30x_D8.S deleted file mode 100644 index b9d42384..00000000 --- a/examples/wch/ch32v307-make-baremetal-builtin/vendor/startup_ch32v30x_D8.S +++ /dev/null @@ -1,369 +0,0 @@ -/********************************** (C) COPYRIGHT ******************************* -* File Name : startup_ch32v30x_D8.s -* Author : WCH -* Version : V1.0.0 -* Date : 2021/06/06 -* Description : CH32V303x vector table for eclipse toolchain. -* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. -* SPDX-License-Identifier: Apache-2.0 -*******************************************************************************/ - - .section .init,"ax",@progbits - .global _start - .align 1 -_start: - j handle_reset - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00000013 - .word 0x00100073 - .section .vector,"ax",@progbits - .align 1 -_vector_base: - .option norvc; - .word _start - .word 0 - .word NMI_Handler /* NMI */ - .word HardFault_Handler /* Hard Fault */ - .word 0 - .word Ecall_M_Mode_Handler /* Ecall M Mode */ - .word 0 - .word 0 - .word Ecall_U_Mode_Handler /* Ecall U Mode */ - .word Break_Point_Handler /* Break Point */ - .word 0 - .word 0 - .word SysTick_Handler /* SysTick */ - .word 0 - .word SW_Handler /* SW */ - .word 0 - /* External Interrupts */ - .word WWDG_IRQHandler /* Window Watchdog */ - .word PVD_IRQHandler /* PVD through EXTI Line detect */ - .word TAMPER_IRQHandler /* TAMPER */ - .word RTC_IRQHandler /* RTC */ - .word FLASH_IRQHandler /* Flash */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line 0 */ - .word EXTI1_IRQHandler /* EXTI Line 1 */ - .word EXTI2_IRQHandler /* EXTI Line 2 */ - .word EXTI3_IRQHandler /* EXTI Line 3 */ - .word EXTI4_IRQHandler /* EXTI Line 4 */ - .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ - .word DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ - .word DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ - .word DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ - .word DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ - .word DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ - .word DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ - .word ADC1_2_IRQHandler /* ADC1_2 */ - .word USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */ - .word USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* EXTI Line 9..5 */ - .word TIM1_BRK_IRQHandler /* TIM1 Break */ - .word TIM1_UP_IRQHandler /* TIM1 Update */ - .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* EXTI Line 15..10 */ - .word RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ - .word 0 - .word TIM8_BRK_IRQHandler /* TIM8 Break */ - .word TIM8_UP_IRQHandler /* TIM8 Update */ - .word TIM8_TRG_COM_IRQHandler /* TIM8 Trigger and Commutation */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word RNG_IRQHandler /* RNG */ - .word FSMC_IRQHandler /* FSMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_IRQHandler /* TIM6 */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ - .word DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ - .word DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ - .word DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ - .word DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word OTG_FS_IRQHandler /* OTGFS */ - .word 0 - .word 0 - .word 0 - .word UART6_IRQHandler /* UART6 */ - .word UART7_IRQHandler /* UART7 */ - .word UART8_IRQHandler /* UART8 */ - .word TIM9_BRK_IRQHandler /* TIM9 Break */ - .word TIM9_UP_IRQHandler /* TIM9 Update */ - .word TIM9_TRG_COM_IRQHandler /* TIM9 Trigger and Commutation */ - .word TIM9_CC_IRQHandler /* TIM9 Capture Compare */ - .word TIM10_BRK_IRQHandler /* TIM10 Break */ - .word TIM10_UP_IRQHandler /* TIM10 Update */ - .word TIM10_TRG_COM_IRQHandler /* TIM10 Trigger and Commutation */ - .word TIM10_CC_IRQHandler /* TIM10 Capture Compare */ - .word DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ - .word DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ - .word DMA2_Channel8_IRQHandler /* DMA2 Channel 8 */ - .word DMA2_Channel9_IRQHandler /* DMA2 Channel 9 */ - .word DMA2_Channel10_IRQHandler /* DMA2 Channel 10 */ - .word DMA2_Channel11_IRQHandler /* DMA2 Channel 11 */ - - .option rvc; - - .section .text.vector_handler, "ax", @progbits - .weak NMI_Handler /* NMI */ - .weak HardFault_Handler /* Hard Fault */ - .weak Ecall_M_Mode_Handler /* Ecall M Mode */ - .weak Ecall_U_Mode_Handler /* Ecall U Mode */ - .weak Break_Point_Handler /* Break Point */ - .weak SysTick_Handler /* SysTick */ - .weak SW_Handler /* SW */ - .weak WWDG_IRQHandler /* Window Watchdog */ - .weak PVD_IRQHandler /* PVD through EXTI Line detect */ - .weak TAMPER_IRQHandler /* TAMPER */ - .weak RTC_IRQHandler /* RTC */ - .weak FLASH_IRQHandler /* Flash */ - .weak RCC_IRQHandler /* RCC */ - .weak EXTI0_IRQHandler /* EXTI Line 0 */ - .weak EXTI1_IRQHandler /* EXTI Line 1 */ - .weak EXTI2_IRQHandler /* EXTI Line 2 */ - .weak EXTI3_IRQHandler /* EXTI Line 3 */ - .weak EXTI4_IRQHandler /* EXTI Line 4 */ - .weak DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ - .weak DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ - .weak DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ - .weak DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ - .weak DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ - .weak DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ - .weak DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ - .weak ADC1_2_IRQHandler /* ADC1_2 */ - .weak USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */ - .weak USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */ - .weak CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .weak CAN1_SCE_IRQHandler /* CAN1 SCE */ - .weak EXTI9_5_IRQHandler /* EXTI Line 9..5 */ - .weak TIM1_BRK_IRQHandler /* TIM1 Break */ - .weak TIM1_UP_IRQHandler /* TIM1 Update */ - .weak TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ - .weak TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .weak TIM2_IRQHandler /* TIM2 */ - .weak TIM3_IRQHandler /* TIM3 */ - .weak TIM4_IRQHandler /* TIM4 */ - .weak I2C1_EV_IRQHandler /* I2C1 Event */ - .weak I2C1_ER_IRQHandler /* I2C1 Error */ - .weak I2C2_EV_IRQHandler /* I2C2 Event */ - .weak I2C2_ER_IRQHandler /* I2C2 Error */ - .weak SPI1_IRQHandler /* SPI1 */ - .weak SPI2_IRQHandler /* SPI2 */ - .weak USART1_IRQHandler /* USART1 */ - .weak USART2_IRQHandler /* USART2 */ - .weak USART3_IRQHandler /* USART3 */ - .weak EXTI15_10_IRQHandler /* EXTI Line 15..10 */ - .weak RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ - .weak TIM8_BRK_IRQHandler /* TIM8 Break */ - .weak TIM8_UP_IRQHandler /* TIM8 Update */ - .weak TIM8_TRG_COM_IRQHandler /* TIM8 Trigger and Commutation */ - .weak TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .weak RNG_IRQHandler /* RNG */ - .weak FSMC_IRQHandler /* FSMC */ - .weak SDIO_IRQHandler /* SDIO */ - .weak TIM5_IRQHandler /* TIM5 */ - .weak SPI3_IRQHandler /* SPI3 */ - .weak UART4_IRQHandler /* UART4 */ - .weak UART5_IRQHandler /* UART5 */ - .weak TIM6_IRQHandler /* TIM6 */ - .weak TIM7_IRQHandler /* TIM7 */ - .weak DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ - .weak DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ - .weak DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ - .weak DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ - .weak DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ - .weak OTG_FS_IRQHandler /* OTGFS */ - .weak UART6_IRQHandler /* UART6 */ - .weak UART7_IRQHandler /* UART7 */ - .weak UART8_IRQHandler /* UART8 */ - .weak TIM9_BRK_IRQHandler /* TIM9 Break */ - .weak TIM9_UP_IRQHandler /* TIM9 Update */ - .weak TIM9_TRG_COM_IRQHandler /* TIM9 Trigger and Commutation */ - .weak TIM9_CC_IRQHandler /* TIM9 Capture Compare */ - .weak TIM10_BRK_IRQHandler /* TIM10 Break */ - .weak TIM10_UP_IRQHandler /* TIM10 Update */ - .weak TIM10_TRG_COM_IRQHandler /* TIM10 Trigger and Commutation */ - .weak TIM10_CC_IRQHandler /* TIM10 Capture Compare */ - .weak DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ - .weak DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ - .weak DMA2_Channel8_IRQHandler /* DMA2 Channel 8 */ - .weak DMA2_Channel9_IRQHandler /* DMA2 Channel 9 */ - .weak DMA2_Channel10_IRQHandler /* DMA2 Channel 10 */ - .weak DMA2_Channel11_IRQHandler /* DMA2 Channel 11 */ - -NMI_Handler: 1: j 1b -HardFault_Handler: 1: j 1b -Ecall_M_Mode_Handler: 1: j 1b -Ecall_U_Mode_Handler: 1: j 1b -Break_Point_Handler: 1: j 1b -SysTick_Handler: 1: j 1b -SW_Handler: 1: j 1b -WWDG_IRQHandler: 1: j 1b -PVD_IRQHandler: 1: j 1b -TAMPER_IRQHandler: 1: j 1b -RTC_IRQHandler: 1: j 1b -FLASH_IRQHandler: 1: j 1b -RCC_IRQHandler: 1: j 1b -EXTI0_IRQHandler: 1: j 1b -EXTI1_IRQHandler: 1: j 1b -EXTI2_IRQHandler: 1: j 1b -EXTI3_IRQHandler: 1: j 1b -EXTI4_IRQHandler: 1: j 1b -DMA1_Channel1_IRQHandler: 1: j 1b -DMA1_Channel2_IRQHandler: 1: j 1b -DMA1_Channel3_IRQHandler: 1: j 1b -DMA1_Channel4_IRQHandler: 1: j 1b -DMA1_Channel5_IRQHandler: 1: j 1b -DMA1_Channel6_IRQHandler: 1: j 1b -DMA1_Channel7_IRQHandler: 1: j 1b -ADC1_2_IRQHandler: 1: j 1b -USB_HP_CAN1_TX_IRQHandler: 1: j 1b -USB_LP_CAN1_RX0_IRQHandler: 1: j 1b -CAN1_RX1_IRQHandler: 1: j 1b -CAN1_SCE_IRQHandler: 1: j 1b -EXTI9_5_IRQHandler: 1: j 1b -TIM1_BRK_IRQHandler: 1: j 1b -TIM1_UP_IRQHandler: 1: j 1b -TIM1_TRG_COM_IRQHandler: 1: j 1b -TIM1_CC_IRQHandler: 1: j 1b -TIM2_IRQHandler: 1: j 1b -TIM3_IRQHandler: 1: j 1b -TIM4_IRQHandler: 1: j 1b -I2C1_EV_IRQHandler: 1: j 1b -I2C1_ER_IRQHandler: 1: j 1b -I2C2_EV_IRQHandler: 1: j 1b -I2C2_ER_IRQHandler: 1: j 1b -SPI1_IRQHandler: 1: j 1b -SPI2_IRQHandler: 1: j 1b -USART1_IRQHandler: 1: j 1b -USART2_IRQHandler: 1: j 1b -USART3_IRQHandler: 1: j 1b -EXTI15_10_IRQHandler: 1: j 1b -RTCAlarm_IRQHandler: 1: j 1b -TIM8_BRK_IRQHandler: 1: j 1b -TIM8_UP_IRQHandler: 1: j 1b -TIM8_TRG_COM_IRQHandler: 1: j 1b -TIM8_CC_IRQHandler: 1: j 1b -RNG_IRQHandler: 1: j 1b -FSMC_IRQHandler: 1: j 1b -SDIO_IRQHandler: 1: j 1b -TIM5_IRQHandler: 1: j 1b -SPI3_IRQHandler: 1: j 1b -UART4_IRQHandler: 1: j 1b -UART5_IRQHandler: 1: j 1b -TIM6_IRQHandler: 1: j 1b -TIM7_IRQHandler: 1: j 1b -DMA2_Channel1_IRQHandler: 1: j 1b -DMA2_Channel2_IRQHandler: 1: j 1b -DMA2_Channel3_IRQHandler: 1: j 1b -DMA2_Channel4_IRQHandler: 1: j 1b -DMA2_Channel5_IRQHandler: 1: j 1b -OTG_FS_IRQHandler: 1: j 1b -UART6_IRQHandler: 1: j 1b -UART7_IRQHandler: 1: j 1b -UART8_IRQHandler: 1: j 1b -TIM9_BRK_IRQHandler: 1: j 1b -TIM9_UP_IRQHandler: 1: j 1b -TIM9_TRG_COM_IRQHandler: 1: j 1b -TIM9_CC_IRQHandler: 1: j 1b -TIM10_BRK_IRQHandler: 1: j 1b -TIM10_UP_IRQHandler: 1: j 1b -TIM10_TRG_COM_IRQHandler: 1: j 1b -TIM10_CC_IRQHandler: 1: j 1b -DMA2_Channel6_IRQHandler: 1: j 1b -DMA2_Channel7_IRQHandler: 1: j 1b -DMA2_Channel8_IRQHandler: 1: j 1b -DMA2_Channel9_IRQHandler: 1: j 1b -DMA2_Channel10_IRQHandler: 1: j 1b -DMA2_Channel11_IRQHandler: 1: j 1b - - - .section .text.handle_reset,"ax",@progbits - .weak handle_reset - .align 1 -handle_reset: -.option push -.option norelax - la gp, __global_pointer$ -.option pop -1: - la sp, _eusrstack -2: - /* Load data section from flash to RAM */ - la a0, _data_lma - la a1, _data_vma - la a2, _edata - bgeu a1, a2, 2f -1: - lw t0, (a0) - sw t0, (a1) - addi a0, a0, 4 - addi a1, a1, 4 - bltu a1, a2, 1b -2: - /* Clear bss section */ - la a0, _sbss - la a1, _ebss - bgeu a0, a1, 2f -1: - sw zero, (a0) - addi a0, a0, 4 - bltu a0, a1, 1b -2: - li t0, 0x1f - csrw 0xbc0, t0 - - /* Enable nested and hardware stack */ - li t0, 0x0b - csrw 0x804, t0 - - /* Enable floating point and interrupt */ - li t0, 0x6088 - csrs mstatus, t0 - - la t0, _vector_base - ori t0, t0, 3 - csrw mtvec, t0 - - jal SystemInit - la t0, main - csrw mepc, t0 - mret - - - - diff --git a/mongoose.c b/mongoose.c index 6afbbe45..aa93c86c 100644 --- a/mongoose.c +++ b/mongoose.c @@ -6023,7 +6023,9 @@ size_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap) { -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) && (__GNUC__ > 4) || \ + (defined(__GNUC_MINOR__) && __GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \ + defined(__clang__) #define MG_MEMORY_BARRIER() __sync_synchronize() #elif defined(_MSC_VER) && _MSC_VER >= 1700 #define MG_MEMORY_BARRIER() MemoryBarrier() @@ -14433,7 +14435,8 @@ struct mg_tcpip_driver mg_tcpip_driver_same54 = { #endif -#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && MG_ENABLE_DRIVER_STM32F +#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \ + MG_ENABLE_DRIVER_STM32F struct stm32f_eth { volatile uint32_t MACCR, MACFFR, MACHTHR, MACHTLR, MACMIIAR, MACMIIDR, MACFCR, MACVLANTR, RESERVED0[2], MACRWUFFR, MACPMTCSR, RESERVED1, MACDBGR, MACSR, @@ -14462,7 +14465,7 @@ static uint8_t s_txno; // Current TX descriptor static uint8_t s_rxno; // Current RX descriptor static struct mg_tcpip_if *s_ifp; // MIP interface -enum { PHY_ADDR = 0, PHY_BCR = 0, PHY_BSR = 1, PHY_CSCR = 31 }; +enum { PHY_BCR = 0, PHY_BSR = 1, PHY_ID1 = 2, PHY_ID2 = 3, PHY_CSCR = 31 }; static uint32_t eth_read_phy(uint8_t addr, uint8_t reg) { ETH->MACMIIAR &= (7 << 2); @@ -14537,6 +14540,7 @@ static int guess_mdc_cr(void) { static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { struct mg_tcpip_driver_stm32f_data *d = (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data; + uint8_t phy_addr = d == NULL ? 0 : d->phy_addr; s_ifp = ifp; // Init RX descriptors @@ -14569,8 +14573,8 @@ static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { ETH->MACIMR = MG_BIT(3) | MG_BIT(9); // Mask timestamp & PMT IT ETH->MACFCR = MG_BIT(7); // Disable zero quarta pause // ETH->MACFFR = MG_BIT(31); // Receive all - eth_write_phy(PHY_ADDR, PHY_BCR, MG_BIT(15)); // Reset PHY - eth_write_phy(PHY_ADDR, PHY_BCR, MG_BIT(12)); // Set autonegotiation + eth_write_phy(phy_addr, PHY_BCR, MG_BIT(15)); // Reset PHY + eth_write_phy(phy_addr, PHY_BCR, MG_BIT(12)); // Set autonegotiation ETH->DMARDLAR = (uint32_t) (uintptr_t) s_rxdesc; // RX descriptors ETH->DMATDLAR = (uint32_t) (uintptr_t) s_txdesc; // RX descriptors ETH->DMAIER = MG_BIT(6) | MG_BIT(16); // RIE, NISE @@ -14579,6 +14583,9 @@ static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { ETH->DMAOMR = MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25); // SR, ST, TSF, RSF + MG_DEBUG(("PHY ID: %#04hx %#04hx", eth_read_phy(phy_addr, PHY_ID1), + eth_read_phy(phy_addr, PHY_ID2))); + // MAC address filtering ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4]; ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) | @@ -14588,7 +14595,7 @@ static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { } static size_t mg_tcpip_driver_stm32f_tx(const void *buf, size_t len, - struct mg_tcpip_if *ifp) { + struct mg_tcpip_if *ifp) { if (len > sizeof(s_txbuf[s_txno])) { MG_ERROR(("Frame too big, %ld", (long) len)); len = 0; // Frame is too big @@ -14611,10 +14618,13 @@ static size_t mg_tcpip_driver_stm32f_tx(const void *buf, size_t len, } static bool mg_tcpip_driver_stm32f_up(struct mg_tcpip_if *ifp) { - uint32_t bsr = eth_read_phy(PHY_ADDR, PHY_BSR); + struct mg_tcpip_driver_stm32f_data *d = + (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data; + uint8_t phy_addr = d == NULL ? 0 : d->phy_addr; + uint32_t bsr = eth_read_phy(phy_addr, PHY_BSR); bool up = bsr & MG_BIT(2) ? 1 : 0; if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) { // link state just went up - uint32_t scsr = eth_read_phy(PHY_ADDR, PHY_CSCR); + uint32_t scsr = eth_read_phy(phy_addr, PHY_CSCR); // tmp = reg with flags set to the most likely situation: 100M full-duplex // if(link is slow or half) set flags otherwise // reg = tmp @@ -14655,9 +14665,9 @@ void ETH_IRQHandler(void) { ETH->DMARPDR = 0; // and resume RX } -struct mg_tcpip_driver mg_tcpip_driver_stm32f = {mg_tcpip_driver_stm32f_init, - mg_tcpip_driver_stm32f_tx, NULL, - mg_tcpip_driver_stm32f_up}; +struct mg_tcpip_driver mg_tcpip_driver_stm32f = { + mg_tcpip_driver_stm32f_init, mg_tcpip_driver_stm32f_tx, NULL, + mg_tcpip_driver_stm32f_up}; #endif #ifdef MG_ENABLE_LINES diff --git a/mongoose.h b/mongoose.h index ba25a50f..ca54a243 100644 --- a/mongoose.h +++ b/mongoose.h @@ -2889,6 +2889,8 @@ struct mg_tcpip_driver_stm32f_data { // 216-310 MHz HCLK/124 5 // 110, 111 Reserved int mdc_cr; // Valid values: -1, 0, 1, 2, 3, 4, 5 + + uint8_t phy_addr; // PHY address }; diff --git a/src/drivers/stm32f.c b/src/drivers/stm32f.c index 66036704..0ac856e4 100644 --- a/src/drivers/stm32f.c +++ b/src/drivers/stm32f.c @@ -1,6 +1,7 @@ #include "net_builtin.h" -#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && MG_ENABLE_DRIVER_STM32F +#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \ + MG_ENABLE_DRIVER_STM32F struct stm32f_eth { volatile uint32_t MACCR, MACFFR, MACHTHR, MACHTLR, MACMIIAR, MACMIIDR, MACFCR, MACVLANTR, RESERVED0[2], MACRWUFFR, MACPMTCSR, RESERVED1, MACDBGR, MACSR, @@ -29,7 +30,7 @@ static uint8_t s_txno; // Current TX descriptor static uint8_t s_rxno; // Current RX descriptor static struct mg_tcpip_if *s_ifp; // MIP interface -enum { PHY_ADDR = 0, PHY_BCR = 0, PHY_BSR = 1, PHY_CSCR = 31 }; +enum { PHY_BCR = 0, PHY_BSR = 1, PHY_ID1 = 2, PHY_ID2 = 3, PHY_CSCR = 31 }; static uint32_t eth_read_phy(uint8_t addr, uint8_t reg) { ETH->MACMIIAR &= (7 << 2); @@ -104,6 +105,7 @@ static int guess_mdc_cr(void) { static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { struct mg_tcpip_driver_stm32f_data *d = (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data; + uint8_t phy_addr = d == NULL ? 0 : d->phy_addr; s_ifp = ifp; // Init RX descriptors @@ -136,8 +138,8 @@ static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { ETH->MACIMR = MG_BIT(3) | MG_BIT(9); // Mask timestamp & PMT IT ETH->MACFCR = MG_BIT(7); // Disable zero quarta pause // ETH->MACFFR = MG_BIT(31); // Receive all - eth_write_phy(PHY_ADDR, PHY_BCR, MG_BIT(15)); // Reset PHY - eth_write_phy(PHY_ADDR, PHY_BCR, MG_BIT(12)); // Set autonegotiation + eth_write_phy(phy_addr, PHY_BCR, MG_BIT(15)); // Reset PHY + eth_write_phy(phy_addr, PHY_BCR, MG_BIT(12)); // Set autonegotiation ETH->DMARDLAR = (uint32_t) (uintptr_t) s_rxdesc; // RX descriptors ETH->DMATDLAR = (uint32_t) (uintptr_t) s_txdesc; // RX descriptors ETH->DMAIER = MG_BIT(6) | MG_BIT(16); // RIE, NISE @@ -146,6 +148,9 @@ static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { ETH->DMAOMR = MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25); // SR, ST, TSF, RSF + MG_DEBUG(("PHY ID: %#04hx %#04hx", eth_read_phy(phy_addr, PHY_ID1), + eth_read_phy(phy_addr, PHY_ID2))); + // MAC address filtering ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4]; ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) | @@ -155,7 +160,7 @@ static bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) { } static size_t mg_tcpip_driver_stm32f_tx(const void *buf, size_t len, - struct mg_tcpip_if *ifp) { + struct mg_tcpip_if *ifp) { if (len > sizeof(s_txbuf[s_txno])) { MG_ERROR(("Frame too big, %ld", (long) len)); len = 0; // Frame is too big @@ -178,10 +183,13 @@ static size_t mg_tcpip_driver_stm32f_tx(const void *buf, size_t len, } static bool mg_tcpip_driver_stm32f_up(struct mg_tcpip_if *ifp) { - uint32_t bsr = eth_read_phy(PHY_ADDR, PHY_BSR); + struct mg_tcpip_driver_stm32f_data *d = + (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data; + uint8_t phy_addr = d == NULL ? 0 : d->phy_addr; + uint32_t bsr = eth_read_phy(phy_addr, PHY_BSR); bool up = bsr & MG_BIT(2) ? 1 : 0; if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) { // link state just went up - uint32_t scsr = eth_read_phy(PHY_ADDR, PHY_CSCR); + uint32_t scsr = eth_read_phy(phy_addr, PHY_CSCR); // tmp = reg with flags set to the most likely situation: 100M full-duplex // if(link is slow or half) set flags otherwise // reg = tmp @@ -222,7 +230,7 @@ void ETH_IRQHandler(void) { ETH->DMARPDR = 0; // and resume RX } -struct mg_tcpip_driver mg_tcpip_driver_stm32f = {mg_tcpip_driver_stm32f_init, - mg_tcpip_driver_stm32f_tx, NULL, - mg_tcpip_driver_stm32f_up}; +struct mg_tcpip_driver mg_tcpip_driver_stm32f = { + mg_tcpip_driver_stm32f_init, mg_tcpip_driver_stm32f_tx, NULL, + mg_tcpip_driver_stm32f_up}; #endif diff --git a/src/drivers/stm32f.h b/src/drivers/stm32f.h index 17737d0b..bec13352 100644 --- a/src/drivers/stm32f.h +++ b/src/drivers/stm32f.h @@ -13,4 +13,6 @@ struct mg_tcpip_driver_stm32f_data { // 216-310 MHz HCLK/124 5 // 110, 111 Reserved int mdc_cr; // Valid values: -1, 0, 1, 2, 3, 4, 5 + + uint8_t phy_addr; // PHY address }; diff --git a/src/queue.c b/src/queue.c index 7eac0d32..bbaffb70 100644 --- a/src/queue.c +++ b/src/queue.c @@ -1,7 +1,9 @@ #include "queue.h" #include "util.h" -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) && (__GNUC__ > 4) || \ + (defined(__GNUC_MINOR__) && __GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \ + defined(__clang__) #define MG_MEMORY_BARRIER() __sync_synchronize() #elif defined(_MSC_VER) && _MSC_VER >= 1700 #define MG_MEMORY_BARRIER() MemoryBarrier()