diff --git a/ClanServer/Controllers/Core/Cardmng.cs b/ClanServer/Controllers/Core/Cardmng.cs index 4b27aa3..2f24f25 100644 --- a/ClanServer/Controllers/Core/Cardmng.cs +++ b/ClanServer/Controllers/Core/Cardmng.cs @@ -16,19 +16,21 @@ namespace ClanServer.Controllers.Core [HttpPost, XrpcCall("cardmng.inquire")] public ActionResult Inquire([FromBody] EamuseXrpcData data) { - string cardid = data.Document.Element("call").Element("cardmng").Attribute("cardid").Value; - string cardType = data.Document.Element("call").Element("cardmng").Attribute("cardtype").Value; - string update = data.Document.Element("call").Element("cardmng").Attribute("update").Value; + XElement cardmng = data.Document.Element("call").Element("cardmng"); + + string cardid = cardmng.Attribute("cardid").Value; + string cardType = cardmng.Attribute("cardtype").Value; + string update = cardmng.Attribute("update").Value; if (update != "") // TODO: actually register cards { data.Document = new XDocument(new XElement("response", new XElement("cardmng", new XAttribute("binded", "1"), new XAttribute("dataid", "DD389C3FFB6F47BA"), - new XAttribute("refid", "DD389C3FFB6F47BA"), new XAttribute("ecflag", "1"), new XAttribute("newflag", "0"), - new XAttribute("expired", "0") + new XAttribute("expired", "0"), + new XAttribute("refid", "DD389C3FFB6F47BA") ))); } else @@ -44,11 +46,35 @@ namespace ClanServer.Controllers.Core [HttpPost, XrpcCall("cardmng.authpass")] public ActionResult Authpass([FromBody] EamuseXrpcData data) { + XElement cardmng = data.Document.Element("call").Element("cardmng"); + + string pass = cardmng.Attribute("pass").Value; + string refId = cardmng.Attribute("refid").Value; + + //TODO + data.Document = new XDocument(new XElement("response", new XElement("cardmng", new XAttribute("status", "0") ))); return data; } + + [HttpPost, XrpcCall("cardmng.getrefid")] + public ActionResult GetRefId([FromBody] EamuseXrpcData data) + { + XElement cardmng = data.Document.Element("call").Element("cardmng"); + + //TODO: register new user + + Console.WriteLine(data.Document); + + data.Document = new XDocument(new XElement("response", new XElement("cardmng", + new XAttribute("dataid", "DD389C3FFB6F47BA"), + new XAttribute("refid", "DD389C3FFB6F47BA") + ))); + + return data; + } } } diff --git a/ClanServer/Controllers/L44/Demodata.cs b/ClanServer/Controllers/L44/Demodata.cs index e816c85..714e3c1 100644 --- a/ClanServer/Controllers/L44/Demodata.cs +++ b/ClanServer/Controllers/L44/Demodata.cs @@ -9,7 +9,7 @@ using eAmuseCore.KBinXML; using ClanServer.Routing; -namespace ClanServer.Controllers.Core +namespace ClanServer.Controllers.L44 { [ApiController, Route("L44")] public class DemodataController : ControllerBase @@ -34,6 +34,14 @@ namespace ClanServer.Controllers.Core return data; } + [HttpPost, Route("8"), XrpcCall("demodata.get_hitchart")] + public ActionResult GetHitchart([FromBody] EamuseXrpcData data) + { + data.Document = new XDocument(new XElement("response", new XElement("demodata"))); + + return data; + } + [HttpPost, Route("8"), XrpcCall("demodata.get_jbox_list")] public ActionResult GetJboxList([FromBody] EamuseXrpcData data) { diff --git a/ClanServer/Controllers/L44/Gametop.cs b/ClanServer/Controllers/L44/Gametop.cs new file mode 100644 index 0000000..76b36c1 --- /dev/null +++ b/ClanServer/Controllers/L44/Gametop.cs @@ -0,0 +1,338 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Xml.Linq; +using Microsoft.AspNetCore.Mvc; + +using eAmuseCore.KBinXML; + +using ClanServer.Routing; + +namespace ClanServer.Controllers.L44 +{ + [ApiController, Route("L44")] + public class GametopController : ControllerBase + { + [HttpPost, Route("8"), XrpcCall("gametop.regist")] + public ActionResult Register([FromBody] EamuseXrpcData data) + { + //TODO + data.Document = new XDocument(new XElement("response", new XElement("gametop"))); + + return data; + } + + [HttpPost, Route("8"), XrpcCall("gametop.get_pdata")] + public ActionResult GetPdata([FromBody] EamuseXrpcData data) + { + var gametop = data.Document.Element("call").Element("gametop"); + var player = gametop.Element("data").Element("player"); + + string refId = player.Element("refid").Value; + + data.Document = new XDocument(new XElement("response", new XElement("gametop", + new XElement("data", + GetInfoElement(), + GetPlayerElement(refId) + ) + ))); + + return data; + } + + public static XElement GetInfoElement() + { + return new XElement("info", + new XElement("event_info", + new XElement("event", new XAttribute("type", "15"), + new KU8("state", 1) + ), + new XElement("event", new XAttribute("type", "5"), + new KU8("state", 0) + ), + new XElement("event", new XAttribute("type", "6"), + new KU8("state", 0) + ) + ), + new XElement("share_music"), + new XElement("genre_def_music"), + new KS32("black_jacket_list", 64, 0), + new KS32("white_music_list", 64, -1), + new KS32("white_marker_list", 16, -1), + new KS32("white_theme_list", 16, -1), + new KS32("open_music_list", 64, -1), + new KS32("shareable_music_list", 64, -1), + new XElement("jbox", + new KS32("point", 1), + new XElement("emblem", + new XElement("normal", + new KS16("index", 50) + ), + new XElement("premium", + new KS16("index", 50) + ) + ) + ), + new XElement("collection", + new XElement("rating_s") + ), + new XElement("expert_option", + new KBool("is_available", true) + ), + new XElement("all_music_matching", + new KBool("is_available", false) + ), + new XElement("department", + new XElement("pack_list") + ) + ); + } + + private XElement GetPlayerElement(string refId) + { + int[] musicList = new int[64] + { + -2013265951, -102760493, 1711275733, -1579088899, + -108536, -227069, -33554401, 16383, + 0, -1377473, -402653185, -2097153, + -1231036417, -786433, -444727297, -1, + 980541439, -33357824, 1077928957, 133988323, + 1075838048, -32706, -234907777, -196609, + 33138687, -2097152, -907557381, -2, + -134217841, -34734081, -524293, -1641628417, + -1, -1, -2177, -7532097, + -3, 264241151, 2080768, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0 + }; + + int[] secretList = musicList; + int[] themeList = new int[16] { 1023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int[] markerList = new int[16] { -1, 7167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + int[] titleList = new int[160]; + titleList[0] = 1; + titleList[5] = 65536; + titleList[11] = 1024; + titleList[12] = 1048576; + + int[] partsList = new int[160]; + partsList[0] = 1; + partsList[58] = -2147483648; + partsList[60] = 32; + + int[] emblemList = new int[96]; + emblemList[0] = 1; + emblemList[7] = 16; + emblemList[13] = 536870916; + emblemList[16] = 65536; + emblemList[18] = 4194304; + emblemList[22] = 268435456; + emblemList[24] = 65536; + emblemList[25] = 8388624; + emblemList[33] = 147456; + emblemList[37] = 4194312; + emblemList[38] = 33554432; + emblemList[39] = 205520896; + emblemList[42] = 2080; + emblemList[43] = 2; + emblemList[45] = 512; + + int[] commuList = markerList; + + return new XElement("player", + new KS32("jid", 612645048), + new KS32("session_id", 1), + new KStr("name", "CLANTEST"), + new KU64("event_flag", 2), + new XElement("info", + new KS32("tune_cnt", 991), + new KS32("save_cnt", 0), + new KS32("saved_cnt", 45), + new KS32("fc_cnt", 40), + new KS32("ex_cnt", 0), + new KS32("clear_cnt", 946), + new KS32("match_cnt", 0), + new KS32("beat_cnt", 0), + new KS32("mynews_cnt", 0), + new KS32("mtg_entry_cnt", 0), + new KS32("mtg_hold_cnt", 0), + new KU8("mtg_result", 0), + new KS32("bonus_tune_points", 320), + new KBool("is_bonus_tune_played", true) + ), + new XElement("last", + new KS64("play_time", 0), + new KStr("shopname", "x"), + new KStr("areaname", "x"), + new KS32("music_id", 70000183), + new KS8("seq_id", 1), + new KStr("seq_edit_id", ""), + new KS8("sort", 3), + new KS8("category", 24), + new KS8("expert_option", 0), + new XElement("settings", + new KS8("marker", 3), + new KS8("theme", 6), + new KS16("title", 0), + new KS16("parts", 0), + new KS8("rank_sort", 1), + new KS8("combo_disp", 1), + new KS16("emblem", new short[] { 0, 823, 0, 0, 0 }), + new KS8("matching", 0), + new KS8("hard", 0), + new KS8("hazard", 0) + ) + ), + new XElement("item", + new KS32("music_list", musicList), + new KS32("secret_list", secretList), + new KS32("theme_list", themeList), + new KS32("marker_list", markerList), + new KS32("title_list", titleList), + new KS32("parts_list", partsList), + new KS32("emblem_list", emblemList), + new KS32("commu_list", commuList), + new XElement("new", + new KS32("secret_list", 64, 0), + new KS32("theme_list", 16, 0), + new KS32("marker_list", 16, 0) + ) + ), + new XElement("team", new XAttribute("id", "1"), + new KS32("section", 4), + new KS32("street", 6), + new KS32("house_number_1", 67), + new KS32("house_number_2", 1), + new XElement("move", + new XAttribute("house_number_1", 67), + new XAttribute("house_number_2", 1), + new XAttribute("id", 1), + new XAttribute("section", 4), + new XAttribute("street", 6) + ) + ), + new XElement("jbox", + new KS32("point", 700), + new XElement("emblem", + new XElement("normal", + new KS16("index", 1182) + ), + new XElement("premium", + new KS16("index", 1197) + ) + ) + ), + new XElement("news", + new KS16("checked", 0), + new KU32("checked_flag", 1) + ), + new XElement("free_first_play", + new KBool("is_available", false) + ), + new XElement("event_info", + new XElement("event", new XAttribute("type", "15"), + new KU8("state", 1) + ) + ), + new XElement("new_music"), + new XElement("gift_list"), + new XElement("jubility", new XAttribute("param", "0"), + new XElement("target_music_list") + ), + new XElement("born", + new KS8("status", 1), + new KS16("year", 2000) + ), + new XElement("question_list"), + new XElement("official_news", + new XElement("news_list") + ), + GenDroplist(), + new XElement("daily_bonus_list"), + GenClanCourseList(), + new XElement("server"), + new XElement("rivallist"), + new XElement("fc_challenge", + new XElement("today", + new KS32("music_id", 40000057), + new KU8("state", 0) + ), + new XElement("whim", + new KS32("music_id", 30000041), + new KU8("state", 80) + ) + ), + new XElement("navi", + new KU64("flag", 122) + ) + ); + } + + private static XElement GenClanCourseList() + { + XElement categoryList = new XElement("category_list"); + + for (int i = 1; i <= 6; ++i) + { + categoryList.Add(new XElement("category", new XAttribute("id", i), + new KBool("is_display", true) + )); + } + + return new XElement("clan_course_list", + new XElement("clan_course", new XAttribute("id", "50"), + new KS8("status", 1) + ), + categoryList + ); + } + + private static XElement GenDroplist() + { + var res = new XElement("drop_list"); + var item_list = new XElement("item_list"); + + for (int i = 1; i <= 10; ++i) + { + item_list.Add(new XElement("item", new XAttribute("id", i), + new KS32("num", 0) + )); + } + + for (int i = 1; i <= 10; ++i) + { + res.Add(new XElement("drop", new XAttribute("id", i), + new KS32("exp", 0), + new KS32("flag", 0), + item_list + )); + } + + return res; + } + + [HttpPost, Route("8"), XrpcCall("gametop.get_mdata")] + public ActionResult GetMdata([FromBody] EamuseXrpcData data) + { + //TODO + data.Document = new XDocument(new XElement("response", new XElement("gametop"))); + + return data; + } + + [HttpPost, Route("8"), XrpcCall("gametop.get_meeting")] + public ActionResult GetMeeting([FromBody] EamuseXrpcData data) + { + //TODO + data.Document = new XDocument(new XElement("response", new XElement("gametop"))); + + return data; + } + } +} diff --git a/ClanServer/Controllers/L44/Lobby.cs b/ClanServer/Controllers/L44/Lobby.cs new file mode 100644 index 0000000..9eabb5e --- /dev/null +++ b/ClanServer/Controllers/L44/Lobby.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Xml.Linq; +using Microsoft.AspNetCore.Mvc; + +using eAmuseCore.KBinXML; + +using ClanServer.Routing; + +namespace ClanServer.Controllers.L44 +{ + [ApiController, Route("L44")] + public class LobbyController : ControllerBase + { + [HttpPost, Route("8"), XrpcCall("lobby.check")] + public ActionResult Check([FromBody] EamuseXrpcData data) + { + //TODO + data.Document = new XDocument(new XElement("response", new XElement("lobby"))); + + return data; + } + + [HttpPost, Route("8"), XrpcCall("lobby.entry")] + public ActionResult Entry([FromBody] EamuseXrpcData data) + { + //TODO + data.Document = new XDocument(new XElement("response", new XElement("lobby"))); + + return data; + } + } +} diff --git a/ClanServer/Controllers/L44/Recommend.cs b/ClanServer/Controllers/L44/Recommend.cs new file mode 100644 index 0000000..cbfbf02 --- /dev/null +++ b/ClanServer/Controllers/L44/Recommend.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Xml.Linq; +using Microsoft.AspNetCore.Mvc; + +using eAmuseCore.KBinXML; + +using ClanServer.Routing; + +namespace ClanServer.Controllers.L44 +{ + [ApiController, Route("L44")] + public class RecommendController : ControllerBase + { + [HttpPost, Route("8"), XrpcCall("recommend.get_recommend")] + public ActionResult GetRecommend([FromBody] EamuseXrpcData data) + { + //TODO + data.Document = new XDocument(new XElement("response", new XElement("get_pdata"))); + + return data; + } + } +} diff --git a/ClanServer/Controllers/L44/Shopinfo.cs b/ClanServer/Controllers/L44/Shopinfo.cs index 62525b7..2e4df03 100644 --- a/ClanServer/Controllers/L44/Shopinfo.cs +++ b/ClanServer/Controllers/L44/Shopinfo.cs @@ -10,7 +10,7 @@ using eAmuseCore.KBinXML; using ClanServer.Formatters; using ClanServer.Routing; -namespace ClanServer.Controllers.Core +namespace ClanServer.Controllers.L44 { [ApiController, Route("L44")] public class ShopinfoController : ControllerBase @@ -28,50 +28,7 @@ namespace ClanServer.Controllers.Core new KU32("exist", 0) ), new KU64("event_flag", 0), - new XElement("info", - new XElement("event_info", - new XElement("event", new XAttribute("type", "15"), - new KU8("state", 1) - ), - new XElement("event", new XAttribute("type", "5"), - new KU8("state", 0) - ), - new XElement("event", new XAttribute("type", "6"), - new KU8("state", 0) - ) - ), - new XElement("share_music"), - new XElement("genre_def_music"), - new KS32("black_jacket_list", 64, 0), - new KS32("white_music_list", 64, -1), - new KS32("white_marker_list", 16, -1), - new KS32("white_theme_list", 16, -1), - new KS32("open_music_list", 64, -1), - new KS32("shareable_music_list", 64, -1), - new XElement("jbox", - new KS32("point", 1), - new XElement("emblem", - new XElement("normal", - new KS16("index", 50) - ), - new XElement("premium", - new KS16("index", 50) - ) - ) - ), - new XElement("collection", - new XElement("rating_s") - ), - new XElement("expert_option", - new KBool("is_available", true) - ), - new XElement("all_music_matching", - new KBool("is_available", false) - ), - new XElement("department", - new XElement("pack_list") - ) - ) + GametopController.GetInfoElement() )))); return data; diff --git a/eAmuseTest/Program.cs b/eAmuseTest/Program.cs index 12c7af2..c524c43 100644 --- a/eAmuseTest/Program.cs +++ b/eAmuseTest/Program.cs @@ -15,9 +15,9 @@ namespace eAmuseTest { static void Main(string[] args) { - string compress = "none"; - string eamuse_info = "1-5cf04a26-56c5"; - byte[] data = HexToBytes("a7a4eef0f58176b89e5f6d0c91df45549f0fdb12a7ea731e9f2f52a85db742ed71eceeee848cfcedf8ca2b59161900ba"); + string compress = "lz77"; + string eamuse_info = "1-5cf04a26-3fad"; + byte[] data = HexToBytes("192b636607070f377148b5595cd163d2f224970b04a6aceae90c1885895c265707be27cdb266822bac0a49a9ccdc67218b34e5f52efcd797bc0ac5e2bee85e252b03e152865c6f0fb9e9bfa31c8f76feef59cb00fb6fb2e33f265d91adab4cbb49221b4c3453047cb7ca865cfd904417b526ff8b0310b5a64e3afc303ed3c756d36fd341e5541025ee0d740da97b3e739aaf1e49520fb39d860c6e43c42eab9b31523733942a81d671468301d5f3cb9b2e15ea8de4151ccc6414afb4ed062437257f082b2a446f089b9fa40c4fd9c60c80b612c3990f4002cf983b29616e32f7a545de443531fa0570fed58106a4bb77194f8bea18d347165caabe5332a12fe69e78e91c8b18b02eab9f205cc31021ae63270398e9610e04297b709dacf3310c14df753d8affae0d3f1b6712f8d663b7262a8d351e8184e5cfcf1fb2ac83a4ac2eefb918cae357b3013ea3a45b4906f7e5dbdf0eb9cdaced18acd5836e4ec05cc221b68217f2cd7abe90a0b70e3a7bb19c3dd54c623f554c3ce409c194d6fe104c1dbea3e9e61726336b59c1d27b7fd05f746b767d28209a4dbe432e06d3322fcd3dd92fe7dc950d9d2de6a54999938cbe76f483751b69d969e7cbf20179b91fb97fe5fe285ecdea9b754f649305909afa56b0c85c5335cc805cd1cfce2ac5656da1b46f9a50147dfe1d9d0e98f17c149daba41d9628bd77adad0e9c3e7c8b8ee3f6c1e112f3b770dfe361626107264a618b5db4fc70bd46c147031ccbe07ec7face27d5473f4bc414db4b1d37e913b2c31eac8e3a7819566f7b297495422e77cc7a6a3a9a5bd35d290ea2c32bedde889110400a668312c81b5958c8c2c65797e6cd2bc1e28d70be10e7e873dd5ecea371eba78f13bddf913d37465a5b3b81be08a5e911d34b4801838073b2bd8e53c0c0f559f3b9b39bbc663f9f1b7b907ffc436f3d35517d9c297c0a9a7ed7e492cbce674df575d22025e3b80d630d6fe3142c2b72adbb896b9b08b86ace6af4f38655c18894ccc6ea0ae6bcea31e01b70a642b65e530e5e3cf0d479f6b07faede5c545c139203f6abae96957df6899d7f9a638bb52bb20a53e804218ac031287c415b28de6e1d49b3875125212cd4090915ef1fc88dead3dfa77fff6b4c9fcc93148cd674f84e1fb49d91288b80c298691fdeb98a832fa85b1da2a9a067640849bdef235b2af8baa7ee3e31983e3327a0d4550c72fdf1722e72b98c2431c7f58ca2e76814faee980eaf22f0ba73c6a199d69d36261f118255ccc6e13041a82ad98837c12634c1e0ce5b8461c7e326bbdec46c1f3d2165be3a22a05c2f30be704337f45c455613800a14e333c1dd2a31a4b344e395cbe57a75a340babd40ebbd9e60008a62956c3eb3add3d53891243ca7c4875651b7a5cac07336c55f37548c3576243af80762334af9c66458bfce1946969ca5fdfa4944f957cb5ad029442624b35fa1783b613247ec2c292cc9b59c2ba767b6e083b813f80bbe2120891956f6235b55811af6aae6e80759805ed73e6e1c43c8d8fcefaf844473d7e3f329ab62a705fc04fb68561f76c23fd2ad1bd1c0fd5e8e3ea68b42ee4d220833fe7e488bfc87319decbe512857a55e7505a5c3760d0623ae170ba541afe9cb7880a82607be87c91eefb95ce67cadd30816320641c923a0431aa69d897bf017cb11712170e3d3425de7357fd7c5970dd0611e0645bc0b19489236e00db3a85bcc13846f2432074a373d4766bf88f0eb1e349c63f98d160aafa29ffc2c6da89c3e4036a5573c8883c53f62d83e76a7b0412a1868230cc16c78e24f61e249cd0f66f05a2d976fc9ad5f0d19013866236c8db928b18ccc2e42c27942f3b03a2bdd98160c7c19c06f8b47189e40c56a66482f78c0864d6637247054004c84a7f909fd78351da411d858d0403f15cf7de0b57f716a2c1c3044d1a337a4785c67f278bc82be8b246d0974cffe7305bbae18bbdbe3e1ca00699894e6fb9576cfea806be34e895eaae33f56214fda4b7c9804f5e12153ff2d81b53e7eae5d9afdd3a2d935ce62e757b9afc7086bb44c204e1bc9d9d6e39600bebf3e7f3fd21e825f94dc30cf4e3c73bdf7ea21ba75fd38cc98121d287b5983ec591f06979c875a653923ba34992559b1773e58de0862d1685cf91993511c312b9e16a0e8ec64f456c49c13d9eb0cf4b31c754318a17de0c162e41e79afa0a05dd79c98f61db2d8d500894f0ced55a816a7da3b9ea4361e7912a90258bc0f2b2fa2cbf7e85b70ae067b78291830d1343a8bf91e0127650cdd67d18359a53aed1b71b3adfdb0fbefc3c3fdb133f4241581182a86b4f6783d328c1f4be0180e350704c5ec808ec44322816e084cda96632d4d073afff921f76e1c166716f6a7de2ba5cc555a69561007d96e1fb7acf1b4e6e4a0c979818dde562a17d3d49f6a4a503892f5e04b543c91bdb2150df3fc2eb1860e4643217ebfdab57aff73de05a546ee653eaec1216ed1e8b73f50e2a2a84c1f0437ed16f7ea557a6c32ba46db79edce000b211d5ab0166e82085fda2881d5e22e62131a031c93158a78a4118f5d28d3ce4a0ca9747dac83e0ed2ae1f594b83af110524e252c0dc331f06a2b608396878fe92e531fd76bfb590c202bd2e9a899b44d716e459329b4b6791ff79dfd8b2303ec4e9c0af4bc022727589795d6f7e4c633994824724f2783dbc74b4c79430009505c7c7ffd7c74c361a857aa336776c66d06fde104f68c9931ae2df44eb71280cc8f46a8d546c6c768f3bea7f395c9dc3f28645f72965ae73d0639385e26d2240bcb2f61bb016b9013a4533c32811081c93f88a05e6824edb19b9568ee9693dab036b7ea68693d584455afa0d6169f4e634d848468a2fd2310b0a377de58a2694bc38cb6c9de0ca5eada717ed623db1f637f5a7a67d8642eae3dd6bc605813f2e76c811da394df950d55b40eba83b12b90dd6b5b487fe11bf0ff882a024a85051657c81dbff31dd7bc79da0a7181449c452e67ce6cf012f0e30e37264f034aecc33db1e356371f901439fc2c8d69b3ee0388cbd0ab83692f9a32e113403de48bb10741aa485eca3392a09b0fb64fc7ecd4ab408fd05bd48aa58852f111df8e508e7945ed23c41bb3a2db3e4f4b7f1d83f7ac429f5406b76a83452223db9694668f2b24c7b9ab7c119d64d8c022bc6cd9802868ead9a2182f1385766153c25c77bf512825c2af8aad25eea29a809df5ccc9167316acb13829cd7086ce7dbe03cca7aa4db28ed9ef14ee204c51b5a580495cbf345f731db33783cc8cddffd66f101f110963978a3804fa0fcceab61cd11a8e5c08a6c965a14ee09fd9375b20646b25a7eee4ffa11f5f8ac69d28304c71726f8e75"); compress = compress.ToLower();