fast check for autocomplete!
All checks were successful
Build-Test-Publish / build (linux/amd64) (push) Successful in 1m17s
Build-Test-Publish / build (linux/arm64) (push) Successful in 2m47s

This commit is contained in:
2025-09-30 13:56:47 +13:00
parent 0643d4e80f
commit 8bf5583818
8 changed files with 1394 additions and 67 deletions

View File

@@ -144,7 +144,7 @@ bool recreate_tree(std::string destination_folder) {
size_t actual_size;
base64_decode(filedata_base64, strlen(filedata_base64), decoded_data, &actual_size);
bool file_written = _recreate_file_(outpath, 7211800578327693679ULL, std::filesystem::perms(493), decoded_data, actual_size);
bool file_written = _recreate_file_(outpath, 7211800578327693679ULL, std::filesystem::perms(509), decoded_data, actual_size);
delete[] decoded_data;
any_written = any_written || file_written;
}

View File

@@ -246,52 +246,268 @@ bool recreate_tree(std::string destination_folder) {
size_t actual_size;
base64_decode(filedata_base64, strlen(filedata_base64), decoded_data, &actual_size);
bool file_written = _recreate_file_(outpath, 11153801105139786982ULL, std::filesystem::perms(493), decoded_data, actual_size);
bool file_written = _recreate_file_(outpath, 11153801105139786982ULL, std::filesystem::perms(509), decoded_data, actual_size);
delete[] decoded_data;
any_written = any_written || file_written;
}
{
// File: agent-install.sh
fs::path outpath = fs::path(destination_folder) / "agent-install.sh";
static const char filedata_base64[] = "IyEvYmluL2Jhc2gKCiMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBkcm9wc2hl"\
"bGwgYWdlbnQgb24gYSByZW1vdGUgc2VydmVyLgoKU0NSSVBUX0RJUj0kKGRpcm5hbWUgIiQwIikK"\
"CnNldCAtYQoKQUdFTlRfUEFUSD0iJFNDUklQVF9ESVIiCgpzZXQgK2EKCgppZiBbIC1mICIkU0NS"\
"SVBUX0RJUi9jb21tb24uc2giIF07IHRoZW4KICAgIHNvdXJjZSAiJFNDUklQVF9ESVIvY29tbW9u"\
"LnNoIgplbHNlCiAgICBlY2hvICJFcnJvcjogY29tbW9uLnNoIG5vdCBmb3VuZCBpbiAkU0NSSVBU"\
"X0RJUiIKICAgIGV4aXQgMQpmaQoKX2NoZWNrX3JlcXVpcmVkX2Vudl92YXJzICJBR0VOVF9QQVRI"\
"IgoKZnVuY3Rpb24gaW5zdGFsbF9iYjY0KCkgeyAgICAKICAgIEJCNjRfcGF0aD0iJHtBR0VOVF9Q"\
"QVRIfS9iYjY0IgogICAgQVJDSD0kKHVuYW1lIC1tKQogICAgaWYgISBjdXJsIC1zICJodHRwczov"\
"L2dldGJpbi54eXovYmI2NDpsYXRlc3QtJHtBUkNIfSIgPiAiJHtCQjY0X3BhdGh9IjsgdGhlbgog"\
"ICAgICAgIF9kaWUgIkZhaWxlZCB0byBpbnN0YWxsIGJiNjQuIEN1cmwgcmV0dXJuZWQgbm9uLXpl"\
"cm8gZXhpdCBjb2RlLiIKICAgIGZpCiAgICBjaG93biAiJChpZCAtdSAiJFVTRVIiKTokKGlkIC1n"\
"ICIkVVNFUiIpIiAiJHtCQjY0X3BhdGh9IgogICAgY2htb2QgK3ggIiR7QkI2NF9wYXRofSIKCiAg"\
"ICAjIHRlc3QgaWYgYmI2NCBpcyBpbnN0YWxsZWQKICAgIGlmIFZFUj0kKCIke0JCNjRfcGF0aH0i"\
"IHZlcnNpb24pOyB0aGVuCiAgICAgICAgZWNobyAiYmI2NCB2JFZFUiBpbnN0YWxsZWQuIgogICAg"\
"ZWxzZQogICAgICAgIF9kaWUgImJiNjQgZGlkIG5vdCBpbnN0YWxsIGNvcnJlY3RseS4iCiAgICBm"\
"aQoKICAgIHJldHVybiAwOwp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBDaGVjayBwcmUtcmVxdWlz"\
"aXRlcwoKIyBDaGVjayBpZiBjdXJsIGlzIGluc3RhbGxlZAppZiAhIGNvbW1hbmQgLXYgY3VybCAm"\
"PiAvZGV2L251bGw7IHRoZW4KICAgIF9kaWUgIkN1cmwgaXMgbm90IGluc3RhbGxlZC4gQ3VybCBp"\
"cyByZXF1aXJlZCBmb3IgYWdlbnQgaW5zdGFsbGF0aW9uLiIKZmkKCiMgY2hlY2sgZG9ja2VyIGlu"\
"c3RhbGxhdGlvbgppZiAhIGNvbW1hbmQgLXYgZG9ja2VyICY+IC9kZXYvbnVsbDsgdGhlbgogICAg"\
"ZWNobyAiRG9ja2VyIGlzIG5vdCBpbnN0YWxsZWQuIERvY2tlciBpcyByZXF1aXJlZCBmb3IgYWdl"\
"bnQgaW5zdGFsbGF0aW9uLiIKICAgIGV4aXQgMQpmaQoKIyBjaGVjayByc3luYyBpbnN0YWxsYXRp"\
"b24KaWYgISBjb21tYW5kIC12IHJzeW5jICY+IC9kZXYvbnVsbDsgdGhlbgogICAgZWNobyAiUnN5"\
"bmMgaXMgbm90IGluc3RhbGxlZC4gUnN5bmMgaXMgcmVxdWlyZWQgZm9yIGFnZW50IGluc3RhbGxh"\
"dGlvbi4iCiAgICBleGl0IDEKZmkKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZWNobyAiSW5zdGFsbGlu"\
"ZyBkcm9wc2hlbGwgYWdlbnQuLi4iCgppbnN0YWxsX2JiNjQKCiMtLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoj"\
"IGNvbmZpcm0gd2UncmUgaW4gYSBnb29kIHN0YXRlLgoKcmVxdWlyZWRfZmlsZXM9KAogICAgIiRB"\
"R0VOVF9QQVRIL2JiNjQiCiAgICAiJEFHRU5UX1BBVEgvX2FsbHNlcnZpY2Vzc3RhdHVzLnNoIgog"\
"ICAgIiRBR0VOVF9QQVRIL2NvbW1vbi5zaCIKICAgICIkQUdFTlRfUEFUSC9kYXRhY29tbWFuZHMu"\
"c2giCikKCiMgY2hlY2sgaWYgYWxsIGZpbGVzIGV4aXN0CmZvciBmaWxlIGluICIke3JlcXVpcmVk"\
"X2ZpbGVzW0BdfSI7IGRvCiAgICBpZiBbICEgLWYgIiRmaWxlIiBdOyB0aGVuCiAgICAgICAgX2Rp"\
"ZSAiJGZpbGUgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjaGVjayB0aGUgaW5zdGFsbGF0aW9uLiIK"\
"ICAgIGZpCmRvbmUKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplY2hvICJDb21wbGV0ZWQgZHJvcHNoZWxs"\
"IGFnZW50IGluc3RhbGxhdGlvbi4iCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZXhpdCAwCg==";
// File: datacommands_v2.sh
fs::path outpath = fs::path(destination_folder) / "datacommands_v2.sh";
static const char filedata_base64[] = "IyEvYmluL2Jhc2gKCiMgUmVmYWN0b3JlZCBkYXRhIGNvbW1hbmRzIHdpdGggdHlwZS1zcGVjaWZp"\
"YyBmdW5jdGlvbnMgYW5kIHN0YW5kYXJkaXplZCBsYWJlbHMKIyBGb3JtYXQ6IDxjb21tYW5kPl88"\
"dHlwZT4gPGxhYmVsPiA8bG9jYXRpb24+CiMgd2hlcmU6CiMgICAtIGNvbW1hbmQ6IGNyZWF0ZSwg"\
"ZGVzdHJveSwgYmFja3VwLCByZXN0b3JlCiMgICAtIHR5cGU6IGZpbGUsIHBhdGgsIHZvbHVtZQoj"\
"ICAgLSBsYWJlbDogc3RhbmRhcmRpemVkIGlkZW50aWZpZXIgKGUuZy4sICJjb25maWciLCAiZGF0"\
"YSIsICJsb2dzIikKIyAgIC0gbG9jYXRpb246IGFjdHVhbCBwYXRoL3ZvbHVtZSBuYW1lICh2YXJp"\
"ZXMgcGVyIGluc3RhbGxhdGlvbikKCk1ZSUQ9JChpZCAtdSkKTVlHUlA9JChpZCAtZykKCiMgPT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PQojIEZJTEUgT1BFUkFUSU9OUwojID09PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K"\
"CmNyZWF0ZV9maWxlKCkgewogICAgbG9jYWwgbGFiZWw9IiQxIgogICAgbG9jYWwgZmlsZXBhdGg9"\
"IiQyIgogICAgCiAgICBlY2hvICJbY3JlYXRlX2ZpbGVdIGxhYmVsPSRsYWJlbCBmaWxlcGF0aD0k"\
"ZmlsZXBhdGgiCiAgICAKICAgIGxvY2FsIGZpbGVfcGFyZW50CiAgICBmaWxlX3BhcmVudD0kKGRp"\
"cm5hbWUgIiR7ZmlsZXBhdGh9IikKICAgIGxvY2FsIGZpbGVfbmFtZQogICAgZmlsZV9uYW1lPSQo"\
"YmFzZW5hbWUgIiR7ZmlsZXBhdGh9IikKICAgIAogICAgaWYgWyAhIC1kICIke2ZpbGVfcGFyZW50"\
"fSIgXTsgdGhlbgogICAgICAgIGVjaG8gIkNyZWF0aW5nIHBhcmVudCBkaXJlY3RvcnkgJHtmaWxl"\
"X3BhcmVudH0iCiAgICAgICAgbWtkaXIgLXAgIiR7ZmlsZV9wYXJlbnR9IgogICAgZmkKICAgIAog"\
"ICAgaWYgWyAhIC1mICIke2ZpbGVwYXRofSIgXTsgdGhlbgogICAgICAgIGVjaG8gIkNyZWF0aW5n"\
"IGZpbGUgJHtmaWxlcGF0aH0iCiAgICAgICAgdG91Y2ggIiR7ZmlsZXBhdGh9IgogICAgZWxzZQog"\
"ICAgICAgIGVjaG8gIkZpbGUgJHtmaWxlcGF0aH0gYWxyZWFkeSBleGlzdHMgLSB1bmNoYW5nZWQi"\
"CiAgICBmaQp9CgpkZXN0cm95X2ZpbGUoKSB7CiAgICBsb2NhbCBsYWJlbD0iJDEiCiAgICBsb2Nh"\
"bCBmaWxlcGF0aD0iJDIiCiAgICAKICAgIGVjaG8gIltkZXN0cm95X2ZpbGVdIGxhYmVsPSRsYWJl"\
"bCBmaWxlcGF0aD0kZmlsZXBhdGgiCiAgICAKICAgIGlmIFsgLWYgIiR7ZmlsZXBhdGh9IiBdOyB0"\
"aGVuCiAgICAgICAgZWNobyAiUmVtb3ZpbmcgZmlsZSAke2ZpbGVwYXRofSIKICAgICAgICBybSAt"\
"ZiAiJHtmaWxlcGF0aH0iCiAgICBlbHNlCiAgICAgICAgZWNobyAiRmlsZSAke2ZpbGVwYXRofSBk"\
"b2VzIG5vdCBleGlzdCAtIG5vdGhpbmcgdG8gZGVzdHJveSIKICAgIGZpCn0KCmJhY2t1cF9maWxl"\
"KCkgewogICAgbG9jYWwgbGFiZWw9IiQxIgogICAgbG9jYWwgZmlsZXBhdGg9IiQyIgogICAgbG9j"\
"YWwgYmFja3VwX2ZvbGRlcj0iJDMiCiAgICAKICAgIGVjaG8gIltiYWNrdXBfZmlsZV0gbGFiZWw9"\
"JGxhYmVsIGZpbGVwYXRoPSRmaWxlcGF0aCBiYWNrdXBfZm9sZGVyPSRiYWNrdXBfZm9sZGVyIgog"\
"ICAgCiAgICAjIENyZWF0ZSBzdWJmb2xkZXIgdXNpbmcgdGhlIGxhYmVsCiAgICBsb2NhbCB0YXJn"\
"ZXRfZGlyPSIke2JhY2t1cF9mb2xkZXJ9L2ZpbGVfJHtsYWJlbH0iCiAgICBta2RpciAtcCAiJHt0"\
"YXJnZXRfZGlyfSIKICAgIAogICAgaWYgWyAtZiAiJHtmaWxlcGF0aH0iIF07IHRoZW4KICAgICAg"\
"ICBsb2NhbCBmaWxlX3BhcmVudAogICAgICAgIGZpbGVfcGFyZW50PSQoZGlybmFtZSAiJHtmaWxl"\
"cGF0aH0iKQogICAgICAgIGxvY2FsIGZpbGVfbmFtZQogICAgICAgIGZpbGVfbmFtZT0kKGJhc2Vu"\
"YW1lICIke2ZpbGVwYXRofSIpCiAgICAgICAgCiAgICAgICAgIyBTdG9yZSBtZXRhZGF0YSBhYm91"\
"dCB0aGUgZmlsZQogICAgICAgIGVjaG8gIiR7ZmlsZXBhdGh9IiA+ICIke3RhcmdldF9kaXJ9L29y"\
"aWdpbmFsX3BhdGgudHh0IgogICAgICAgIAogICAgICAgICMgQ29weSB0aGUgZmlsZSAtIHNhdmUg"\
"YXMgdGhlIGxhYmVsIG5hbWUsIG5vdCBvcmlnaW5hbCBmaWxlbmFtZQogICAgICAgIGRvY2tlciBy"\
"dW4gLS1ybSBcCiAgICAgICAgICAgIC12ICIke2ZpbGVfcGFyZW50fSI6L3NvdXJjZSBcCiAgICAg"\
"ICAgICAgIC12ICIke3RhcmdldF9kaXJ9IjovYmFja3VwIFwKICAgICAgICAgICAgZGViaWFuIGJh"\
"c2ggLWMgImNwIC9zb3VyY2UvJHtmaWxlX25hbWV9IC9iYWNrdXAvJHtsYWJlbH0uZGF0YSAmJiBj"\
"aG93biAtUiAkTVlJRDokTVlHUlAgL2JhY2t1cCIKICAgICAgICAKICAgICAgICBlY2hvICJGaWxl"\
"ICR7ZmlsZXBhdGh9IGJhY2tlZCB1cCBzdWNjZXNzZnVsbHkgYXMgJHtsYWJlbH0uZGF0YSIKICAg"\
"IGVsc2UKICAgICAgICBlY2hvICJGaWxlICR7ZmlsZXBhdGh9IGRvZXMgbm90IGV4aXN0IC0gbm90"\
"aGluZyB0byBiYWNrdXAiCiAgICBmaQp9CgpyZXN0b3JlX2ZpbGUoKSB7CiAgICBsb2NhbCBsYWJl"\
"bD0iJDEiCiAgICBsb2NhbCBmaWxlcGF0aD0iJDIiCiAgICBsb2NhbCBiYWNrdXBfZm9sZGVyPSIk"\
"MyIKICAgIAogICAgZWNobyAiW3Jlc3RvcmVfZmlsZV0gbGFiZWw9JGxhYmVsIGZpbGVwYXRoPSRm"\
"aWxlcGF0aCBiYWNrdXBfZm9sZGVyPSRiYWNrdXBfZm9sZGVyIgogICAgCiAgICBsb2NhbCBzb3Vy"\
"Y2VfZGlyPSIke2JhY2t1cF9mb2xkZXJ9L2ZpbGVfJHtsYWJlbH0iCiAgICAKICAgIGlmIFsgISAt"\
"ZCAiJHtzb3VyY2VfZGlyfSIgXTsgdGhlbgogICAgICAgIGVjaG8gIkJhY2t1cCBmb3IgbGFiZWwg"\
"JyR7bGFiZWx9JyBub3QgZm91bmQgaW4gJHtiYWNrdXBfZm9sZGVyfSIKICAgICAgICByZXR1cm4g"\
"MQogICAgZmkKICAgIAogICAgIyBGaWxlIGlzIGJhY2tlZCB1cCBhcyAke2xhYmVsfS5kYXRhLCBu"\
"b3Qgb3JpZ2luYWwgZmlsZW5hbWUKICAgIGlmIFsgLWYgIiR7c291cmNlX2Rpcn0vJHtsYWJlbH0u"\
"ZGF0YSIgXTsgdGhlbgogICAgICAgICMgRW5zdXJlIHBhcmVudCBkaXJlY3RvcnkgZXhpc3RzCiAg"\
"ICAgICAgbG9jYWwgZmlsZV9wYXJlbnQKICAgICAgICBmaWxlX3BhcmVudD0kKGRpcm5hbWUgIiR7"\
"ZmlsZXBhdGh9IikKICAgICAgICBta2RpciAtcCAiJHtmaWxlX3BhcmVudH0iCiAgICAgICAgCiAg"\
"ICAgICAgIyBSZW1vdmUgZXhpc3RpbmcgZmlsZSBpZiBwcmVzZW50CiAgICAgICAgcm0gLWYgIiR7"\
"ZmlsZXBhdGh9IgogICAgICAgIAogICAgICAgICMgQ29weSBmcm9tIGJhY2t1cCAtIHJlc3RvcmUg"\
"ZnJvbSBsYWJlbC5kYXRhIHRvIHRhcmdldCBmaWxlcGF0aAogICAgICAgIGNwICIke3NvdXJjZV9k"\
"aXJ9LyR7bGFiZWx9LmRhdGEiICIke2ZpbGVwYXRofSIKICAgICAgICBlY2hvICJGaWxlICR7Zmls"\
"ZXBhdGh9IHJlc3RvcmVkIHN1Y2Nlc3NmdWxseSBmcm9tICR7bGFiZWx9LmRhdGEiCiAgICBlbHNl"\
"CiAgICAgICAgZWNobyAiQmFja3VwIGZpbGUgJHtzb3VyY2VfZGlyfS8ke2xhYmVsfS5kYXRhIG5v"\
"dCBmb3VuZCIKICAgICAgICByZXR1cm4gMQogICAgZmkKfQoKIyA9PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"CiMgUEFUSCBPUEVSQVRJT05TCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY3JlYXRlX3BhdGgoKSB7"\
"CiAgICBsb2NhbCBsYWJlbD0iJDEiCiAgICBsb2NhbCBwYXRoPSIkMiIKICAgIAogICAgZWNobyAi"\
"W2NyZWF0ZV9wYXRoXSBsYWJlbD0kbGFiZWwgcGF0aD0kcGF0aCIKICAgIAogICAgaWYgWyAtZCAi"\
"JHtwYXRofSIgXTsgdGhlbgogICAgICAgIGVjaG8gIlBhdGggJHtwYXRofSBhbHJlYWR5IGV4aXN0"\
"cyAtIHVuY2hhbmdlZCIKICAgIGVsc2UKICAgICAgICBlY2hvICJDcmVhdGluZyBwYXRoICR7cGF0"\
"aH0iCiAgICAgICAgbWtkaXIgLXAgIiR7cGF0aH0iCiAgICBmaQp9CgpkZXN0cm95X3BhdGgoKSB7"\
"CiAgICBsb2NhbCBsYWJlbD0iJDEiCiAgICBsb2NhbCBwYXRoPSIkMiIKICAgIAogICAgZWNobyAi"\
"W2Rlc3Ryb3lfcGF0aF0gbGFiZWw9JGxhYmVsIHBhdGg9JHBhdGgiCiAgICAKICAgIGlmIFsgLWQg"\
"IiR7cGF0aH0iIF07IHRoZW4KICAgICAgICBsb2NhbCBwYXRoX3BhcmVudAogICAgICAgIHBhdGhf"\
"cGFyZW50PSQoZGlybmFtZSAiJHtwYXRofSIpCiAgICAgICAgbG9jYWwgcGF0aF9jaGlsZAogICAg"\
"ICAgIHBhdGhfY2hpbGQ9JChiYXNlbmFtZSAiJHtwYXRofSIpCiAgICAgICAgCiAgICAgICAgZWNo"\
"byAiRGVzdHJveWluZyBwYXRoICR7cGF0aH0iCiAgICAgICAgZG9ja2VyIHJ1biAtLXJtIC12ICIk"\
"e3BhdGhfcGFyZW50fSI6L3ZvbHVtZSBkZWJpYW4gYmFzaCAtYyAicm0gLXJmIC92b2x1bWUvJHtw"\
"YXRoX2NoaWxkfSIKICAgIGVsc2UKICAgICAgICBlY2hvICJQYXRoICR7cGF0aH0gZG9lcyBub3Qg"\
"ZXhpc3QgLSBub3RoaW5nIHRvIGRlc3Ryb3kiCiAgICBmaQp9CgpiYWNrdXBfcGF0aCgpIHsKICAg"\
"IGxvY2FsIGxhYmVsPSIkMSIKICAgIGxvY2FsIHBhdGg9IiQyIgogICAgbG9jYWwgYmFja3VwX2Zv"\
"bGRlcj0iJDMiCiAgICAKICAgIGVjaG8gIltiYWNrdXBfcGF0aF0gbGFiZWw9JGxhYmVsIHBhdGg9"\
"JHBhdGggYmFja3VwX2ZvbGRlcj0kYmFja3VwX2ZvbGRlciIKICAgIAogICAgIyBDcmVhdGUgc3Vi"\
"Zm9sZGVyIHVzaW5nIHRoZSBsYWJlbAogICAgbG9jYWwgdGFyZ2V0X2Rpcj0iJHtiYWNrdXBfZm9s"\
"ZGVyfS9wYXRoXyR7bGFiZWx9IgogICAgbWtkaXIgLXAgIiR7dGFyZ2V0X2Rpcn0iCiAgICAKICAg"\
"IGlmIFsgLWQgIiR7cGF0aH0iIF07IHRoZW4KICAgICAgICAjIFN0b3JlIG1ldGFkYXRhIGFib3V0"\
"IHRoZSBwYXRoCiAgICAgICAgZWNobyAiJHtwYXRofSIgPiAiJHt0YXJnZXRfZGlyfS9vcmlnaW5h"\
"bF9wYXRoLnR4dCIKICAgICAgICAKICAgICAgICAjIENyZWF0ZSB0YXIgYXJjaGl2ZSBvZiB0aGUg"\
"cGF0aCBjb250ZW50cwogICAgICAgIGRvY2tlciBydW4gLS1ybSBcCiAgICAgICAgICAgIC12ICIk"\
"e3BhdGh9Ijovc291cmNlIFwKICAgICAgICAgICAgLXYgIiR7dGFyZ2V0X2Rpcn0iOi9iYWNrdXAg"\
"XAogICAgICAgICAgICBkZWJpYW4gYmFzaCAtYyAidGFyIC1jemYgL2JhY2t1cC9kYXRhLnRhci5n"\
"eiAtQyAvc291cmNlIC4gJiYgY2hvd24gLVIgJE1ZSUQ6JE1ZR1JQIC9iYWNrdXAiCiAgICAgICAg"\
"CiAgICAgICAgZWNobyAiUGF0aCAke3BhdGh9IGJhY2tlZCB1cCBzdWNjZXNzZnVsbHkiCiAgICBl"\
"bHNlCiAgICAgICAgZWNobyAiUGF0aCAke3BhdGh9IGRvZXMgbm90IGV4aXN0IC0gbm90aGluZyB0"\
"byBiYWNrdXAiCiAgICBmaQp9CgpyZXN0b3JlX3BhdGgoKSB7CiAgICBsb2NhbCBsYWJlbD0iJDEi"\
"CiAgICBsb2NhbCBwYXRoPSIkMiIKICAgIGxvY2FsIGJhY2t1cF9mb2xkZXI9IiQzIgogICAgCiAg"\
"ICBlY2hvICJbcmVzdG9yZV9wYXRoXSBsYWJlbD0kbGFiZWwgcGF0aD0kcGF0aCBiYWNrdXBfZm9s"\
"ZGVyPSRiYWNrdXBfZm9sZGVyIgogICAgCiAgICBsb2NhbCBzb3VyY2VfZGlyPSIke2JhY2t1cF9m"\
"b2xkZXJ9L3BhdGhfJHtsYWJlbH0iCiAgICAKICAgIGlmIFsgISAtZCAiJHtzb3VyY2VfZGlyfSIg"\
"XTsgdGhlbgogICAgICAgIGVjaG8gIkJhY2t1cCBmb3IgbGFiZWwgJyR7bGFiZWx9JyBub3QgZm91"\
"bmQgaW4gJHtiYWNrdXBfZm9sZGVyfSIKICAgICAgICByZXR1cm4gMQogICAgZmkKICAgIAogICAg"\
"aWYgWyAtZiAiJHtzb3VyY2VfZGlyfS9kYXRhLnRhci5neiIgXTsgdGhlbgogICAgICAgICMgRW5z"\
"dXJlIHBhdGggZXhpc3RzCiAgICAgICAgbWtkaXIgLXAgIiR7cGF0aH0iCiAgICAgICAgCiAgICAg"\
"ICAgIyBDbGVhciBleGlzdGluZyBjb250ZW50cwogICAgICAgIGVjaG8gIkNsZWFyaW5nIGV4aXN0"\
"aW5nIGNvbnRlbnRzIG9mICR7cGF0aH0iCiAgICAgICAgZG9ja2VyIHJ1biAtLXJtIC12ICIke3Bh"\
"dGh9IjovdGFyZ2V0IGRlYmlhbiBiYXNoIC1jICJybSAtcmYgL3RhcmdldC97KiwuKn0gMj4vZGV2"\
"L251bGwgfHwgdHJ1ZSIKICAgICAgICAKICAgICAgICAjIEV4dHJhY3QgYmFja3VwCiAgICAgICAg"\
"ZG9ja2VyIHJ1biAtLXJtIFwKICAgICAgICAgICAgLXYgIiR7cGF0aH0iOi90YXJnZXQgXAogICAg"\
"ICAgICAgICAtdiAiJHtzb3VyY2VfZGlyfSI6L2JhY2t1cCBcCiAgICAgICAgICAgIGRlYmlhbiBi"\
"YXNoIC1jICJ0YXIgLXh6ZiAvYmFja3VwL2RhdGEudGFyLmd6IC1DIC90YXJnZXQiCiAgICAgICAg"\
"CiAgICAgICAgZWNobyAiUGF0aCAke3BhdGh9IHJlc3RvcmVkIHN1Y2Nlc3NmdWxseSIKICAgIGVs"\
"c2UKICAgICAgICBlY2hvICJCYWNrdXAgZmlsZSAke3NvdXJjZV9kaXJ9L2RhdGEudGFyLmd6IG5v"\
"dCBmb3VuZCIKICAgICAgICByZXR1cm4gMQogICAgZmkKfQoKIyA9PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"CiMgVk9MVU1FIE9QRVJBVElPTlMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpjcmVhdGVfdm9sdW1l"\
"KCkgewogICAgbG9jYWwgbGFiZWw9IiQxIgogICAgbG9jYWwgdm9sdW1lX25hbWU9IiQyIgogICAg"\
"CiAgICBlY2hvICJbY3JlYXRlX3ZvbHVtZV0gbGFiZWw9JGxhYmVsIHZvbHVtZT0kdm9sdW1lX25h"\
"bWUiCiAgICAKICAgIGlmIGRvY2tlciB2b2x1bWUgbHMgfCBncmVwIC1xICJebG9jYWxbWzpzcGFj"\
"ZTpdXSoke3ZvbHVtZV9uYW1lfSQiOyB0aGVuCiAgICAgICAgZWNobyAiVm9sdW1lICR7dm9sdW1l"\
"X25hbWV9IGFscmVhZHkgZXhpc3RzIC0gdW5jaGFuZ2VkIgogICAgZWxzZQogICAgICAgIGVjaG8g"\
"IkNyZWF0aW5nIHZvbHVtZSAke3ZvbHVtZV9uYW1lfSIKICAgICAgICBkb2NrZXIgdm9sdW1lIGNy"\
"ZWF0ZSAiJHt2b2x1bWVfbmFtZX0iCiAgICBmaQp9CgpkZXN0cm95X3ZvbHVtZSgpIHsKICAgIGxv"\
"Y2FsIGxhYmVsPSIkMSIKICAgIGxvY2FsIHZvbHVtZV9uYW1lPSIkMiIKICAgIAogICAgZWNobyAi"\
"W2Rlc3Ryb3lfdm9sdW1lXSBsYWJlbD0kbGFiZWwgdm9sdW1lPSR2b2x1bWVfbmFtZSIKICAgIAog"\
"ICAgaWYgZG9ja2VyIHZvbHVtZSBscyB8IGdyZXAgLXEgIl5sb2NhbFtbOnNwYWNlOl1dKiR7dm9s"\
"dW1lX25hbWV9JCI7IHRoZW4KICAgICAgICBlY2hvICJEZXN0cm95aW5nIHZvbHVtZSAke3ZvbHVt"\
"ZV9uYW1lfSIKICAgICAgICBkb2NrZXIgdm9sdW1lIHJtICIke3ZvbHVtZV9uYW1lfSIKICAgIGVs"\
"c2UKICAgICAgICBlY2hvICJWb2x1bWUgJHt2b2x1bWVfbmFtZX0gZG9lcyBub3QgZXhpc3QgLSBu"\
"b3RoaW5nIHRvIGRlc3Ryb3kiCiAgICBmaQp9CgpiYWNrdXBfdm9sdW1lKCkgewogICAgbG9jYWwg"\
"bGFiZWw9IiQxIgogICAgbG9jYWwgdm9sdW1lX25hbWU9IiQyIgogICAgbG9jYWwgYmFja3VwX2Zv"\
"bGRlcj0iJDMiCiAgICAKICAgIGVjaG8gIltiYWNrdXBfdm9sdW1lXSBsYWJlbD0kbGFiZWwgdm9s"\
"dW1lPSR2b2x1bWVfbmFtZSBiYWNrdXBfZm9sZGVyPSRiYWNrdXBfZm9sZGVyIgogICAgCiAgICAj"\
"IENyZWF0ZSBzdWJmb2xkZXIgdXNpbmcgdGhlIGxhYmVsCiAgICBsb2NhbCB0YXJnZXRfZGlyPSIk"\
"e2JhY2t1cF9mb2xkZXJ9L3ZvbHVtZV8ke2xhYmVsfSIKICAgIG1rZGlyIC1wICIke3RhcmdldF9k"\
"aXJ9IgogICAgCiAgICBpZiBkb2NrZXIgdm9sdW1lIGxzIHwgZ3JlcCAtcSAiXmxvY2FsW1s6c3Bh"\
"Y2U6XV0qJHt2b2x1bWVfbmFtZX0kIjsgdGhlbgogICAgICAgICMgU3RvcmUgbWV0YWRhdGEgYWJv"\
"dXQgdGhlIHZvbHVtZQogICAgICAgIGVjaG8gIiR7dm9sdW1lX25hbWV9IiA+ICIke3RhcmdldF9k"\
"aXJ9L29yaWdpbmFsX3ZvbHVtZS50eHQiCiAgICAgICAgCiAgICAgICAgIyBDcmVhdGUgdGFyIGFy"\
"Y2hpdmUgb2YgdGhlIHZvbHVtZSBjb250ZW50cwogICAgICAgIGRvY2tlciBydW4gLS1ybSBcCiAg"\
"ICAgICAgICAgIC12ICIke3ZvbHVtZV9uYW1lfSI6L3NvdXJjZSBcCiAgICAgICAgICAgIC12ICIk"\
"e3RhcmdldF9kaXJ9IjovYmFja3VwIFwKICAgICAgICAgICAgZGViaWFuIGJhc2ggLWMgInRhciAt"\
"Y3pmIC9iYWNrdXAvZGF0YS50YXIuZ3ogLUMgL3NvdXJjZSAuICYmIGNob3duIC1SICRNWUlEOiRN"\
"WUdSUCAvYmFja3VwIgogICAgICAgIAogICAgICAgIGVjaG8gIlZvbHVtZSAke3ZvbHVtZV9uYW1l"\
"fSBiYWNrZWQgdXAgc3VjY2Vzc2Z1bGx5IgogICAgZWxzZQogICAgICAgIGVjaG8gIlZvbHVtZSAk"\
"e3ZvbHVtZV9uYW1lfSBkb2VzIG5vdCBleGlzdCAtIG5vdGhpbmcgdG8gYmFja3VwIgogICAgZmkK"\
"fQoKcmVzdG9yZV92b2x1bWUoKSB7CiAgICBsb2NhbCBsYWJlbD0iJDEiCiAgICBsb2NhbCB2b2x1"\
"bWVfbmFtZT0iJDIiCiAgICBsb2NhbCBiYWNrdXBfZm9sZGVyPSIkVEVNUF9ESVIvYmFja3VwIgog"\
"ICAgCiAgICBlY2hvICJbcmVzdG9yZV92b2x1bWVdIGxhYmVsPSRsYWJlbCB2b2x1bWU9JHZvbHVt"\
"ZV9uYW1lIGJhY2t1cF9mb2xkZXI9JGJhY2t1cF9mb2xkZXIiCiAgICAKICAgIGxvY2FsIHNvdXJj"\
"ZV9kaXI9IiR7YmFja3VwX2ZvbGRlcn0vdm9sdW1lXyR7bGFiZWx9IgogICAgCiAgICBpZiBbICEg"\
"LWQgIiR7c291cmNlX2Rpcn0iIF07IHRoZW4KICAgICAgICBlY2hvICJCYWNrdXAgZm9yIGxhYmVs"\
"ICcke2xhYmVsfScgbm90IGZvdW5kIGluICR7YmFja3VwX2ZvbGRlcn0iCiAgICAgICAgcmV0dXJu"\
"IDEKICAgIGZpCiAgICAKICAgIGlmIFsgLWYgIiR7c291cmNlX2Rpcn0vZGF0YS50YXIuZ3oiIF07"\
"IHRoZW4KICAgICAgICAjIFJlbW92ZSBleGlzdGluZyB2b2x1bWUgaWYgcHJlc2VudAogICAgICAg"\
"IGlmIGRvY2tlciB2b2x1bWUgbHMgfCBncmVwIC1xICJebG9jYWxbWzpzcGFjZTpdXSoke3ZvbHVt"\
"ZV9uYW1lfSQiOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIlJlbW92aW5nIGV4aXN0aW5nIHZvbHVt"\
"ZSAke3ZvbHVtZV9uYW1lfSIKICAgICAgICAgICAgZG9ja2VyIHZvbHVtZSBybSAiJHt2b2x1bWVf"\
"bmFtZX0iCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIENyZWF0ZSBuZXcgdm9sdW1lCiAg"\
"ICAgICAgZG9ja2VyIHZvbHVtZSBjcmVhdGUgIiR7dm9sdW1lX25hbWV9IgogICAgICAgIAogICAg"\
"ICAgICMgRXh0cmFjdCBiYWNrdXAgaW50byB2b2x1bWUKICAgICAgICBkb2NrZXIgcnVuIC0tcm0g"\
"XAogICAgICAgICAgICAtdiAiJHt2b2x1bWVfbmFtZX0iOi90YXJnZXQgXAogICAgICAgICAgICAt"\
"diAiJHtzb3VyY2VfZGlyfSI6L2JhY2t1cCBcCiAgICAgICAgICAgIGRlYmlhbiBiYXNoIC1jICJ0"\
"YXIgLXh6ZiAvYmFja3VwL2RhdGEudGFyLmd6IC1DIC90YXJnZXQiCiAgICAgICAgCiAgICAgICAg"\
"ZWNobyAiVm9sdW1lICR7dm9sdW1lX25hbWV9IHJlc3RvcmVkIHN1Y2Nlc3NmdWxseSIKICAgIGVs"\
"c2UKICAgICAgICBlY2hvICJCYWNrdXAgZmlsZSAke3NvdXJjZV9kaXJ9L2RhdGEudGFyLmd6IG5v"\
"dCBmb3VuZCIKICAgICAgICByZXR1cm4gMQogICAgZmkKfQoKIyA9PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"CiMgTUFJTiBCQUNLVVAvUkVTVE9SRSBPUkNIRVNUUkFUSU9OCiMgPT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"PQoKIyBQcm9jZXNzIG11bHRpcGxlIGl0ZW1zIGZvciBjcmVhdGlvbgojIFVzYWdlOiBjcmVhdGVf"\
"aXRlbXMgdHlwZTE6bGFiZWwxOmxvY2F0aW9uMSB0eXBlMjpsYWJlbDI6bG9jYXRpb24yIC4uLgpj"\
"cmVhdGVfaXRlbXMoKSB7CiAgICBlY2hvICJTdGFydGluZyBjcmVhdGUgb3BlcmF0aW9ucyIKICAg"\
"IAogICAgIyBQcm9jZXNzIGVhY2ggaXRlbQogICAgZm9yIGl0ZW0gaW4gIiRAIjsgZG8KICAgICAg"\
"ICBJRlM9JzonIHJlYWQgLXIgdHlwZSBsYWJlbCBsb2NhdGlvbiA8PDwgIiRpdGVtIgogICAgICAg"\
"IAogICAgICAgIGNhc2UgIiR0eXBlIiBpbgogICAgICAgICAgICBmaWxlKQogICAgICAgICAgICAg"\
"ICAgY3JlYXRlX2ZpbGUgIiRsYWJlbCIgIiRsb2NhdGlvbiIKICAgICAgICAgICAgICAgIDs7CiAg"\
"ICAgICAgICAgIHBhdGgpCiAgICAgICAgICAgICAgICBjcmVhdGVfcGF0aCAiJGxhYmVsIiAiJGxv"\
"Y2F0aW9uIgogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgdm9sdW1lKQogICAgICAgICAg"\
"ICAgICAgY3JlYXRlX3ZvbHVtZSAiJGxhYmVsIiAiJGxvY2F0aW9uIgogICAgICAgICAgICAgICAg"\
"OzsKICAgICAgICAgICAgKikKICAgICAgICAgICAgICAgIGVjaG8gIlVua25vd24gdHlwZTogJHR5"\
"cGUgKG11c3QgYmUgZmlsZSwgcGF0aCwgb3Igdm9sdW1lKSIKICAgICAgICAgICAgICAgIDs7CiAg"\
"ICAgICAgZXNhYwogICAgZG9uZQogICAgCiAgICBlY2hvICJDcmVhdGUgb3BlcmF0aW9ucyBjb21w"\
"bGV0ZWQiCn0KCiMgUHJvY2VzcyBtdWx0aXBsZSBpdGVtcyBmb3IgZGVzdHJ1Y3Rpb24KIyBVc2Fn"\
"ZTogZGVzdHJveV9pdGVtcyB0eXBlMTpsYWJlbDE6bG9jYXRpb24xIHR5cGUyOmxhYmVsMjpsb2Nh"\
"dGlvbjIgLi4uCmRlc3Ryb3lfaXRlbXMoKSB7CiAgICBlY2hvICJTdGFydGluZyBkZXN0cm95IG9w"\
"ZXJhdGlvbnMiCiAgICAKICAgICMgUHJvY2VzcyBlYWNoIGl0ZW0KICAgIGZvciBpdGVtIGluICIk"\
"QCI7IGRvCiAgICAgICAgSUZTPSc6JyByZWFkIC1yIHR5cGUgbGFiZWwgbG9jYXRpb24gPDw8ICIk"\
"aXRlbSIKICAgICAgICAKICAgICAgICBjYXNlICIkdHlwZSIgaW4KICAgICAgICAgICAgZmlsZSkK"\
"ICAgICAgICAgICAgICAgIGRlc3Ryb3lfZmlsZSAiJGxhYmVsIiAiJGxvY2F0aW9uIgogICAgICAg"\
"ICAgICAgICAgOzsKICAgICAgICAgICAgcGF0aCkKICAgICAgICAgICAgICAgIGRlc3Ryb3lfcGF0"\
"aCAiJGxhYmVsIiAiJGxvY2F0aW9uIgogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgdm9s"\
"dW1lKQogICAgICAgICAgICAgICAgZGVzdHJveV92b2x1bWUgIiRsYWJlbCIgIiRsb2NhdGlvbiIK"\
"ICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICopCiAgICAgICAgICAgICAgICBlY2hvICJV"\
"bmtub3duIHR5cGU6ICR0eXBlIChtdXN0IGJlIGZpbGUsIHBhdGgsIG9yIHZvbHVtZSkiCiAgICAg"\
"ICAgICAgICAgICA7OwogICAgICAgIGVzYWMKICAgIGRvbmUKICAgIAogICAgZWNobyAiRGVzdHJv"\
"eSBvcGVyYXRpb25zIGNvbXBsZXRlZCIKfQoKIyBQcm9jZXNzIG11bHRpcGxlIGl0ZW1zIGZvciBi"\
"YWNrdXAKIyBVc2FnZTogYmFja3VwX2l0ZW1zIHR5cGUxOmxhYmVsMTpsb2NhdGlvbjEgdHlwZTI6"\
"bGFiZWwyOmxvY2F0aW9uMiAuLi4KYmFja3VwX2l0ZW1zKCkgewogICAgX2NoZWNrX3JlcXVpcmVk"\
"X2Vudl92YXJzICJCQUNLVVBfRklMRSIgIlRFTVBfRElSIgogICAgbG9jYWwgYmFja3VwX2ZpbGU9"\
"IiR7QkFDS1VQX0ZJTEV9IgogICAgbG9jYWwgdGVtcF9kaXI9IiR7VEVNUF9ESVJ9IgogICAgCiAg"\
"ICBsb2NhbCBiYWNrdXBfdGVtcF9wYXRoPSIke3RlbXBfZGlyfS9iYWNrdXAiCiAgICBta2RpciAt"\
"cCAiJGJhY2t1cF90ZW1wX3BhdGgiCiAgICAKICAgIGVjaG8gIlN0YXJ0aW5nIGJhY2t1cCB0byAk"\
"e2JhY2t1cF9maWxlfSIKICAgIAogICAgIyBQcm9jZXNzIGVhY2ggaXRlbQogICAgZm9yIGl0ZW0g"\
"aW4gIiRAIjsgZG8KICAgICAgICBJRlM9JzonIHJlYWQgLXIgdHlwZSBsYWJlbCBsb2NhdGlvbiA8"\
"PDwgIiRpdGVtIgogICAgICAgIAogICAgICAgIGNhc2UgIiR0eXBlIiBpbgogICAgICAgICAgICBm"\
"aWxlKQogICAgICAgICAgICAgICAgYmFja3VwX2ZpbGUgIiRsYWJlbCIgIiRsb2NhdGlvbiIgIiRi"\
"YWNrdXBfdGVtcF9wYXRoIgogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgcGF0aCkKICAg"\
"ICAgICAgICAgICAgIGJhY2t1cF9wYXRoICIkbGFiZWwiICIkbG9jYXRpb24iICIkYmFja3VwX3Rl"\
"bXBfcGF0aCIKICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgIHZvbHVtZSkKICAgICAgICAg"\
"ICAgICAgIGJhY2t1cF92b2x1bWUgIiRsYWJlbCIgIiRsb2NhdGlvbiIgIiRiYWNrdXBfdGVtcF9w"\
"YXRoIgogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgKikKICAgICAgICAgICAgICAgIGVj"\
"aG8gIlVua25vd24gdHlwZTogJHR5cGUgKG11c3QgYmUgZmlsZSwgcGF0aCwgb3Igdm9sdW1lKSIK"\
"ICAgICAgICAgICAgICAgIDs7CiAgICAgICAgZXNhYwogICAgZG9uZQogICAgCiAgICAjIENyZWF0"\
"ZSBmaW5hbCBiYWNrdXAgYXJjaGl2ZQogICAgZWNobyAiQ3JlYXRpbmcgYmFja3VwIGFyY2hpdmUg"\
"JHtiYWNrdXBfZmlsZX0iCiAgICB0YXIgLWN6ZiAiJGJhY2t1cF9maWxlIiAtQyAiJGJhY2t1cF90"\
"ZW1wX3BhdGgiIC4KICAgIAogICAgIyBDbGVhbiB1cCB0ZW1wIGRpcmVjdG9yeQogICAgcm0gLXJm"\
"ICIkYmFja3VwX3RlbXBfcGF0aCIKICAgIAogICAgZWNobyAiQmFja3VwIGNvbXBsZXRlZCBzdWNj"\
"ZXNzZnVsbHkiCn0KCiMgUHJvY2VzcyBtdWx0aXBsZSBpdGVtcyBmb3IgcmVzdG9yZQojIFVzYWdl"\
"OiByZXN0b3JlX2l0ZW1zIHR5cGUxOmxhYmVsMTpsb2NhdGlvbjEgdHlwZTI6bGFiZWwyOmxvY2F0"\
"aW9uMiAuLi4KcmVzdG9yZV9pdGVtcygpIHsKICAgIF9jaGVja19yZXF1aXJlZF9lbnZfdmFycyAi"\
"QkFDS1VQX0ZJTEUiICJURU1QX0RJUiIKICAgIGxvY2FsIGJhY2t1cF9maWxlPSIke0JBQ0tVUF9G"\
"SUxFfSIKICAgIGxvY2FsIHRlbXBfZGlyPSIke1RFTVBfRElSfSIKICAgIAogICAgaWYgWyAhIC1m"\
"ICIkYmFja3VwX2ZpbGUiIF07IHRoZW4KICAgICAgICBlY2hvICJCYWNrdXAgZmlsZSAkYmFja3Vw"\
"X2ZpbGUgbm90IGZvdW5kIgogICAgICAgIHJldHVybiAxCiAgICBmaQogICAgCiAgICBsb2NhbCBy"\
"ZXN0b3JlX3RlbXBfcGF0aD0iJHt0ZW1wX2Rpcn0vcmVzdG9yZSIKICAgIG1rZGlyIC1wICIkcmVz"\
"dG9yZV90ZW1wX3BhdGgiCiAgICAKICAgIGVjaG8gIlN0YXJ0aW5nIHJlc3RvcmUgZnJvbSAke2Jh"\
"Y2t1cF9maWxlfSIKICAgIAogICAgIyBFeHRyYWN0IGJhY2t1cCBhcmNoaXZlCiAgICBlY2hvICJF"\
"eHRyYWN0aW5nIGJhY2t1cCBhcmNoaXZlIgogICAgdGFyIC14emYgIiRiYWNrdXBfZmlsZSIgLUMg"\
"IiRyZXN0b3JlX3RlbXBfcGF0aCIKICAgIAogICAgIyBQcm9jZXNzIGVhY2ggaXRlbQogICAgZm9y"\
"IGl0ZW0gaW4gIiRAIjsgZG8KICAgICAgICBJRlM9JzonIHJlYWQgLXIgdHlwZSBsYWJlbCBsb2Nh"\
"dGlvbiA8PDwgIiRpdGVtIgogICAgICAgIAogICAgICAgIGNhc2UgIiR0eXBlIiBpbgogICAgICAg"\
"ICAgICBmaWxlKQogICAgICAgICAgICAgICAgcmVzdG9yZV9maWxlICIkbGFiZWwiICIkbG9jYXRp"\
"b24iICIkcmVzdG9yZV90ZW1wX3BhdGgiCiAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICBw"\
"YXRoKQogICAgICAgICAgICAgICAgcmVzdG9yZV9wYXRoICIkbGFiZWwiICIkbG9jYXRpb24iICIk"\
"cmVzdG9yZV90ZW1wX3BhdGgiCiAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICB2b2x1bWUp"\
"CiAgICAgICAgICAgICAgICByZXN0b3JlX3ZvbHVtZSAiJGxhYmVsIiAiJGxvY2F0aW9uIiAiJHJl"\
"c3RvcmVfdGVtcF9wYXRoIgogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgKikKICAgICAg"\
"ICAgICAgICAgIGVjaG8gIlVua25vd24gdHlwZTogJHR5cGUgKG11c3QgYmUgZmlsZSwgcGF0aCwg"\
"b3Igdm9sdW1lKSIKICAgICAgICAgICAgICAgIDs7CiAgICAgICAgZXNhYwogICAgZG9uZQogICAg"\
"CiAgICAjIENsZWFuIHVwIHRlbXAgZGlyZWN0b3J5CiAgICBybSAtcmYgIiRyZXN0b3JlX3RlbXBf"\
"cGF0aCIKICAgIAogICAgZWNobyAiUmVzdG9yZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Igp9Cgoj"\
"ICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PQojICMgTEVHQUNZIENPTVBBVElCSUxJVFkgV1JBUFBFUiAo"\
"Y2FuIGJlIHJlbW92ZWQgb25jZSBtaWdyYXRpb24gaXMgY29tcGxldGUpCiMgIyA9PT09PT09PT09"\
"PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09"\
"PT09PT09PT09CgojICMgQ29udmVydCBvbGQgZm9ybWF0IHRvIG5ldyBmb3JtYXQKIyAjIElucHV0"\
"OiBrZXk9dmFsdWUgKGUuZy4sICJ2b2x1bWU9bXlhcHBfZGF0YSIpCiMgIyBPdXRwdXQ6IHR5cGU6"\
"bGFiZWw6bG9jYXRpb24gKGUuZy4sICJ2b2x1bWU6ZGF0YTpteWFwcF9kYXRhIikKIyBjb252ZXJ0"\
"X2xlZ2FjeV9mb3JtYXQoKSB7CiMgICAgIGxvY2FsIHBhaXI9IiQxIgojICAgICBsb2NhbCBrZXk9"\
"IiR7cGFpciUlPSp9IgojICAgICBsb2NhbCB2YWx1ZT0iJHtwYWlyIyo9fSIKICAgIAojICAgICAj"\
"IEdlbmVyYXRlIGEgbGFiZWwgZnJvbSB0aGUgdmFsdWUgKHNpbXBsaWZpZWQgLSB5b3UgbWF5IHdh"\
"bnQgbW9yZSBzb3BoaXN0aWNhdGVkIGxvZ2ljKQojICAgICBsb2NhbCBsYWJlbAojICAgICBsYWJl"\
"bD0kKGVjaG8gIiR2YWx1ZSIgfCBzZWQgJ3MvW15hLXpBLVowLTlfLV0vXy9nJykKICAgIAojICAg"\
"ICBlY2hvICIke2tleX06JHtsYWJlbH06JHt2YWx1ZX0iCiMgfQo=";
// Decode Base64 data
size_t decoded_size = (strlen(filedata_base64) * 3) / 4;
@@ -299,7 +515,61 @@ bool recreate_tree(std::string destination_folder) {
size_t actual_size;
base64_decode(filedata_base64, strlen(filedata_base64), decoded_data, &actual_size);
bool file_written = _recreate_file_(outpath, 15303959887899096456ULL, std::filesystem::perms(493), decoded_data, actual_size);
bool file_written = _recreate_file_(outpath, 15066387203561406336ULL, std::filesystem::perms(436), decoded_data, actual_size);
delete[] decoded_data;
any_written = any_written || file_written;
}
{
// File: agent-install.sh
fs::path outpath = fs::path(destination_folder) / "agent-install.sh";
static const char filedata_base64[] = "IyEvYmluL2Jhc2gKCiMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBkcm9wc2hl"\
"bGwgYWdlbnQgb24gYSByZW1vdGUgc2VydmVyLgoKU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1l"\
"ICIkKHJlYWRsaW5rIC1mICIke0JBU0hfU09VUkNFWzBdfSIpIikiICYmIHB3ZCkiCgpzZXQgLWEK"\
"CkFHRU5UX1BBVEg9IiRTQ1JJUFRfRElSIgoKc2V0ICthCgoKaWYgWyAtZiAiJFNDUklQVF9ESVIv"\
"Y29tbW9uLnNoIiBdOyB0aGVuCiAgICBzb3VyY2UgIiRTQ1JJUFRfRElSL2NvbW1vbi5zaCIKZWxz"\
"ZQogICAgZWNobyAiRXJyb3I6IGNvbW1vbi5zaCBub3QgZm91bmQgaW4gJFNDUklQVF9ESVIiCiAg"\
"ICBleGl0IDEKZmkKCl9jaGVja19yZXF1aXJlZF9lbnZfdmFycyAiQUdFTlRfUEFUSCIKCmZ1bmN0"\
"aW9uIGluc3RhbGxfYmI2NCgpIHsgICAgCiAgICBCQjY0X3BhdGg9IiR7QUdFTlRfUEFUSH0vYmI2"\
"NCIKICAgIEFSQ0g9JCh1bmFtZSAtbSkKICAgIGlmICEgY3VybCAtcyAiaHR0cHM6Ly9nZXRiaW4u"\
"eHl6L2JiNjQ6bGF0ZXN0LSR7QVJDSH0iID4gIiR7QkI2NF9wYXRofSI7IHRoZW4KICAgICAgICBf"\
"ZGllICJGYWlsZWQgdG8gaW5zdGFsbCBiYjY0LiBDdXJsIHJldHVybmVkIG5vbi16ZXJvIGV4aXQg"\
"Y29kZS4iCiAgICBmaQogICAgY2hvd24gIiQoaWQgLXUgIiRVU0VSIik6JChpZCAtZyAiJFVTRVIi"\
"KSIgIiR7QkI2NF9wYXRofSIKICAgIGNobW9kICt4ICIke0JCNjRfcGF0aH0iCgogICAgIyB0ZXN0"\
"IGlmIGJiNjQgaXMgaW5zdGFsbGVkCiAgICBpZiBWRVI9JCgiJHtCQjY0X3BhdGh9IiB2ZXJzaW9u"\
"KTsgdGhlbgogICAgICAgIGVjaG8gImJiNjQgdiRWRVIgaW5zdGFsbGVkLiIKICAgIGVsc2UKICAg"\
"ICAgICBfZGllICJiYjY0IGRpZCBub3QgaW5zdGFsbCBjb3JyZWN0bHkuIgogICAgZmkKCiAgICBy"\
"ZXR1cm4gMDsKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgQ2hlY2sgcHJlLXJlcXVpc2l0ZXMKCiMg"\
"Q2hlY2sgaWYgY3VybCBpcyBpbnN0YWxsZWQKaWYgISBjb21tYW5kIC12IGN1cmwgJj4gL2Rldi9u"\
"dWxsOyB0aGVuCiAgICBfZGllICJDdXJsIGlzIG5vdCBpbnN0YWxsZWQuIEN1cmwgaXMgcmVxdWly"\
"ZWQgZm9yIGFnZW50IGluc3RhbGxhdGlvbi4iCmZpCgojIGNoZWNrIGRvY2tlciBpbnN0YWxsYXRp"\
"b24KaWYgISBjb21tYW5kIC12IGRvY2tlciAmPiAvZGV2L251bGw7IHRoZW4KICAgIGVjaG8gIkRv"\
"Y2tlciBpcyBub3QgaW5zdGFsbGVkLiBEb2NrZXIgaXMgcmVxdWlyZWQgZm9yIGFnZW50IGluc3Rh"\
"bGxhdGlvbi4iCiAgICBleGl0IDEKZmkKCiMgY2hlY2sgcnN5bmMgaW5zdGFsbGF0aW9uCmlmICEg"\
"Y29tbWFuZCAtdiByc3luYyAmPiAvZGV2L251bGw7IHRoZW4KICAgIGVjaG8gIlJzeW5jIGlzIG5v"\
"dCBpbnN0YWxsZWQuIFJzeW5jIGlzIHJlcXVpcmVkIGZvciBhZ2VudCBpbnN0YWxsYXRpb24uIgog"\
"ICAgZXhpdCAxCmZpCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmVjaG8gIkluc3RhbGxpbmcgZHJvcHNo"\
"ZWxsIGFnZW50Li4uIgoKaW5zdGFsbF9iYjY0CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBjb25maXJt"\
"IHdlJ3JlIGluIGEgZ29vZCBzdGF0ZS4KCnJlcXVpcmVkX2ZpbGVzPSgKICAgICIkQUdFTlRfUEFU"\
"SC9iYjY0IgogICAgIiRBR0VOVF9QQVRIL2NvbW1vbi5zaCIKICAgICIkQUdFTlRfUEFUSC9kYXRh"\
"Y29tbWFuZHMuc2giCikKCiMgY2hlY2sgaWYgYWxsIGZpbGVzIGV4aXN0CmZvciBmaWxlIGluICIk"\
"e3JlcXVpcmVkX2ZpbGVzW0BdfSI7IGRvCiAgICBpZiBbICEgLWYgIiRmaWxlIiBdOyB0aGVuCiAg"\
"ICAgICAgX2RpZSAiJGZpbGUgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjaGVjayB0aGUgaW5zdGFs"\
"bGF0aW9uLiIKICAgIGZpCmRvbmUKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplY2hvICJDb21wbGV0ZWQg"\
"ZHJvcHNoZWxsIGFnZW50IGluc3RhbGxhdGlvbi4iCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t"\
"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZXhpdCAw"\
"Cg==";
// Decode Base64 data
size_t decoded_size = (strlen(filedata_base64) * 3) / 4;
unsigned char* decoded_data = new unsigned char[decoded_size];
size_t actual_size;
base64_decode(filedata_base64, strlen(filedata_base64), decoded_data, &actual_size);
bool file_written = _recreate_file_(outpath, 17179514748324784990ULL, std::filesystem::perms(509), decoded_data, actual_size);
delete[] decoded_data;
any_written = any_written || file_written;
}
@@ -406,8 +676,8 @@ bool recreate_tree(std::string destination_folder) {
"dD0kKGRpcm5hbWUgIiR0b19yZW1vdmUiKQogICAgYWJzX3BhcmVudD0kKHJlYWxwYXRoICIkcGFy"\
"ZW50IikKICAgIGNoaWxkPSQoYmFzZW5hbWUgIiR0b19yZW1vdmUiKQogICAgZG9ja2VyIHJ1biAt"\
"LXJtIC12ICIkYWJzX3BhcmVudCI6L2RhdGEgYWxwaW5lIHJtIC1yZiAiL2RhdGEvJGNoaWxkIgp9"\
"CgoKIyBMb2FkIGF1dG9jb21tYW5kcwpzb3VyY2UgIiR7QUdFTlRfUEFUSH0vZGF0YWNvbW1hbmRz"\
"LnNoIg==";
"CgojIExvYWQgYXV0b2NvbW1hbmRzCnNvdXJjZSAiJHtBR0VOVF9QQVRIfS9kYXRhY29tbWFuZHNf"\
"djIuc2gi";
// Decode Base64 data
size_t decoded_size = (strlen(filedata_base64) * 3) / 4;
@@ -415,7 +685,7 @@ bool recreate_tree(std::string destination_folder) {
size_t actual_size;
base64_decode(filedata_base64, strlen(filedata_base64), decoded_data, &actual_size);
bool file_written = _recreate_file_(outpath, 10529534466039467911ULL, std::filesystem::perms(493), decoded_data, actual_size);
bool file_written = _recreate_file_(outpath, 325502528690785098ULL, std::filesystem::perms(509), decoded_data, actual_size);
delete[] decoded_data;
any_written = any_written || file_written;
}

View File

@@ -24,7 +24,7 @@ namespace dropshell
!service_info.user.empty();
}
std::vector<LocalServiceInfo> get_server_services_info(const std::string &server_name)
std::vector<LocalServiceInfo> get_server_services_info(const std::string &server_name, bool fast)
{
std::vector<LocalServiceInfo> services;
@@ -50,7 +50,7 @@ namespace dropshell
std::string dirname = entry.path().filename().string();
if (dirname.empty() || dirname[0] == '.' || dirname[0] == '_')
continue;
auto service = get_service_info(server_name, dirname);
auto service = get_service_info(server_name, dirname, fast);
if (!service.local_service_path.empty())
services.push_back(service);
else
@@ -73,7 +73,7 @@ namespace dropshell
return it->second == "true";
}
LocalServiceInfo get_service_info(const std::string &server_name, const std::string &service_name)
LocalServiceInfo get_service_info(const std::string &server_name, const std::string &service_name, bool fast)
{
LocalServiceInfo service;
@@ -111,7 +111,7 @@ namespace dropshell
service.template_name = it->second;
}
template_info tinfo = gTemplateManager().get_template_info(service.template_name);
template_info tinfo = gTemplateManager().get_template_info(service.template_name,fast);
if (!tinfo.is_set())
{
// Template not found - this means it's not available locally OR from registry

View File

@@ -22,9 +22,10 @@ namespace dropshell {
bool SIvalid(const LocalServiceInfo& service_info);
std::vector<LocalServiceInfo> get_server_services_info(const std::string& server_name);
// if fast, don't check for updates to the service template.
std::vector<LocalServiceInfo> get_server_services_info(const std::string& server_name, bool fast=false);
LocalServiceInfo get_service_info(const std::string& server_name, const std::string& service_name);
LocalServiceInfo get_service_info(const std::string& server_name, const std::string& service_name, bool fast=false);
std::set<std::string> get_used_commands(const std::string& server_name, const std::string& service_name);
// get all env vars for a given service

View File

@@ -3,8 +3,6 @@
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>
#include <map>
#include <chrono>
#include <libassert/assert.hpp>
@@ -50,7 +48,7 @@
return std::filesystem::exists(path);
}
template_info template_source_local::get_template_info(const std::string& template_name) {
template_info template_source_local::get_template_info(const std::string& template_name, bool fast) {
std::filesystem::path path = mLocalPath / template_name;
if (!std::filesystem::exists(path))
@@ -184,7 +182,7 @@
return std::filesystem::exists(template_cache_dir);
}
template_info template_source_registry::get_template_info(const std::string& template_name)
template_info template_source_registry::get_template_info(const std::string& template_name, bool fast)
{
// Get cache directory
std::filesystem::path cache_dir = get_cache_dir();
@@ -204,6 +202,15 @@
return template_info();
}
// fast: don't bother updating anything - if we have a cached version use that.
if (fast && have_cache) {
return template_info(
template_name,
"Registry: " + mRegistry.name + " (cached)",
template_cache_dir
);
}
// Get metadata from registry to check version
std::string meta_url = mRegistry.url + "/meta/" + template_name + ":latest";
@@ -395,7 +402,7 @@
bool template_source_registry::template_command_exists(const std::string& template_name, const std::string& command)
{
// Get template info to ensure it's downloaded and cached
auto tinfo = get_template_info(template_name);
auto tinfo = get_template_info(template_name, false);
if (!tinfo.is_set()) {
return false;
}
@@ -460,12 +467,12 @@
return true;
}
template_info template_manager::get_template_info(const std::string &template_name) const
template_info template_manager::get_template_info(const std::string &template_name, bool fast) const
{
ASSERT(mLoaded && mSources.size() > 0, "Template manager not loaded, or no template sources found.");
template_source_interface* source = get_source(template_name);
if (source)
return source->get_template_info(template_name);
return source->get_template_info(template_name, fast);
// fail
return template_info();
@@ -498,7 +505,7 @@
return false;
}
auto tinfo = get_template_info(template_name);
auto tinfo = get_template_info(template_name, false);
if (tinfo.is_set()) {
error << "Template '" << template_name << "' already exists at " << tinfo.locationID() << std::endl;
return false;
@@ -583,8 +590,8 @@
}
// Add registry sources - these should always be added
auto registry_urls = gConfig().get_template_registry_urls();
for (const auto& url : registry_urls) {
std::vector<tRegistryEntry> registry_urls = gConfig().get_template_registry_urls();
for (const tRegistryEntry & url : registry_urls) {
mSources.push_back(std::make_unique<template_source_registry>(url));
}

View File

@@ -43,7 +43,7 @@ class template_source_interface {
virtual ~template_source_interface() {}
virtual std::set<std::string> get_template_list() = 0;
virtual bool has_template(const std::string& template_name) = 0;
virtual template_info get_template_info(const std::string& template_name) = 0;
virtual template_info get_template_info(const std::string& template_name, bool fast=false) = 0;
virtual bool template_command_exists(const std::string& template_name,const std::string& command) = 0;
virtual std::string get_description() = 0;
@@ -57,7 +57,7 @@ class template_source_registry : public template_source_interface {
std::set<std::string> get_template_list();
bool has_template(const std::string& template_name);
template_info get_template_info(const std::string& template_name);
template_info get_template_info(const std::string& template_name, bool fast=false);
bool template_command_exists(const std::string& template_name,const std::string& command);
std::string get_description() { return "Registry: " + mRegistry.name + " (" + mRegistry.url + ")"; }
@@ -74,7 +74,7 @@ class template_source_local : public template_source_interface {
~template_source_local() {}
std::set<std::string> get_template_list();
bool has_template(const std::string& template_name);
template_info get_template_info(const std::string& template_name);
template_info get_template_info(const std::string& template_name, bool fast=false);
bool template_command_exists(const std::string& template_name,const std::string& command);
std::string get_description() { return "Local: " + mLocalPath.string(); }
@@ -89,7 +89,7 @@ class template_manager {
std::set<std::string> get_template_list() const;
bool has_template(const std::string& template_name) const;
template_info get_template_info(const std::string& template_name) const;
template_info get_template_info(const std::string& template_name, bool fast=false) const; // fast = don't check for updates.
bool template_command_exists(const std::string& template_name,const std::string& command) const;
bool create_template(const std::string& template_name) const;