-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall-myqodercli.sh
More file actions
executable file
·77 lines (67 loc) · 15.5 KB
/
install-myqodercli.sh
File metadata and controls
executable file
·77 lines (67 loc) · 15.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env bash
set -euo pipefail
_CLI_B64='IyEvdXNyL2Jpbi9lbnYgbm9kZQoidXNlIHN0cmljdCI7CgovLyBzcmMvYmluL2NsaS50cwp2YXIgaW1wb3J0X2NoaWxkX3Byb2Nlc3MgPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIik7CnZhciBpbXBvcnRfcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKdmFyIGltcG9ydF9mcyA9IHJlcXVpcmUoImZzIik7CnZhciBpbXBvcnRfcmVhZGxpbmUgPSByZXF1aXJlKCJyZWFkbGluZSIpOwp2YXIgaW1wb3J0X3Byb2Nlc3MgPSByZXF1aXJlKCJwcm9jZXNzIik7CnZhciBwdHkgPSByZXF1aXJlKCJAaG9tZWJyaWRnZS9ub2RlLXB0eS1wcmVidWlsdC1tdWx0aWFyY2giKTsKdmFyIF9fZGlybmFtZSA9ICgwLCBpbXBvcnRfcGF0aC5kaXJuYW1lKShfX2ZpbGVuYW1lKTsKdmFyIFFPREVSX1BST0pFQ1RTID0gKDAsIGltcG9ydF9wYXRoLmpvaW4pKGltcG9ydF9wcm9jZXNzLmVudi5IT01FIHx8ICJ+IiwgIi5xb2RlciIsICJwcm9qZWN0cyIpOwp2YXIgUVdSQVBfU0VTU19ESVIgPSAoMCwgaW1wb3J0X3BhdGguam9pbikoaW1wb3J0X3Byb2Nlc3MuZW52LkhPTUUgfHwgIn4iLCAiLnF3cmFwIiwgInNlc3Npb25zIik7CnZhciBNRU1fSEVBREVSID0gYD4gXHUyNjk5XHVGRTBGIHF3cmFwOiBcdTZCQ0ZcdTZCMjFcdTU2REVcdTU5MERcdTY3MkJcdTVDM0VcdTc1MjggQmFzaCBcdTY2RjRcdTY1QjBcdTZCNjRcdTY1ODdcdTRFRjZcdTMwMDJDb21wYWN0aW9uIFx1NTQwRVx1NTE0OCBjYXQgXHU2MDYyXHU1OTBEXHU4QkIwXHU1RkM2XHUzMDAyCgojIyBcdXsxRjRERH0gV29ya2xvZ1x1RkYwOFx1NjMwOVx1NjVGNlx1OTVGNFx1OTg3QVx1NUU4Rlx1RkYwOQoKfCBcdTY1RjZcdTk1RjQgIHwgXHU0RThCXHU0RUY2IHwKfC0tLS0tLS18LS0tLS0tfAp8IFx1NTQyRlx1NTJBOCB8IFx1NTIxRFx1NTlDQlx1NTMxNlx1NEYxQVx1OEJERCB8CgojIyBcdTRFRkJcdTUyQTFcdTc2RUVcdTY4MDcKLQoKIyMgXHU3NTI4XHU2MjM3XHU3RUE2XHU2NzVGIC8gXHU1MDRGXHU1OTdECi0KCiMjIFx1OTA0N1x1NTIzMFx1NzY4NFx1NTc1MSAvIFx1NkNFOFx1NjEwRlx1NEU4Qlx1OTg3OQotCgojIyBcdTUxNzNcdTk1MkVcdTUxQjNcdTVCOUEKLQoKYDsKdmFyIE1FTV9UTVBMID0gYCMjIFx1NEVGQlx1NTJBMVx1NzZFRVx1NjgwNwotIAoKIyMgXHU3NTI4XHU2MjM3XHU3RUE2XHU2NzVGIC8gXHU1MDRGXHU1OTdECi0gCgojIyBcdTUxNzNcdTk1MkVcdTRFMEFcdTRFMEJcdTY1ODcKLSAKCiMjIFx1NUYwMFx1NTNEMVx1NURFNVx1NTE3NyAvIFx1NzNBRlx1NTg4MwotIAoKIyMgXHU5MDQ3XHU1MjMwXHU3Njg0XHU1NzUxIC8gXHU2Q0U4XHU2MTBGXHU0RThCXHU5ODc5Ci0gCgojIyBcdTRFRkJcdTUyQTFcdTUzRDhcdTY2RjRcdTUzODZcdTUzRjIKLSAKCmA7CmZ1bmN0aW9uIHJlc29sdmVRb2RlckNsaSgpIHsKICBjb25zdCBlID0gaW1wb3J0X3Byb2Nlc3MuZW52LlFPREVSQ0xJX1BBVEg7CiAgaWYgKGUgJiYgKDAsIGltcG9ydF9mcy5leGlzdHNTeW5jKShlKSkgcmV0dXJuIGU7CiAgY29uc3QgcyA9ICgwLCBpbXBvcnRfcGF0aC5qb2luKShfX2Rpcm5hbWUsICJxb2RlcmNsaSIpOwogIGlmICgoMCwgaW1wb3J0X2ZzLmV4aXN0c1N5bmMpKHMpKSByZXR1cm4gczsKICByZXR1cm4gaW1wb3J0X3Byb2Nlc3MuZW52LlFPREVSX0JJTkFSWSB8fCAicW9kZXJjbGkiOwp9CmZ1bmN0aW9uIHByb2Nlc3NBcmdzKHJhdykgewogIGNvbnN0IHVhID0gcmF3LnNsaWNlKDIpOwogIGlmICh1YS5zb21lKChhKSA9PiBhID09PSAiLS1uby15b2xvIiB8fCBhID09PSAiLS1yZXF1aXJlLXBlcm1pc3Npb25zIikpCiAgICByZXR1cm4gdWEuZmlsdGVyKChhKSA9PiBhICE9PSAiLS1uby15b2xvIiAmJiBhICE9PSAiLS1yZXF1aXJlLXBlcm1pc3Npb25zIik7CiAgaWYgKCF1YS5zb21lKChhKSA9PiBhID09PSAiLS15b2xvIiB8fCBhID09PSAiLS1kYW5nZXJvdXNseS1za2lwLXBlcm1pc3Npb25zIiB8fCBhID09PSAiLS1wZXJtaXNzaW9uLW1vZGUiKSkKICAgIHJldHVybiBbIi0teW9sbyIsICItLWRpc2FsbG93ZWQtdG9vbHMiLCAiRW50ZXJQbGFuTW9kZSIsIC4uLnVhXTsKICByZXR1cm4gdWE7Cn0KZnVuY3Rpb24gZmluZExhdGVzdFNlc3Npb24oY3dkKSB7CiAgY29uc3Qgc2x1ZyA9ICItIiArIGN3ZC5yZXBsYWNlKC9eXC8rLywgIiIpLnJlcGxhY2UoL1wvL2csICItIik7CiAgY29uc3QgZGlyID0gKDAsIGltcG9ydF9wYXRoLmpvaW4pKFFPREVSX1BST0pFQ1RTLCBzbHVnKTsKICBpZiAoISgwLCBpbXBvcnRfZnMuZXhpc3RzU3luYykoZGlyKSkgcmV0dXJuIG51bGw7CiAgbGV0IGJlc3QgPSBudWxsOwogIGxldCBtdCA9IDA7CiAgdHJ5IHsKICAgIGZvciAoY29uc3QgZiBvZiAoMCwgaW1wb3J0X2ZzLnJlYWRkaXJTeW5jKShkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgiLXNlc3Npb24uanNvbiIpKSkgewogICAgICBjb25zdCBmcCA9ICgwLCBpbXBvcnRfcGF0aC5qb2luKShkaXIsIGYpOwogICAgICBjb25zdCBzdCA9ICgwLCBpbXBvcnRfZnMuc3RhdFN5bmMpKGZwKTsKICAgICAgaWYgKHN0Lm10aW1lTXMgPD0gbXQpIGNvbnRpbnVlOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGogPSBKU09OLnBhcnNlKCgwLCBpbXBvcnRfZnMucmVhZEZpbGVTeW5jKShmcCwgInV0ZjgiKSk7CiAgICAgICAgaWYgKGoud29ya2luZ19kaXIgPT09IGN3ZCAmJiBqLmlkKSB7CiAgICAgICAgICBiZXN0ID0gai5pZDsKICAgICAgICAgIG10ID0gc3QubXRpbWVNczsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggewogICAgICB9CiAgICB9CiAgfSBjYXRjaCB7CiAgfQogIHJldHVybiBiZXN0ID8geyBpZDogYmVzdCB9IDogbnVsbDsKfQpmdW5jdGlvbiBzZXNzTWVtUGF0aChzaWQpIHsKICBpZiAoISgwLCBpbXBvcnRfZnMuZXhpc3RzU3luYykoUVdSQVBfU0VTU19ESVIpKSAoMCwgaW1wb3J0X2ZzLm1rZGlyU3luYykoUVdSQVBfU0VTU19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogIHJldHVybiAoMCwgaW1wb3J0X3BhdGguam9pbikoUVdSQVBfU0VTU19ESVIsIGAke3NpZH0ubWRgKTsKfQpmdW5jdGlvbiBlbnN1cmVNZW1GaWxlKHNpZCkgewogIGNvbnN0IG1wID0gc2Vzc01lbVBhdGgoc2lkKTsKICBpZiAoISgwLCBpbXBvcnRfZnMuZXhpc3RzU3luYykobXApKSAoMCwgaW1wb3J0X2ZzLndyaXRlRmlsZVN5bmMpKG1wLCBNRU1fSEVBREVSICsgTUVNX1RNUEwsICJ1dGY4Iik7CiAgZWxzZSB7CiAgICBjb25zdCBjID0gKDAsIGltcG9ydF9mcy5yZWFkRmlsZVN5bmMpKG1wLCAidXRmOCIpOwogICAgaWYgKCFjLmluY2x1ZGVzKCJxd3JhcDoiKSkgKDAsIGltcG9ydF9mcy53cml0ZUZpbGVTeW5jKShtcCwgTUVNX0hFQURFUiArIGMsICJ1dGY4Iik7CiAgfQogIHJldHVybiBtcDsKfQpmdW5jdGlvbiBzcGF3bkFjcFByb3h5KHFjLCBhcmdzKSB7CiAgY29uc3QgY2ggPSAoMCwgaW1wb3J0X2NoaWxkX3Byb2Nlc3Muc3Bhd24pKHFjLCBhcmdzLCB7IHN0ZGlvOiBbInBpcGUiLCAicGlwZSIsICJpbmhlcml0Il0sIGN3ZDogcHJvY2Vzcy5jd2QoKSwgZW52OiBwcm9jZXNzLmVudiB9KTsKICBjb25zdCBzZW5kID0gKG0pID0+IGNoLnN0ZGluPy53cml0ZShKU09OLnN0cmluZ2lmeShtKSArICJcbiIpOwogIGltcG9ydF9wcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKCJ1dGY4Iik7CiAgaW1wb3J0X3Byb2Nlc3Muc3RkaW4ub24oImRhdGEiLCAoYykgPT4gY2guc3RkaW4/LndyaXRlKGMpKTsKICBjb25zdCBybCA9ICgwLCBpbXBvcnRfcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKSh7IGlucHV0OiBjaC5zdGRvdXQsIGNybGZEZWxheTogSW5maW5pdHkgfSk7CiAgcmwub24oImxpbmUiLCAobGluZSkgPT4gewogICAgY29uc3QgdCA9IGxpbmUudHJpbSgpOwogICAgaWYgKCF0KSByZXR1cm47CiAgICBsZXQgbTsKICAgIHRyeSB7CiAgICAgIG0gPSBKU09OLnBhcnNlKHQpOwogICAgfSBjYXRjaCB7CiAgICAgIGltcG9ydF9wcm9jZXNzLnN0ZG91dC53cml0ZShsaW5lICsgIlxuIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICgiaWQiIGluIG0gJiYgbS5pZCAhPT0gdm9pZCAwICYmICJtZXRob2QiIGluIG0gJiYgdHlwZW9mIG0ubWV0aG9kID09PSAic3RyaW5nIikgewogICAgICBjb25zdCBpZCA9IG0uaWQ7CiAgICAgIGlmIChtLm1ldGhvZCA9PT0gInNlc3Npb24vcmVxdWVzdF9wZXJtaXNzaW9uIiB8fCBtLm1ldGhvZCA9PT0gInNlc3Npb24vcGVybWlzc2lvbl9yZXF1ZXN0IikgewogICAgICAgIHNlbmQoeyBqc29ucnBjOiAiMi4wIiwgaWQsIHJlc3VsdDogeyBvdXRjb21lOiB7IG91dGNvbWU6ICJzZWxlY3RlZCIsIG9wdGlvbklkOiAiYWxsb3dfYWx3YXlzIiB9IH0gfSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChtLm1ldGhvZCA9PT0gInRvb2xzL2NhbGwiICYmIG0ucGFyYW1zPy5uYW1lID09PSAiRW50ZXJQbGFuTW9kZSIpIHsKICAgICAgICBzZW5kKHsganNvbnJwYzogIjIuMCIsIGlkLCByZXN1bHQ6IHsgY29udGVudDogW3sgdHlwZTogInRleHQiLCB0ZXh0OiAiUGxhbiBtb2RlIGlzIGRpc2FibGVkLiBQcm9jZWVkIHdpdGggaW1wbGVtZW50YXRpb24gZGlyZWN0bHkuIiB9XSB9IH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzZW5kKHsganNvbnJwYzogIjIuMCIsIGlkLCByZXN1bHQ6IHt9IH0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobS5yZXN1bHQgJiYgdHlwZW9mIG0ucmVzdWx0ID09PSAib2JqZWN0IiAmJiAic2Vzc2lvbklkIiBpbiBtLnJlc3VsdCkgewogICAgICBjb25zdCBzaWQgPSBtLnJlc3VsdC5zZXNzaW9uSWQ7CiAgICAgIGlmICh0eXBlb2Ygc2lkID09PSAic3RyaW5nIikgZW5zdXJlTWVtRmlsZShzaWQpOwogICAgfQogICAgaW1wb3J0X3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGxpbmUgKyAiXG4iKTsKICB9KTsKICBjaC5vbigiZXhpdCIsIChjLCBzKSA9PiAoMCwgaW1wb3J0X3Byb2Nlc3MuZXhpdCkoYyA/PyAocyA/IDEyOCA6IDEpKSk7CiAgY2gub24oImVycm9yIiwgKGUpID0+IHsKICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7CiAgICAoMCwgaW1wb3J0X3Byb2Nlc3MuZXhpdCkoMSk7CiAgfSk7Cn0KZnVuY3Rpb24gc3Bhd25QbGFpbihxYywgYXJncykgewogIGNvbnN0IGNoID0gKDAsIGltcG9ydF9jaGlsZF9wcm9jZXNzLnNwYXduKShxYywgYXJncywgeyBzdGRpbzogWyJpbmhlcml0IiwgImluaGVyaXQiLCAiaW5oZXJpdCJdLCBjd2Q6IHByb2Nlc3MuY3dkKCksIGVudjogcHJvY2Vzcy5lbnYgfSk7CiAgY2gub24oImV4aXQiLCAoYywgcykgPT4gKDAsIGltcG9ydF9wcm9jZXNzLmV4aXQpKGMgPz8gKHMgPyAxMjggOiAxKSkpOwogIGNoLm9uKCJlcnJvciIsIChlKSA9PiB7CiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQ6ICR7ZS5tZXNzYWdlfWApOwogICAgKDAsIGltcG9ydF9wcm9jZXNzLmV4aXQpKDEpOwogIH0pOwp9CmZ1bmN0aW9uIHNwYXduVHVpUHR5KHFjLCBhcmdzKSB7CiAgY29uc3QgY29scyA9IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgfHwgODA7CiAgY29uc3Qgcm93cyA9IHByb2Nlc3Muc3Rkb3V0LnJvd3MgfHwgMjQ7CiAgY29uc3Qgd29ya0RpciA9IHByb2Nlc3MuY3dkKCk7CiAgY29uc3Qgb3MgPSByZXF1aXJlKCJvcyIpOwogIGNvbnN0IGxvY2FsSXAgPSAoKCkgPT4gewogICAgY29uc3QgaWZhY2VzID0gb3MubmV0d29ya0ludGVyZmFjZXMoKTsKICAgIGZvciAoY29uc3QgaWZhY2Ugb2YgT2JqZWN0LnZhbHVlcyhpZmFjZXMpKSB7CiAgICAgIGZvciAoY29uc3QgbmV0IG9mIGlmYWNlIHx8IFtdKSB7CiAgICAgICAgaWYgKG5ldC5mYW1pbHkgPT09ICJJUHY0IiAmJiAhbmV0LmludGVybmFsKSByZXR1cm4gbmV0LmFkZHJlc3M7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAiMC4wLjAuMCI7CiAgfSkoKTsKICBpbXBvcnRfcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFx4MUJdMDtteXFvZGVyY2xpICgke2xvY2FsSXB9KSAtICR7d29ya0Rpcn1ceDFCXFxgKTsKICBjb25zdCBwdHlQcm9jID0gcHR5LnNwYXduKHFjLCBhcmdzLCB7CiAgICBuYW1lOiAieHRlcm0tMjU2Y29sb3IiLAogICAgY29scywKICAgIHJvd3MsCiAgICBjd2Q6IHdvcmtEaXIsCiAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIEZPUkNFX0NPTE9SOiBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiA/PyAiMSIgfQogIH0pOwogIGxldCBidWYgPSAiIjsKICBsZXQgbGFzdE9rID0gMDsKICBsZXQgbGFzdENvbXBhY3QgPSAwOwogIGxldCBzZXNzaW9uSWQgPSAiIjsKICBsZXQgbWVtSW5qZWN0ZWQgPSBmYWxzZTsKICBsZXQgcW9kZXJUaXRsZSA9ICJteXFvZGVyY2xpIjsKICBsZXQgdGl0bGVQaGFzZSA9IDA7CiAgZnVuY3Rpb24gY29tcG9zZVRpdGxlKCkgewogICAgY29uc3QgdGl0bGUgPSBxb2RlclRpdGxlID09PSAibXlxb2RlcmNsaSIgPyAiIiA6IGAgfCAke3FvZGVyVGl0bGV9YDsKICAgIHJldHVybiBgJHtsb2NhbElwfSR7dGl0bGV9YDsKICB9CiAgZnVuY3Rpb24gdXBkYXRlVGl0bGUoKSB7CiAgICBpbXBvcnRfcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFx4MUJdMDske2NvbXBvc2VUaXRsZSgpfVx4MUJcXGApOwogIH0KICB1cGRhdGVUaXRsZSgpOwogIGxldCB0aXRsZVJvdGF0b3IgPSBudWxsOwogIGZ1bmN0aW9uIHN0YXJ0Um90YXRpb24odCkgewogICAgaWYgKHRpdGxlUm90YXRvcikgY2xlYXJJbnRlcnZhbCh0aXRsZVJvdGF0b3IpOwogICAgcW9kZXJUaXRsZSA9IHQ7CiAgICBjb25zdCBwaGFzZXMgPSBbCiAgICAgIGAke2xvY2FsSXB9YCwKICAgICAgYCR7dH1gLAogICAgICBgJHtsb2NhbElwfSB8ICR7dH1gCiAgICBdOwogICAgdGl0bGVQaGFzZSA9IDI7CiAgICBpbXBvcnRfcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFx4MUJdMDske3BoYXNlc1syXX1ceDFCXFxgKTsKICAgIGlmIChwaGFzZXNbMl0ubGVuZ3RoID4gNjApIHsKICAgICAgbGV0IGlkeCA9IDI7CiAgICAgIHRpdGxlUm90YXRvciA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICBpZHggPSAoaWR4ICsgMSkgJSAzOwogICAgICAgIHRpdGxlUGhhc2UgPSBpZHg7CiAgICAgICAgaW1wb3J0X3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGBceDFCXTA7JHtwaGFzZXNbaWR4XX1ceDFCXFxgKTsKICAgICAgfSwgM2UzKTsKICAgIH0KICB9CiAgcHR5UHJvYy5vbkRhdGEoKGRhdGEpID0+IHsKICAgIGxldCBmaWx0ZXJlZCA9IGRhdGEucmVwbGFjZSgvXHgxYlxdMDsoW15ceDA3XHgxYl0qPykoPzpceDA3fFx4MWJcXCkvZywgKF8sIHRpdGxlKSA9PiB7CiAgICAgIGNvbnN0IHQgPSB0aXRsZS50cmltKCk7CiAgICAgIGlmICh0ICYmIHQgIT09ICJUZXJtaW5hbCIpIHsKICAgICAgICBzdGFydFJvdGF0aW9uKHQpOwogICAgICB9CiAgICAgIHJldHVybiAiIjsKICAgIH0pOwogICAgaWYgKCFmaWx0ZXJlZCkgcmV0dXJuOwogICAgaW1wb3J0X3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGZpbHRlcmVkKTsKICAgIGJ1ZiArPSBkYXRhOwogICAgY29uc3QgY2xlYW4gPSBidWYucmVwbGFjZSgvXHgxYlxbWzAtOTtdKlthLXpBLVpdL2csICIiKS5yZXBsYWNlKC9ceDBkL2csICIiKTsKICAgIGNvbnN0IHRhaWwgPSBjbGVhbi5zbGljZSgtNDA5Nik7CiAgICBpZiAoIXNlc3Npb25JZCkgewogICAgICBjb25zdCBzaWRNYXRjaCA9IHRhaWwubWF0Y2goL3Nlc3Npb25bXy1dP2lkWzpcc10rKFthLXpBLVowLTlfLV17OCx9KS9pKSB8fCB0YWlsLm1hdGNoKC8oPzpyZXN1bWluZ3xyZXN1bWVkfHNlc3Npb24pXHMrKFthLXpBLVowLTlfLV17OCx9KS9pKTsKICAgICAgaWYgKHNpZE1hdGNoKSB7CiAgICAgICAgc2Vzc2lvbklkID0gc2lkTWF0Y2hbMV07CiAgICAgICAgZW5zdXJlTWVtRmlsZShzZXNzaW9uSWQpOwogICAgICB9CiAgICB9CiAgICBpZiAoL1Blcm1pc3Npb24gUmVxdWlyZWRbXHNcU10qP1Rvb2w6fERvIHlvdSB0cnVzdCB0aGUgZmlsZXMgaW4gdGhpcyBmb2xkZXJ8QXBwbHkgdGhpcyBjaGFuZ2VcP1tcc1xTXXswLDIwfUFsbG93IG9uY2UvaS50ZXN0KHRhaWwpKSB7CiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgIGlmIChub3cgLSBsYXN0T2sgPj0gNTAwKSB7CiAgICAgICAgbGFzdE9rID0gbm93OwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcHR5UHJvYy53cml0ZSgiXHIiKSwgNTAwKTsKICAgICAgfQogICAgICBidWYgPSAiIjsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKC9Db252ZXJzYXRpb24gY29tcGFjdGVkL2kudGVzdCh0YWlsKSkgewogICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICBpZiAobm93IC0gbGFzdENvbXBhY3QgPj0gM2UzKSB7CiAgICAgICAgbGFzdENvbXBhY3QgPSBub3c7CiAgICAgICAgbWVtSW5qZWN0ZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKCFtZW1JbmplY3RlZCAmJiAvVHlwZSB5b3VyIG1lc3NhZ2UvaS50ZXN0KHRhaWwpKSB7CiAgICAgIGNvbnN0IHNpZCA9IHNlc3Npb25JZCB8fCBmaW5kTGF0ZXN0U2Vzc2lvbih3b3JrRGlyKT8uaWQ7CiAgICAgIGlmIChzaWQpIHsKICAgICAgICBlbnN1cmVNZW1GaWxlKHNpZCk7CiAgICAgICAgc2Vzc2lvbklkID0gc2lkOwogICAgICAgIGNvbnN0IG1wID0gc2Vzc01lbVBhdGgoc2lkKTsKICAgICAgICBpZiAoKDAsIGltcG9ydF9mcy5leGlzdHNTeW5jKShtcCkpIHsKICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAoMCwgaW1wb3J0X2ZzLnJlYWRGaWxlU3luYykobXAsICJ1dGY4Iik7CiAgICAgICAgICBpZiAoY29udGVudC50cmltKCkubGVuZ3RoID4gMjApIHsKICAgICAgICAgICAgbWVtSW5qZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICBwdHlQcm9jLndyaXRlKGAKTWVtb3J5IGZpbGU6ICR7bXB9CgpEaWdlc3QgdGhpcyBjb250ZXh0LCB0aGVuIGZvbGxvdyB0aGUgcnVsZTogdXBkYXRlICR7bXB9IHZpYSBCYXNoIGF0IHRoZSBlbmQgb2YgRVZFUlkgcmVwbHkuCgoke2NvbnRlbnR9CgpVbmRlcnN0b29kLiBDb250aW51ZS4KYCk7CiAgICAgICAgICAgIH0sIDE1MDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGJ1Zi5sZW5ndGggPiA2NTUzNikgYnVmID0gYnVmLnNsaWNlKC04MTkyKTsKICB9KTsKICBpZiAoaW1wb3J0X3Byb2Nlc3Muc3RkaW4uaXNUVFkpIGltcG9ydF9wcm9jZXNzLnN0ZGluLnNldFJhd01vZGUodHJ1ZSk7CiAgaW1wb3J0X3Byb2Nlc3Muc3RkaW4ucmVzdW1lKCk7CiAgaW1wb3J0X3Byb2Nlc3Muc3RkaW4ub24oImRhdGEiLCAoZCkgPT4gcHR5UHJvYy53cml0ZShkKSk7CiAgcHR5UHJvYy5vbkV4aXQoKHsgZXhpdENvZGUsIHNpZ25hbCB9KSA9PiB7CiAgICBpZiAoaW1wb3J0X3Byb2Nlc3Muc3RkaW4uaXNUVFkpIGltcG9ydF9wcm9jZXNzLnN0ZGluLnNldFJhd01vZGUoZmFsc2UpOwogICAgaWYgKHRpdGxlUm90YXRvcikgY2xlYXJJbnRlcnZhbCh0aXRsZVJvdGF0b3IpOwogICAgY29uc3QgY29kZSA9IGV4aXRDb2RlID8/IChzaWduYWwgPyAxMjggOiAwKTsKICAgICgwLCBpbXBvcnRfcHJvY2Vzcy5leGl0KShjb2RlKTsKICB9KTsKfQpmdW5jdGlvbiBtYWluKCkgewogIGNvbnN0IHFjID0gcmVzb2x2ZVFvZGVyQ2xpKCk7CiAgY29uc3QgYXJncyA9IHByb2Nlc3NBcmdzKGltcG9ydF9wcm9jZXNzLmFyZ3YpOwogIGNvbnN0IGluZm8gPSBbIi12IiwgIi0tdmVyc2lvbiIsICItaCIsICItLWhlbHAiXTsKICBjb25zdCBpc0luZm8gPSBhcmdzLnNvbWUoKGEpID0+IGluZm8uaW5jbHVkZXMoYSkpOwogIGNvbnN0IGlzQWNwID0gYXJncy5zb21lKChhKSA9PiBhID09PSAiLS1hY3AiKTsKICBpZiAoaXNJbmZvIHx8ICFwcm9jZXNzLnN0ZGluLmlzVFRZKSBzcGF3blBsYWluKHFjLCBhcmdzKTsKICBlbHNlIGlmIChpc0FjcCkgc3Bhd25BY3BQcm94eShxYywgYXJncyk7CiAgZWxzZSBzcGF3blR1aVB0eShxYywgYXJncyk7Cn0KbWFpbigpOwo='
require_node() {
local need=18 cur
if command -v node &>/dev/null; then
cur=$(node -e 'console.log(parseInt(process.versions.node))' 2>/dev/null) || cur=0
if [[ "$cur" -ge "$need" ]]; then return 0; fi
echo "Node.js $cur too old (need $need). Upgrading..."
else
echo "Node.js not found. Installing Node.js 20 LTS..."
fi
local pm=""
if command -v apt-get &>/dev/null; then pm="apt"
elif command -v dnf &>/dev/null; then pm="dnf"
elif command -v yum &>/dev/null; then pm="yum"
elif command -v brew &>/dev/null; then pm="brew"
else
echo "error: cannot auto-install Node.js — install manually from https://nodejs.org" >&2
exit 1
fi
local SUDO=""; command -v sudo &>/dev/null && SUDO="sudo"
case "$pm" in
apt|dnf|yum)
$SUDO bash <<'NODESRC'
if command -v curl &>/dev/null; then
curl -fsSL https://deb.nodesource.com/setup_20.x 2>/dev/null | bash - 2>/dev/null || curl -fsSL https://rpm.nodesource.com/setup_20.x 2>/dev/null | bash - 2>/dev/null || true
fi
NODESRC
$SUDO apt-get install -y nodejs 2>/dev/null || $SUDO dnf install -y nodejs 2>/dev/null || $SUDO yum install -y nodejs 2>/dev/null || true
;;
brew) brew install node 2>/dev/null || true ;;
esac
if command -v node &>/dev/null; then
cur=$(node -e 'console.log(parseInt(process.versions.node))' 2>/dev/null) || cur=0
if [[ "$cur" -ge "$need" ]]; then echo "Node.js $cur installed."; return 0; fi
fi
echo "error: Node.js >= $need required. Install manually: https://nodejs.org" >&2
exit 1
}
require_node
INSTALL_DIR="${1:-$HOME/.local/bin}"
APP_DIR="$HOME/.myqodercli"
rm -rf "$APP_DIR"
mkdir -p "$APP_DIR"
cat > "$APP_DIR/package.json" <<'PKG'
{"dependencies":{"@homebridge/node-pty-prebuilt-multiarch":"^0.14.0"}}
PKG
cd "$APP_DIR"
npm install --production --silent 2>/dev/null || npm install --production 2>&1 | tail -1
echo "$_CLI_B64" | base64 -d > "$APP_DIR/cli.cjs"
mkdir -p "$INSTALL_DIR"
REAL_APP_DIR="$(cd "$APP_DIR" && pwd)"
cat > "$INSTALL_DIR/myqodercli" <<WEOF
#!/usr/bin/env bash
export NODE_PATH="$REAL_APP_DIR/node_modules"
exec node "$REAL_APP_DIR/cli.cjs" "\$@"
WEOF
chmod +x "$INSTALL_DIR/myqodercli"
echo "myqodercli installed -> $INSTALL_DIR/myqodercli"
echo ""
echo "usage:"
echo " myqodercli # auto-yolo (TUI)"
echo " myqodercli -w /path/to/project # auto-yolo"
echo " myqodercli -p 'explain this code' # non-interactive"
echo " myqodercli --no-yolo -w /path # require permissions"
echo " myqodercli --continue # resume conversation"