ZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggOTYzMTI3Yy4uZWZhZGUyNyAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTMzLDcgKzMzLDcgQEAKIF9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbiQiCiAjICRTb3VyY2UkCiAKLXZlcnNpb24gICAgID0gIjAuOC4wIgordmVyc2lvbiAgICAgPSAiMC45LjAiCiBfX2F1dGhvcl9fICA9ICJMYXJzIEd1c3TkYmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCiBfX2RhdGVfXyAgICA9ICIkRGF0ZSQiCiBfX2N2c2lkX18gICA9ICIkSWQkIgpAQCAtNTAsNiArNTAsNyBAQAogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBjb3B5CitpbXBvcnQgcmUKIAogaWYgc3lzLnBsYXRmb3JtID09ICdtYWMnOgogICAgICMgVGhpcyBtb2R1bGUgbmVlZHMgd29yayBmb3IgTWFjT1M5LCBlc3BlY2lhbGx5IGluIHRoZSBhcmVhIG9mIHBhdGhuYW1lCkBAIC03MSw0MiArNzIsNjAgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgdGFyIGNvbnN0YW50cwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTlVMICAgICAgICA9ICJcMCIgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgotQkxPQ0tTSVpFICA9IDUxMiAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcworTlVMID0gIlwwIiAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgorQkxPQ0tTSVpFID0gNTEyICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcwogUkVDT1JEU0laRSA9IEJMT0NLU0laRSAqIDIwICAgICAjIGxlbmd0aCBvZiByZWNvcmRzCi1NQUdJQyAgICAgID0gInVzdGFyIiAgICAgICAgICAgICMgbWFnaWMgdGFyIHN0cmluZwotVkVSU0lPTiAgICA9ICIwMCIgICAgICAgICAgICAgICAjIHZlcnNpb24gbnVtYmVyCitHTlVfTUFHSUMgPSAidXN0YXIgIFwwIiAgICAgICAgICMgbWFnaWMgZ251IHRhciBzdHJpbmcKK1BPU0lYX01BR0lDID0gInVzdGFyXHgwMDAwIiAgICAgIyBtYWdpYyBwb3NpeCB0YXIgc3RyaW5nCiAKLUxFTkdUSF9OQU1FICAgID0gMTAwICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lCi1MRU5HVEhfTElOSyAgICA9IDEwMCAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5rbmFtZQotTEVOR1RIX1BSRUZJWCAgPSAxNTUgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBwcmVmaXggZmllbGQKLU1BWFNJWkVfTUVNQkVSID0gMDc3Nzc3Nzc3Nzc3ICAjIG1heGltdW0gc2l6ZSBvZiBhIGZpbGUgKDExIG9jdGFsIGRpZ2l0cykKK0xFTkdUSF9OQU1FID0gMTAwICAgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lCitMRU5HVEhfTElOSyA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5rbmFtZQorTEVOR1RIX1BSRUZJWCA9IDE1NSAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBwcmVmaXggZmllbGQKIAotUkVHVFlQRSAgPSAiMCIgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQorUkVHVFlQRSA9ICIwIiAgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQogQVJFR1RZUEUgPSAiXDAiICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQotTE5LVFlQRSAgPSAiMSIgICAgICAgICAgICAgICAgICAjIGxpbmsgKGluc2lkZSB0YXJmaWxlKQotU1lNVFlQRSAgPSAiMiIgICAgICAgICAgICAgICAgICAjIHN5bWJvbGljIGxpbmsKLUNIUlRZUEUgID0gIjMiICAgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2UKLUJMS1RZUEUgID0gIjQiICAgICAgICAgICAgICAgICAgIyBibG9jayBzcGVjaWFsIGRldmljZQotRElSVFlQRSAgPSAiNSIgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQorTE5LVFlQRSA9ICIxIiAgICAgICAgICAgICAgICAgICAjIGxpbmsgKGluc2lkZSB0YXJmaWxlKQorU1lNVFlQRSA9ICIyIiAgICAgICAgICAgICAgICAgICAjIHN5bWJvbGljIGxpbmsKK0NIUlRZUEUgPSAiMyIgICAgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2UKK0JMS1RZUEUgPSAiNCIgICAgICAgICAgICAgICAgICAgIyBibG9jayBzcGVjaWFsIGRldmljZQorRElSVFlQRSA9ICI1IiAgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQogRklGT1RZUEUgPSAiNiIgICAgICAgICAgICAgICAgICAjIGZpZm8gc3BlY2lhbCBkZXZpY2UKIENPTlRUWVBFID0gIjciICAgICAgICAgICAgICAgICAgIyBjb250aWd1b3VzIGZpbGUKIAotR05VVFlQRV9MT05HTkFNRSA9ICJMIiAgICAgICAgICAjIEdOVSB0YXIgZXh0ZW5zaW9uIGZvciBsb25nbmFtZXMKLUdOVVRZUEVfTE9OR0xJTksgPSAiSyIgICAgICAgICAgIyBHTlUgdGFyIGV4dGVuc2lvbiBmb3IgbG9uZ2xpbmsKLUdOVVRZUEVfU1BBUlNFICAgPSAiUyIgICAgICAgICAgIyBHTlUgdGFyIGV4dGVuc2lvbiBmb3Igc3BhcnNlIGZpbGUKK0dOVVRZUEVfTE9OR05BTUUgPSAiTCIgICAgICAgICAgIyBHTlUgdGFyIGxvbmduYW1lCitHTlVUWVBFX0xPTkdMSU5LID0gIksiICAgICAgICAgICMgR05VIHRhciBsb25nbGluaworR05VVFlQRV9TUEFSU0UgPSAiUyIgICAgICAgICAgICAjIEdOVSB0YXIgc3BhcnNlIGZpbGUKKworWEhEVFlQRSA9ICJ4IiAgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSBleHRlbmRlZCBoZWFkZXIKK1hHTFRZUEUgPSAiZyIgICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgZ2xvYmFsIGhlYWRlcgorU09MQVJJU19YSERUWVBFID0gIlgiICAgICAgICAgICAjIFNvbGFyaXMgZXh0ZW5kZWQgaGVhZGVyCisKK1VTVEFSX0ZPUk1BVCA9IDAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTE5ODggKHVzdGFyKSBmb3JtYXQKK0dOVV9GT1JNQVQgPSAxICAgICAgICAgICAgICAgICAgIyBHTlUgdGFyIGZvcm1hdAorUEFYX0ZPUk1BVCA9IDIgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSAocGF4KSBmb3JtYXQKK0RFRkFVTFRfRk9STUFUID0gR05VX0ZPUk1BVAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHRhcmZpbGUgY29uc3RhbnRzCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TVVBQT1JURURfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsIExOS1RZUEUsICAjIGZpbGUgdHlwZXMgdGhhdCB0YXJmaWxlCi0gICAgICAgICAgICAgICAgICAgU1lNVFlQRSwgRElSVFlQRSwgRklGT1RZUEUsICAjIGNhbiBjb3BlIHdpdGguCisjIEZpbGUgdHlwZXMgdGhhdCB0YXJmaWxlIHN1cHBvcnRzOgorU1VQUE9SVEVEX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCBMTktUWVBFLAorICAgICAgICAgICAgICAgICAgIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLAogICAgICAgICAgICAgICAgICAgIENPTlRUWVBFLCBDSFJUWVBFLCBCTEtUWVBFLAogICAgICAgICAgICAgICAgICAgIEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkssCiAgICAgICAgICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCiAKLVJFR1VMQVJfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsICAgICAgICAgICAgICMgZmlsZSB0eXBlcyB0aGF0IHNvbWVob3cKLSAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIEdOVVRZUEVfU1BBUlNFKSAgICAgICMgcmVwcmVzZW50IHJlZ3VsYXIgZmlsZXMKKyMgRmlsZSB0eXBlcyB0aGF0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KK1JFR1VMQVJfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsCisgICAgICAgICAgICAgICAgIENPTlRUWVBFLCBHTlVUWVBFX1NQQVJTRSkKKworIyBGaWxlIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIEdOVSB0YXIgZm9ybWF0LgorR05VX1RZUEVTID0gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkssCisgICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCisKKyMgRmllbGRzIGZyb20gYSBwYXggaGVhZGVyIHRoYXQgb3ZlcnJpZGUgYSBUYXJJbmZvIGF0dHJpYnV0ZS4KK1BBWF9GSUVMRFMgPSAoInBhdGgiLCAibGlua3BhdGgiLCAic2l6ZSIsICJtdGltZSIsCisgICAgICAgICAgICAgICJ1aWQiLCAiZ2lkIiwgInVuYW1lIiwgImduYW1lIikKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBCaXRzIHVzZWQgaW4gdGhlIG1vZGUgZmllbGQsIHZhbHVlcyBpbiBvY3RhbC4KQEAgLTEzMyw2ICsxNTIsMTMgQEAKIFRPRVhFQyAgPSAwMDAxICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IG90aGVyCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW5pdGlhbGl6YXRpb24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VOQ09ESU5HID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCitpZiBFTkNPRElORyBpcyBOb25lOgorICAgIEVOQ09ESU5HID0gImFzY2lpIgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFNvbWUgdXNlZnVsIGZ1bmN0aW9ucwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xNDEsNiArMTY3LDE1IEBACiAgICAgIiIiCiAgICAgcmV0dXJuIHNbOmxlbmd0aF0gKyAobGVuZ3RoIC0gbGVuKHMpKSAqIE5VTAogCitkZWYgbnRzKHMpOgorICAgICIiIkNvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGZpZWxkIHRvIGEgcHl0aG9uIHN0cmluZy4KKyAgICAiIiIKKyAgICAjIFVzZSB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCBudWxsIGNoYXIuCisgICAgcCA9IHMuZmluZCgiXDAiKQorICAgIGlmIHAgPT0gLTE6CisgICAgICAgIHJldHVybiBzCisgICAgcmV0dXJuIHNbOnBdCisKIGRlZiBudGkocyk6CiAgICAgIiIiQ29udmVydCBhIG51bWJlciBmaWVsZCB0byBhIHB5dGhvbiBudW1iZXIuCiAgICAgIiIiCkBAIC0xNDgsNyArMTgzLDcgQEAKICAgICAjIGl0bigpIGJlbG93LgogICAgIGlmIHNbMF0gIT0gY2hyKDAyMDApOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBuID0gaW50KHMucnN0cmlwKE5VTCArICIgIikgb3IgIjAiLCA4KQorICAgICAgICAgICAgbiA9IGludChudHMocykgb3IgIjAiLCA4KQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHJhaXNlIEhlYWRlckVycm9yKCJpbnZhbGlkIGhlYWRlciIpCiAgICAgZWxzZToKQEAgLTE1OCw3ICsxOTMsNyBAQAogICAgICAgICAgICAgbiArPSBvcmQoc1tpICsgMV0pCiAgICAgcmV0dXJuIG4KIAotZGVmIGl0bihuLCBkaWdpdHM9OCwgcG9zaXg9RmFsc2UpOgorZGVmIGl0bihuLCBkaWdpdHM9OCwgZm9ybWF0PURFRkFVTFRfRk9STUFUKToKICAgICAiIiJDb252ZXJ0IGEgcHl0aG9uIG51bWJlciB0byBhIG51bWJlciBmaWVsZC4KICAgICAiIiIKICAgICAjIFBPU0lYIDEwMDMuMS0xOTg4IHJlcXVpcmVzIG51bWJlcnMgdG8gYmUgZW5jb2RlZCBhcyBhIHN0cmluZyBvZgpAQCAtMTcwLDcgKzIwNSw3IEBACiAgICAgaWYgMCA8PSBuIDwgOCAqKiAoZGlnaXRzIC0gMSk6CiAgICAgICAgIHMgPSAiJTAqbyIgJSAoZGlnaXRzIC0gMSwgbikgKyBOVUwKICAgICBlbHNlOgotICAgICAgICBpZiBwb3NpeDoKKyAgICAgICAgaWYgZm9ybWF0ICE9IEdOVV9GT1JNQVQgb3IgbiA+PSAyNTYgKiogKGRpZ2l0cyAtIDEpOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3ZlcmZsb3cgaW4gbnVtYmVyIGZpZWxkIikKIAogICAgICAgICBpZiBuIDwgMDoKQEAgLTUxNiw3ICs1NTEsMTAgQEAKICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX19yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGJ1ZiA9IHNlbGYuY21wLmRlY29tcHJlc3MoYnVmKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuY21wLmRlY29tcHJlc3MoYnVmKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSIpCiAgICAgICAgICAgICB0LmFwcGVuZChidWYpCiAgICAgICAgICAgICBjICs9IGxlbihidWYpCiAgICAgICAgIHQgPSAiIi5qb2luKHQpCkBAIC01NzcsNiArNjE1LDcgQEAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgbW9kZSk6CiAgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLm5hbWUgPSBnZXRhdHRyKHNlbGYuZmlsZW9iaiwgIm5hbWUiLCBOb25lKQogICAgICAgICBzZWxmLmluaXQoKQogCiAgICAgZGVmIGluaXQoc2VsZik6CkBAIC04NDksOCArODg4LDggQEAKICAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySW5mbyBvYmplY3QuIG5hbWUgaXMgdGhlIG9wdGlvbmFsIG5hbWUKICAgICAgICAgICAgb2YgdGhlIG1lbWJlci4KICAgICAgICAgIiIiCi0gICAgICAgIHNlbGYubmFtZSA9IG5hbWUgICAgICAgICMgbWVtYmVyIG5hbWUgKGRpcm5hbWVzIG11c3QgZW5kIHdpdGggJy8nKQotICAgICAgICBzZWxmLm1vZGUgPSAwNjY2ICAgICAgICAjIGZpbGUgcGVybWlzc2lvbnMKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZSAgICAgICAgIyBtZW1iZXIgbmFtZQorICAgICAgICBzZWxmLm1vZGUgPSAwNjQ0ICAgICAgICAjIGZpbGUgcGVybWlzc2lvbnMKICAgICAgICAgc2VsZi51aWQgPSAwICAgICAgICAgICAgIyB1c2VyIGlkCiAgICAgICAgIHNlbGYuZ2lkID0gMCAgICAgICAgICAgICMgZ3JvdXAgaWQKICAgICAgICAgc2VsZi5zaXplID0gMCAgICAgICAgICAgIyBmaWxlIHNpemUKQEAgLTg1OCwxNyArODk3LDI3NCBAQAogICAgICAgICBzZWxmLmNoa3N1bSA9IDAgICAgICAgICAjIGhlYWRlciBjaGVja3N1bQogICAgICAgICBzZWxmLnR5cGUgPSBSRUdUWVBFICAgICAjIG1lbWJlciB0eXBlCiAgICAgICAgIHNlbGYubGlua25hbWUgPSAiIiAgICAgICMgbGluayBuYW1lCi0gICAgICAgIHNlbGYudW5hbWUgPSAidXNlciIgICAgICMgdXNlciBuYW1lCi0gICAgICAgIHNlbGYuZ25hbWUgPSAiZ3JvdXAiICAgICMgZ3JvdXAgbmFtZQorICAgICAgICBzZWxmLnVuYW1lID0gInJvb3QiICAgICAjIHVzZXIgbmFtZQorICAgICAgICBzZWxmLmduYW1lID0gInJvb3QiICAgICAjIGdyb3VwIG5hbWUKICAgICAgICAgc2VsZi5kZXZtYWpvciA9IDAgICAgICAgIyBkZXZpY2UgbWFqb3IgbnVtYmVyCiAgICAgICAgIHNlbGYuZGV2bWlub3IgPSAwICAgICAgICMgZGV2aWNlIG1pbm9yIG51bWJlcgogCiAgICAgICAgIHNlbGYub2Zmc2V0ID0gMCAgICAgICAgICMgdGhlIHRhciBoZWFkZXIgc3RhcnRzIGhlcmUKICAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IDAgICAgIyB0aGUgZmlsZSdzIGRhdGEgc3RhcnRzIGhlcmUKIAorICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30gICAjIHBheCBoZWFkZXIgaW5mb3JtYXRpb24KKworICAgICMgSW4gcGF4IGhlYWRlcnMgdGhlICJuYW1lIiBhbmQgImxpbmtuYW1lIiBmaWVsZCBhcmUgY2FsbGVkCisgICAgIyAicGF0aCIgYW5kICJsaW5rcGF0aCIuCisgICAgZGVmIF9nZXRwYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisgICAgZGVmIF9zZXRwYXRoKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgcGF0aCA9IHByb3BlcnR5KF9nZXRwYXRoLCBfc2V0cGF0aCkKKworICAgIGRlZiBfZ2V0bGlua3BhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxpbmtuYW1lCisgICAgZGVmIF9zZXRsaW5rcGF0aChzZWxmLCBsaW5rbmFtZSk6CisgICAgICAgIHNlbGYubGlua25hbWUgPSBsaW5rbmFtZQorICAgIGxpbmtwYXRoID0gcHJvcGVydHkoX2dldGxpbmtwYXRoLCBfc2V0bGlua3BhdGgpCisKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiPCVzICVyIGF0ICUjeD4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLHNlbGYubmFtZSxpZChzZWxmKSkKIAorICAgIGRlZiBnZXRfaW5mbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBUYXJJbmZvJ3MgYXR0cmlidXRlcyBhcyBhIGRpY3Rpb25hcnkuCisgICAgICAgICIiIgorICAgICAgICBpbmZvID0geworICAgICAgICAgICAgIm5hbWUiOiAgICAgbm9ybXBhdGgoc2VsZi5uYW1lKSwKKyAgICAgICAgICAgICJtb2RlIjogICAgIHNlbGYubW9kZSAmIDA3Nzc3LAorICAgICAgICAgICAgInVpZCI6ICAgICAgc2VsZi51aWQsCisgICAgICAgICAgICAiZ2lkIjogICAgICBzZWxmLmdpZCwKKyAgICAgICAgICAgICJzaXplIjogICAgIHNlbGYuc2l6ZSwKKyAgICAgICAgICAgICJtdGltZSI6ICAgIHNlbGYubXRpbWUsCisgICAgICAgICAgICAiY2hrc3VtIjogICBzZWxmLmNoa3N1bSwKKyAgICAgICAgICAgICJ0eXBlIjogICAgIHNlbGYudHlwZSwKKyAgICAgICAgICAgICJsaW5rbmFtZSI6IG5vcm1wYXRoKHNlbGYubGlua25hbWUpIGlmIHNlbGYubGlua25hbWUgZWxzZSAiIiwKKyAgICAgICAgICAgICJ1bmFtZSI6ICAgIHNlbGYudW5hbWUsCisgICAgICAgICAgICAiZ25hbWUiOiAgICBzZWxmLmduYW1lLAorICAgICAgICAgICAgImRldm1ham9yIjogc2VsZi5kZXZtYWpvciwKKyAgICAgICAgICAgICJkZXZtaW5vciI6IHNlbGYuZGV2bWlub3IKKyAgICAgICAgfQorCisgICAgICAgIGlmIGluZm9bInR5cGUiXSA9PSBESVJUWVBFIGFuZCBub3QgaW5mb1sibmFtZSJdLmVuZHN3aXRoKCIvIik6CisgICAgICAgICAgICBpbmZvWyJuYW1lIl0gKz0gIi8iCisKKyAgICAgICAgcmV0dXJuIGluZm8KKworICAgIGRlZiB0b2J1ZihzZWxmLCBmb3JtYXQ9REVGQVVMVF9GT1JNQVQsIGVuY29kaW5nPUVOQ09ESU5HKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdGFyIGhlYWRlciBhcyBhIHN0cmluZyBvZiA1MTIgYnl0ZSBibG9ja3MuCisgICAgICAgICIiIgorICAgICAgICBpZiBmb3JtYXQgPT0gVVNUQVJfRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3VzdGFyX2hlYWRlcigpCisgICAgICAgIGVsaWYgZm9ybWF0ID09IEdOVV9GT1JNQVQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfZ251X2hlYWRlcigpCisgICAgICAgIGVsaWYgZm9ybWF0ID09IFBBWF9GT1JNQVQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfcGF4X2hlYWRlcihlbmNvZGluZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgZm9ybWF0IikKKworICAgIGRlZiBjcmVhdGVfdXN0YXJfaGVhZGVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKCkKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCisKKyAgICAgICAgaWYgbGVuKGluZm9bImxpbmtuYW1lIl0pID4gTEVOR1RIX0xJTks6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJsaW5rbmFtZSBpcyB0b28gbG9uZyIpCisKKyAgICAgICAgaWYgbGVuKGluZm9bIm5hbWUiXSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIGluZm9bInByZWZpeCJdLCBpbmZvWyJuYW1lIl0gPSBzZWxmLl9wb3NpeF9zcGxpdF9uYW1lKGluZm9bIm5hbWUiXSkKKworICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQpCisKKyAgICBkZWYgY3JlYXRlX2dudV9oZWFkZXIoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgR05VIGhlYWRlciBibG9jayBzZXF1ZW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKCkKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IEdOVV9NQUdJQworCisgICAgICAgIGJ1ZiA9ICIiCisgICAgICAgIGlmIGxlbihpbmZvWyJsaW5rbmFtZSJdKSA+IExFTkdUSF9MSU5LOgorICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVfbG9uZ19oZWFkZXIoaW5mb1sibGlua25hbWUiXSwgR05VVFlQRV9MT05HTElOSykKKworICAgICAgICBpZiBsZW4oaW5mb1sibmFtZSJdKSA+IExFTkdUSF9OQU1FOgorICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVfbG9uZ19oZWFkZXIoaW5mb1sibmFtZSJdLCBHTlVUWVBFX0xPTkdOQU1FKQorCisgICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIEdOVV9GT1JNQVQpCisKKyAgICBkZWYgY3JlYXRlX3BheF9oZWFkZXIoc2VsZiwgZW5jb2RpbmcpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4gSWYgaXQgY2Fubm90IGJlCisgICAgICAgICAgIHJlcHJlc2VudGVkIHRoaXMgd2F5LCBwcmVwZW5kIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBzZXF1ZW5jZQorICAgICAgICAgICB3aXRoIHN1cHBsZW1lbnQgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCisgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQworICAgICAgICBwYXhfaGVhZGVycyA9IHNlbGYucGF4X2hlYWRlcnMuY29weSgpCisKKyAgICAgICAgIyBUZXN0IHN0cmluZyBmaWVsZHMgZm9yIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZmllbGQgbGVuZ3RoIG9yIGNhbm5vdAorICAgICAgICAjIGJlIHJlcHJlc2VudGVkIGluIEFTQ0lJIGVuY29kaW5nLgorICAgICAgICBmb3IgbmFtZSwgaG5hbWUsIGxlbmd0aCBpbiAoCisgICAgICAgICAgICAgICAgKCJuYW1lIiwgInBhdGgiLCBMRU5HVEhfTkFNRSksICgibGlua25hbWUiLCAibGlua3BhdGgiLCBMRU5HVEhfTElOSyksCisgICAgICAgICAgICAgICAgKCJ1bmFtZSIsICJ1bmFtZSIsIDMyKSwgKCJnbmFtZSIsICJnbmFtZSIsIDMyKSk6CisKKyAgICAgICAgICAgIHZhbCA9IGluZm9bbmFtZV0uZGVjb2RlKGVuY29kaW5nKQorCisgICAgICAgICAgICAjIFRyeSB0byBlbmNvZGUgdGhlIHN0cmluZyBhcyBBU0NJSS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWwuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IHZhbAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGxlbih2YWwpID4gbGVuZ3RoOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gIm5hbWUiOgorICAgICAgICAgICAgICAgICAgICAjIFRyeSB0byBzcXVlZXplIGEgbG9uZ25hbWUgaW4gdGhlIHByZWZpeCBhbmQgbmFtZSBmaWVsZHMgYXMgaW4KKyAgICAgICAgICAgICAgICAgICAgIyB1c3RhciBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9bInByZWZpeCJdLCBpbmZvWyJuYW1lIl0gPSBzZWxmLl9wb3NpeF9zcGxpdF9uYW1lKGluZm9bIm5hbWUiXSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSB2YWwKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gdmFsCisKKyAgICAgICAgIyBUZXN0IG51bWJlciBmaWVsZHMgZm9yIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZmllbGQgbGltaXQgb3IgdmFsdWVzCisgICAgICAgICMgdGhhdCBsaWtlIHRvIGJlIHN0b3JlZCBhcyBmbG9hdC4KKyAgICAgICAgZm9yIG5hbWUsIGRpZ2l0cyBpbiAoKCJ1aWQiLCA4KSwgKCJnaWQiLCA4KSwgKCJzaXplIiwgMTIpLCAoIm10aW1lIiwgMTIpKToKKyAgICAgICAgICAgIHZhbCA9IGluZm9bbmFtZV0KKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IHZhbCA8IDggKiogKGRpZ2l0cyAtIDEpIG9yIGlzaW5zdGFuY2UodmFsLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbbmFtZV0gPSB1bmljb2RlKHZhbCkKKyAgICAgICAgICAgICAgICBpbmZvW25hbWVdID0gMAorCisgICAgICAgIGlmIHBheF9oZWFkZXJzOgorICAgICAgICAgICAgYnVmID0gc2VsZi5fY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihwYXhfaGVhZGVycykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1ZiA9ICIiCisKKyAgICAgICAgcmV0dXJuIGJ1ZiArIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcihjbHMsIHBheF9oZWFkZXJzLCBlbmNvZGluZyk6CisgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgcGF4IGdsb2JhbCBoZWFkZXIgYmxvY2sgc2VxdWVuY2UuCisgICAgICAgICIiIgorICAgICAgICBuZXdfaGVhZGVycyA9IHt9CisgICAgICAgIGZvciBrZXksIHZhbCBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAga2V5ID0gY2xzLl90b191bmljb2RlKGtleSwgZW5jb2RpbmcpCisgICAgICAgICAgICB2YWwgPSBjbHMuX3RvX3VuaWNvZGUodmFsLCBlbmNvZGluZykKKyAgICAgICAgICAgIG5ld19oZWFkZXJzW2tleV0gPSB2YWwKKyAgICAgICAgcmV0dXJuIGNscy5fY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihuZXdfaGVhZGVycywgdHlwZT1YR0xUWVBFKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfdG9fdW5pY29kZSh2YWx1ZSwgZW5jb2RpbmcpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB1bmljb2RlKToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGZsb2F0KSk6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZSh2YWx1ZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUodmFsdWUsIGVuY29kaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5hYmxlIHRvIGNvbnZlcnQgdG8gdW5pY29kZTogJXIiICUgdmFsdWUpCisKKyAgICBkZWYgX3Bvc2l4X3NwbGl0X25hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlNwbGl0IGEgbmFtZSBsb25nZXIgdGhhbiAxMDAgY2hhcnMgaW50byBhIHByZWZpeAorICAgICAgICAgICBhbmQgYSBuYW1lIHBhcnQuCisgICAgICAgICIiIgorICAgICAgICBwcmVmaXggPSBuYW1lWzpMRU5HVEhfUFJFRklYICsgMV0KKyAgICAgICAgd2hpbGUgcHJlZml4IGFuZCBwcmVmaXhbLTFdICE9ICIvIjoKKyAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCisKKyAgICAgICAgbmFtZSA9IG5hbWVbbGVuKHByZWZpeCk6XQorICAgICAgICBwcmVmaXggPSBwcmVmaXhbOi0xXQorCisgICAgICAgIGlmIG5vdCBwcmVmaXggb3IgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJuYW1lIGlzIHRvbyBsb25nIikKKyAgICAgICAgcmV0dXJuIHByZWZpeCwgbmFtZQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY3JlYXRlX2hlYWRlcihpbmZvLCBmb3JtYXQpOgorICAgICAgICAiIiJSZXR1cm4gYSBoZWFkZXIgYmxvY2suIGluZm8gaXMgYSBkaWN0aW9uYXJ5IHdpdGggZmlsZQorICAgICAgICAgICBpbmZvcm1hdGlvbiwgZm9ybWF0IG11c3QgYmUgb25lIG9mIHRoZSAqX0ZPUk1BVCBjb25zdGFudHMuCisgICAgICAgICIiIgorICAgICAgICBwYXJ0cyA9IFsKKyAgICAgICAgICAgIHN0bihpbmZvLmdldCgibmFtZSIsICIiKSwgMTAwKSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgibW9kZSIsIDApICYgMDc3NzcsIDgsIGZvcm1hdCksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoInVpZCIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJnaWQiLCAwKSwgOCwgZm9ybWF0KSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgic2l6ZSIsIDApLCAxMiwgZm9ybWF0KSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgibXRpbWUiLCAwKSwgMTIsIGZvcm1hdCksCisgICAgICAgICAgICAiICAgICAgICAiLCAjIGNoZWNrc3VtIGZpZWxkCisgICAgICAgICAgICBpbmZvLmdldCgidHlwZSIsIFJFR1RZUEUpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJsaW5rbmFtZSIsICIiKSwgMTAwKSwKKyAgICAgICAgICAgIHN0bihpbmZvLmdldCgibWFnaWMiLCAiIiksIDgpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJ1bmFtZSIsICIiKSwgMzIpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJnbmFtZSIsICIiKSwgMzIpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtYWpvciIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtaW5vciIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJwcmVmaXgiLCAiIiksIDE1NSkKKyAgICAgICAgXQorCisgICAgICAgIGJ1ZiA9IHN0cnVjdC5wYWNrKCIlZHMiICUgQkxPQ0tTSVpFLCAiIi5qb2luKHBhcnRzKSkKKyAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW1zKGJ1ZlstQkxPQ0tTSVpFOl0pWzBdCisgICAgICAgIGJ1ZiA9IGJ1Zls6LTM2NF0gKyAiJTA2b1wwIiAlIGNoa3N1bSArIGJ1ZlstMzU3Ol0KKyAgICAgICAgcmV0dXJuIGJ1ZgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY3JlYXRlX3BheWxvYWQocGF5bG9hZCk6CisgICAgICAgICIiIlJldHVybiB0aGUgc3RyaW5nIHBheWxvYWQgZmlsbGVkIHdpdGggemVybyBieXRlcworICAgICAgICAgICB1cCB0byB0aGUgbmV4dCA1MTIgYnl0ZSBib3JkZXIuCisgICAgICAgICIiIgorICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW4ocGF5bG9hZCksIEJMT0NLU0laRSkKKyAgICAgICAgaWYgcmVtYWluZGVyID4gMDoKKyAgICAgICAgICAgIHBheWxvYWQgKz0gKEJMT0NLU0laRSAtIHJlbWFpbmRlcikgKiBOVUwKKyAgICAgICAgcmV0dXJuIHBheWxvYWQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfY3JlYXRlX2dudV9sb25nX2hlYWRlcihjbHMsIG5hbWUsIHR5cGUpOgorICAgICAgICAiIiJSZXR1cm4gYSBHTlVUWVBFX0xPTkdOQU1FIG9yIEdOVVRZUEVfTE9OR0xJTksgc2VxdWVuY2UKKyAgICAgICAgICAgZm9yIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBuYW1lICs9IE5VTAorCisgICAgICAgIGluZm8gPSB7fQorICAgICAgICBpbmZvWyJuYW1lIl0gPSAiLi8uL0BMb25nTGluayIKKyAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQorICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4obmFtZSkKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IEdOVV9NQUdJQworCisgICAgICAgICMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlciArIG5hbWUgYmxvY2tzLgorICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkgKyBcCisgICAgICAgICAgICAgICAgY2xzLl9jcmVhdGVfcGF5bG9hZChuYW1lKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKGNscywgcGF4X2hlYWRlcnMsIHR5cGU9WEhEVFlQRSk6CisgICAgICAgICIiIlJldHVybiBhIFBPU0lYLjEtMjAwMSBleHRlbmRlZCBvciBnbG9iYWwgaGVhZGVyIHNlcXVlbmNlCisgICAgICAgICAgIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGtleXdvcmQsIHZhbHVlIHBhaXJzLiBUaGUgdmFsdWVzCisgICAgICAgICAgIG11c3QgYmUgdW5pY29kZSBvYmplY3RzLgorICAgICAgICAiIiIKKyAgICAgICAgcmVjb3JkcyA9IFtdCisgICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAga2V5d29yZCA9IGtleXdvcmQuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIGwgPSBsZW4oa2V5d29yZCkgKyBsZW4odmFsdWUpICsgMyAgICMgJyAnICsgJz0nICsgJ1xuJworICAgICAgICAgICAgbiA9IHAgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIG4gPSBsICsgbGVuKHN0cihwKSkKKyAgICAgICAgICAgICAgICBpZiBuID09IHA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcCA9IG4KKyAgICAgICAgICAgIHJlY29yZHMuYXBwZW5kKCIlZCAlcz0lc1xuIiAlIChwLCBrZXl3b3JkLCB2YWx1ZSkpCisgICAgICAgIHJlY29yZHMgPSAiIi5qb2luKHJlY29yZHMpCisKKyAgICAgICAgIyBXZSB1c2UgYSBoYXJkY29kZWQgIi4vLi9AUGF4SGVhZGVyIiBuYW1lIGxpa2Ugc3RhciBkb2VzCisgICAgICAgICMgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgUE9TSVggcmVjb21tZW5kcy4KKyAgICAgICAgaW5mbyA9IHt9CisgICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQFBheEhlYWRlciIKKyAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQorICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4ocmVjb3JkcykKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCisKKyAgICAgICAgIyBDcmVhdGUgcGF4IGhlYWRlciArIHJlY29yZCBibG9ja3MuCisgICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKSArIFwKKyAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKHJlY29yZHMpCisKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgZnJvbWJ1ZihjbHMsIGJ1Zik6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0IGZyb20gYSA1MTIgYnl0ZSBzdHJpbmcgYnVmZmVyLgpAQCAtODgyLDEyNSArMTE3OCwyNTEgQEAKICAgICAgICAgaWYgY2hrc3VtIG5vdCBpbiBjYWxjX2Noa3N1bXMoYnVmKToKICAgICAgICAgICAgIHJhaXNlIEhlYWRlckVycm9yKCJiYWQgY2hlY2tzdW0iKQogCi0gICAgICAgIHRhcmluZm8gPSBjbHMoKQotICAgICAgICB0YXJpbmZvLmJ1ZiA9IGJ1ZgotICAgICAgICB0YXJpbmZvLm5hbWUgPSBidWZbMDoxMDBdLnJzdHJpcChOVUwpCi0gICAgICAgIHRhcmluZm8ubW9kZSA9IG50aShidWZbMTAwOjEwOF0pCi0gICAgICAgIHRhcmluZm8udWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKLSAgICAgICAgdGFyaW5mby5naWQgPSBudGkoYnVmWzExNjoxMjRdKQotICAgICAgICB0YXJpbmZvLnNpemUgPSBudGkoYnVmWzEyNDoxMzZdKQotICAgICAgICB0YXJpbmZvLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKLSAgICAgICAgdGFyaW5mby5jaGtzdW0gPSBjaGtzdW0KLSAgICAgICAgdGFyaW5mby50eXBlID0gYnVmWzE1NjoxNTddCi0gICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBidWZbMTU3OjI1N10ucnN0cmlwKE5VTCkKLSAgICAgICAgdGFyaW5mby51bmFtZSA9IGJ1ZlsyNjU6Mjk3XS5yc3RyaXAoTlVMKQotICAgICAgICB0YXJpbmZvLmduYW1lID0gYnVmWzI5NzozMjldLnJzdHJpcChOVUwpCi0gICAgICAgIHRhcmluZm8uZGV2bWFqb3IgPSBudGkoYnVmWzMyOTozMzddKQotICAgICAgICB0YXJpbmZvLmRldm1pbm9yID0gbnRpKGJ1ZlszMzc6MzQ1XSkKLSAgICAgICAgcHJlZml4ID0gYnVmWzM0NTo1MDBdLnJzdHJpcChOVUwpCisgICAgICAgIG9iaiA9IGNscygpCisgICAgICAgIG9iai5idWYgPSBidWYKKyAgICAgICAgb2JqLm5hbWUgPSBudHMoYnVmWzA6MTAwXSkKKyAgICAgICAgb2JqLm1vZGUgPSBudGkoYnVmWzEwMDoxMDhdKQorICAgICAgICBvYmoudWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKKyAgICAgICAgb2JqLmdpZCA9IG50aShidWZbMTE2OjEyNF0pCisgICAgICAgIG9iai5zaXplID0gbnRpKGJ1ZlsxMjQ6MTM2XSkKKyAgICAgICAgb2JqLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKKyAgICAgICAgb2JqLmNoa3N1bSA9IGNoa3N1bQorICAgICAgICBvYmoudHlwZSA9IGJ1ZlsxNTY6MTU3XQorICAgICAgICBvYmoubGlua25hbWUgPSBudHMoYnVmWzE1NzoyNTddKQorICAgICAgICBvYmoudW5hbWUgPSBudHMoYnVmWzI2NToyOTddKQorICAgICAgICBvYmouZ25hbWUgPSBudHMoYnVmWzI5NzozMjldKQorICAgICAgICBvYmouZGV2bWFqb3IgPSBudGkoYnVmWzMyOTozMzddKQorICAgICAgICBvYmouZGV2bWlub3IgPSBudGkoYnVmWzMzNzozNDVdKQorICAgICAgICBwcmVmaXggPSBudHMoYnVmWzM0NTo1MDBdKQogCi0gICAgICAgIGlmIHByZWZpeCBhbmQgbm90IHRhcmluZm8uaXNzcGFyc2UoKToKLSAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IHByZWZpeCArICIvIiArIHRhcmluZm8ubmFtZQorICAgICAgICAjIE9sZCBWNyB0YXIgZm9ybWF0IHJlcHJlc2VudHMgYSBkaXJlY3RvcnkgYXMgYSByZWd1bGFyCisgICAgICAgICMgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCisgICAgICAgIGlmIG9iai50eXBlID09IEFSRUdUWVBFIGFuZCBvYmoubmFtZS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgb2JqLnR5cGUgPSBESVJUWVBFCiAKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KKyAgICAgICAgIyBSZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgZnJvbSBkaXJlY3Rvcmllcy4KKyAgICAgICAgaWYgb2JqLmlzZGlyKCk6CisgICAgICAgICAgICBvYmoubmFtZSA9IG9iai5uYW1lLnJzdHJpcCgiLyIpCiAKLSAgICBkZWYgdG9idWYoc2VsZiwgcG9zaXg9RmFsc2UpOgotICAgICAgICAiIiJSZXR1cm4gYSB0YXIgaGVhZGVyIGFzIGEgc3RyaW5nIG9mIDUxMiBieXRlIGJsb2Nrcy4KKyAgICAgICAgIyBSZWNvbnN0cnVjdCBhIHVzdGFyIGxvbmduYW1lLgorICAgICAgICBpZiBwcmVmaXggYW5kIG9iai50eXBlIG5vdCBpbiBHTlVfVFlQRVM6CisgICAgICAgICAgICBvYmoubmFtZSA9IHByZWZpeCArICIvIiArIG9iai5uYW1lCisgICAgICAgIHJldHVybiBvYmoKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tdGFyZmlsZShjbHMsIHRhcmZpbGUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgVGFySW5mbyBvYmplY3QgZnJvbSBUYXJGaWxlIG9iamVjdAorICAgICAgICAgICB0YXJmaWxlLgogICAgICAgICAiIiIKLSAgICAgICAgYnVmID0gIiIKLSAgICAgICAgdHlwZSA9IHNlbGYudHlwZQotICAgICAgICBwcmVmaXggPSAiIgorICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgb2JqID0gY2xzLmZyb21idWYoYnVmKQorICAgICAgICBvYmoub2Zmc2V0ID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKSAtIEJMT0NLU0laRQorICAgICAgICByZXR1cm4gb2JqLl9wcm9jX21lbWJlcih0YXJmaWxlKQogCi0gICAgICAgIGlmIHNlbGYubmFtZS5lbmRzd2l0aCgiLyIpOgotICAgICAgICAgICAgdHlwZSA9IERJUlRZUEUKLQotICAgICAgICBpZiB0eXBlIGluIChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LKToKLSAgICAgICAgICAgICMgUHJldmVudCAiLi8uL0BMb25nTGluayIgZnJvbSBiZWluZyBub3JtYWxpemVkLgotICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSA9IG5vcm1wYXRoKHNlbGYubmFtZSkKLQotICAgICAgICBpZiB0eXBlID09IERJUlRZUEU6Ci0gICAgICAgICAgICAjIGRpcmVjdG9yaWVzIHNob3VsZCBlbmQgd2l0aCAnLycKLSAgICAgICAgICAgIG5hbWUgKz0gIi8iCi0KLSAgICAgICAgbGlua25hbWUgPSBzZWxmLmxpbmtuYW1lCi0gICAgICAgIGlmIGxpbmtuYW1lOgotICAgICAgICAgICAgIyBpZiBsaW5rbmFtZSBpcyBlbXB0eSB3ZSBlbmQgdXAgd2l0aCBhICcuJwotICAgICAgICAgICAgbGlua25hbWUgPSBub3JtcGF0aChsaW5rbmFtZSkKLQotICAgICAgICBpZiBwb3NpeDoKLSAgICAgICAgICAgIGlmIHNlbGYuc2l6ZSA+IE1BWFNJWkVfTUVNQkVSOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgdG9vIGxhcmdlICg+PSA4IEdCKSIpCi0KLSAgICAgICAgICAgIGlmIGxlbihzZWxmLmxpbmtuYW1lKSA+IExFTkdUSF9MSU5LOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxpbmtuYW1lIGlzIHRvbyBsb25nICg+JWQpIiAlIChMRU5HVEhfTElOSykpCi0KLSAgICAgICAgICAgIGlmIGxlbihuYW1lKSA+IExFTkdUSF9OQU1FOgotICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQotICAgICAgICAgICAgICAgIHdoaWxlIHByZWZpeCBhbmQgcHJlZml4Wy0xXSAhPSAiLyI6Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCi0KLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCi0gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KLQotICAgICAgICAgICAgICAgIGlmIG5vdCBwcmVmaXggb3IgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmciKQotCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiBsZW4oc2VsZi5saW5rbmFtZSkgPiBMRU5HVEhfTElOSzoKLSAgICAgICAgICAgICAgICBidWYgKz0gc2VsZi5fY3JlYXRlX2dudWxvbmcoc2VsZi5saW5rbmFtZSwgR05VVFlQRV9MT05HTElOSykKLQotICAgICAgICAgICAgaWYgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVsb25nKG5hbWUsIEdOVVRZUEVfTE9OR05BTUUpCi0KLSAgICAgICAgcGFydHMgPSBbCi0gICAgICAgICAgICBzdG4obmFtZSwgMTAwKSwKLSAgICAgICAgICAgIGl0bihzZWxmLm1vZGUgJiAwNzc3NywgOCwgcG9zaXgpLAotICAgICAgICAgICAgaXRuKHNlbGYudWlkLCA4LCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5naWQsIDgsIHBvc2l4KSwKLSAgICAgICAgICAgIGl0bihzZWxmLnNpemUsIDEyLCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5tdGltZSwgMTIsIHBvc2l4KSwKLSAgICAgICAgICAgICIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKLSAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICBzdG4oc2VsZi5saW5rbmFtZSwgMTAwKSwKLSAgICAgICAgICAgIHN0bihNQUdJQywgNiksCi0gICAgICAgICAgICBzdG4oVkVSU0lPTiwgMiksCi0gICAgICAgICAgICBzdG4oc2VsZi51bmFtZSwgMzIpLAotICAgICAgICAgICAgc3RuKHNlbGYuZ25hbWUsIDMyKSwKLSAgICAgICAgICAgIGl0bihzZWxmLmRldm1ham9yLCA4LCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5kZXZtaW5vciwgOCwgcG9zaXgpLAotICAgICAgICAgICAgc3RuKHByZWZpeCwgMTU1KQotICAgICAgICBdCi0KLSAgICAgICAgYnVmICs9IHN0cnVjdC5wYWNrKCIlZHMiICUgQkxPQ0tTSVpFLCAiIi5qb2luKHBhcnRzKSkKLSAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW1zKGJ1ZlstQkxPQ0tTSVpFOl0pWzBdCi0gICAgICAgIGJ1ZiA9IGJ1Zls6LTM2NF0gKyAiJTA2b1wwIiAlIGNoa3N1bSArIGJ1ZlstMzU3Ol0KLSAgICAgICAgc2VsZi5idWYgPSBidWYKLSAgICAgICAgcmV0dXJuIGJ1ZgotCi0gICAgZGVmIF9jcmVhdGVfZ251bG9uZyhzZWxmLCBuYW1lLCB0eXBlKToKLSAgICAgICAgIiIiQ3JlYXRlIGEgR05VIGxvbmduYW1lL2xvbmdsaW5rIGhlYWRlciBmcm9tIG5hbWUuCi0gICAgICAgICAgIEl0IGNvbnNpc3RzIG9mIGFuIGV4dGVuZGVkIHRhciBoZWFkZXIsIHdpdGggdGhlIGxlbmd0aAotICAgICAgICAgICBvZiB0aGUgbG9uZ25hbWUgYXMgc2l6ZSwgZm9sbG93ZWQgYnkgZGF0YSBibG9ja3MsCi0gICAgICAgICAgIHdoaWNoIGNvbnRhaW4gdGhlIGxvbmduYW1lIGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhCisgICAgIyBtZW1iZXIuIFRoZSBlbnRyeSBwb2ludCBpcyBfcHJvY19tZW1iZXIoKSB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhCisgICAgIyBzdWJjbGFzcyB0byBhZGQgY3VzdG9tIF9wcm9jXyooKSBtZXRob2RzLiBBIF9wcm9jXyooKSBtZXRob2QgTVVTVAorICAgICMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKyAgICAjIG9wZXJhdGlvbnM6CisgICAgIyAxLiBTZXQgc2VsZi5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAorICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0aGF0IGZvbGxvd3MuCisgICAgIyAyLiBTZXQgdGFyZmlsZS5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IG1lbWJlcidzIGhlYWRlciB3aWxsCisgICAgIyAgICBiZWdpbi4KKyAgICAjIDMuIFJldHVybiBzZWxmIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCisgICAgZGVmIF9wcm9jX21lbWJlcihzZWxmLCB0YXJmaWxlKToKKyAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgdGhlIHR5cGUgYW5kIGNhbGwgaXQuCiAgICAgICAgICIiIgotICAgICAgICBuYW1lICs9IE5VTAorICAgICAgICBpZiBzZWxmLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfZ251bG9uZyh0YXJmaWxlKQorICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX1NQQVJTRToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3NwYXJzZSh0YXJmaWxlKQorICAgICAgICBlbGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgWEdMVFlQRSwgU09MQVJJU19YSERUWVBFKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3BheCh0YXJmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfYnVpbHRpbih0YXJmaWxlKQogCi0gICAgICAgIHRhcmluZm8gPSBzZWxmLl9fY2xhc3NfXygpCi0gICAgICAgIHRhcmluZm8ubmFtZSA9ICIuLy4vQExvbmdMaW5rIgotICAgICAgICB0YXJpbmZvLnR5cGUgPSB0eXBlCi0gICAgICAgIHRhcmluZm8ubW9kZSA9IDAKLSAgICAgICAgdGFyaW5mby5zaXplID0gbGVuKG5hbWUpCisgICAgZGVmIF9wcm9jX2J1aWx0aW4oc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBidWlsdGluIHR5cGUgb3IgYW4gdW5rbm93biB0eXBlIHdoaWNoCisgICAgICAgICAgIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCisgICAgICAgIG9mZnNldCA9IHNlbGYub2Zmc2V0X2RhdGEKKyAgICAgICAgaWYgc2VsZi5pc3JlZygpIG9yIHNlbGYudHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCisgICAgICAgICAgICBvZmZzZXQgKz0gc2VsZi5fYmxvY2soc2VsZi5zaXplKQorICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAogCi0gICAgICAgICMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlcgotICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKCkKLSAgICAgICAgIyBjcmVhdGUgbmFtZSBibG9ja3MKLSAgICAgICAgYnVmICs9IG5hbWUKLSAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuKG5hbWUpLCBCTE9DS1NJWkUpCi0gICAgICAgIGlmIHJlbWFpbmRlciA+IDA6Ci0gICAgICAgICAgICBidWYgKz0gKEJMT0NLU0laRSAtIHJlbWFpbmRlcikgKiBOVUwKLSAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHNhdmVkIGV4dGVuZGVkCisgICAgICAgICMgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAgICBmb3Iga2V5d29yZCwgdmFsdWUgaW4gdGFyZmlsZS5wYXhfaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAgaWYga2V5d29yZCBpbiBQQVhfRklFTERTOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5d29yZCwgdmFsdWUpCisgICAgICAgICAgICBzZWxmLnBheF9oZWFkZXJzW2tleXdvcmRdID0gdmFsdWUKKworICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9wcm9jX2dudWxvbmcoc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGhvbGQgYSBHTlUgbG9uZ25hbWUKKyAgICAgICAgICAgb3IgbG9uZ2xpbmsgbWVtYmVyLgorICAgICAgICAiIiIKKyAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoc2VsZi5fYmxvY2soc2VsZi5zaXplKSkKKworICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciBhbmQgcHJvY2VzcyBpdC4KKyAgICAgICAgYiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKKyAgICAgICAgdCA9IHNlbGYuZnJvbWJ1ZihiKQorICAgICAgICB0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CisgICAgICAgIG5leHQgPSB0Ll9wcm9jX21lbWJlcih0YXJmaWxlKQorCisgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKKyAgICAgICAgIyB0aGUgbG9uZ25hbWUgaW5mb3JtYXRpb24uCisgICAgICAgIG5leHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR05BTUU6CisgICAgICAgICAgICBuZXh0Lm5hbWUgPSBidWYucnN0cmlwKE5VTCkKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9MT05HTElOSzoKKyAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBidWYucnN0cmlwKE5VTCkKKworICAgICAgICByZXR1cm4gbmV4dAorCisgICAgZGVmIF9wcm9jX3NwYXJzZShzZWxmLCB0YXJmaWxlKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIEdOVSBzcGFyc2UgaGVhZGVyIHBsdXMgZXh0cmEgaGVhZGVycy4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmCisgICAgICAgIHNwID0gX3JpbmdidWZmZXIoKQorICAgICAgICBwb3MgPSAzODYKKyAgICAgICAgbGFzdHBvcyA9IDAKKyAgICAgICAgcmVhbHBvcyA9IDAKKyAgICAgICAgIyBUaGVyZSBhcmUgNCBwb3NzaWJsZSBzcGFyc2Ugc3RydWN0cyBpbiB0aGUKKyAgICAgICAgIyBmaXJzdCBoZWFkZXIuCisgICAgICAgIGZvciBpIGluIHhyYW5nZSg0KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCisgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBvZmZzZXQgPiBsYXN0cG9zOgorICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKKyAgICAgICAgICAgIHNwLmFwcGVuZChfZGF0YShvZmZzZXQsIG51bWJ5dGVzLCByZWFscG9zKSkKKyAgICAgICAgICAgIHJlYWxwb3MgKz0gbnVtYnl0ZXMKKyAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcworICAgICAgICAgICAgcG9zICs9IDI0CisKKyAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNDgyXSkKKyAgICAgICAgb3JpZ3NpemUgPSBudGkoYnVmWzQ4Mzo0OTVdKQorCisgICAgICAgICMgSWYgdGhlIGlzZXh0ZW5kZWQgZmxhZyBpcyBnaXZlbiwKKyAgICAgICAgIyB0aGVyZSBhcmUgZXh0cmEgaGVhZGVycyB0byBwcm9jZXNzLgorICAgICAgICB3aGlsZSBpc2V4dGVuZGVkID09IDE6CisgICAgICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgICAgICBwb3MgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQorICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CisgICAgICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKKyAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCisgICAgICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcworICAgICAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcworICAgICAgICAgICAgICAgIHBvcyArPSAyNAorICAgICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNTA0XSkKKworICAgICAgICBpZiBsYXN0cG9zIDwgb3JpZ3NpemU6CisgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb3JpZ3NpemUgLSBsYXN0cG9zKSkKKworICAgICAgICBzZWxmLnNwYXJzZSA9IHNwCisKKyAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKKyAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhICsgc2VsZi5fYmxvY2soc2VsZi5zaXplKQorICAgICAgICBzZWxmLnNpemUgPSBvcmlnc2l6ZQorCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX3Byb2NfcGF4KHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJQcm9jZXNzIGFuIGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgYXMgZGVzY3JpYmVkIGluCisgICAgICAgICAgIFBPU0lYLjEtMjAwMS4KKyAgICAgICAgIiIiCisgICAgICAgICMgUmVhZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChzZWxmLl9ibG9jayhzZWxmLnNpemUpKQorCisgICAgICAgICMgQSBwYXggaGVhZGVyIHN0b3JlcyBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZm9yIGVpdGhlcgorICAgICAgICAjIHRoZSBmb2xsb3dpbmcgZmlsZSAoZXh0ZW5kZWQpIG9yIGFsbCBmb2xsb3dpbmcgZmlsZXMKKyAgICAgICAgIyAoZ2xvYmFsKS4KKyAgICAgICAgaWYgc2VsZi50eXBlID09IFhHTFRZUEU6CisgICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBheF9oZWFkZXJzID0gdGFyZmlsZS5wYXhfaGVhZGVycy5jb3B5KCkKKworICAgICAgICAjIEZpZWxkcyBpbiBQT1NJWC4xLTIwMDEgdGhhdCBhcmUgbnVtYmVycywgYWxsIG90aGVyIGZpZWxkcworICAgICAgICAjIGFyZSB0cmVhdGVkIGFzIFVURi04IHN0cmluZ3MuCisgICAgICAgIHR5cGVfbWFwcGluZyA9IHsKKyAgICAgICAgICAgICJhdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJjdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJtdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJ1aWQiOiAgICAgICAgICBpbnQsCisgICAgICAgICAgICAiZ2lkIjogICAgICAgICAgaW50LAorICAgICAgICAgICAgInNpemUiOiAgICAgICAgIGludAorICAgICAgICB9CisKKyAgICAgICAgIyBQYXJzZSBwYXggaGVhZGVyIGluZm9ybWF0aW9uLiBBIHJlY29yZCBsb29rcyBsaWtlIHRoYXQ6CisgICAgICAgICMgIiVkICVzPSVzXG4iICUgKGxlbmd0aCwga2V5d29yZCwgdmFsdWUpLiBsZW5ndGggaXMgdGhlIHNpemUKKyAgICAgICAgIyBvZiB0aGUgY29tcGxldGUgcmVjb3JkIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZiBhbmQKKyAgICAgICAgIyB0aGUgbmV3bGluZS4KKyAgICAgICAgcmVnZXggPSByZS5jb21waWxlKHIiKFxkKykgKFtePV0rKT0iLCByZS5VKQorICAgICAgICBwb3MgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBtYXRjaCA9IHJlZ2V4Lm1hdGNoKGJ1ZiwgcG9zKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGxlbmd0aCwga2V5d29yZCA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgICAgICBsZW5ndGggPSBpbnQobGVuZ3RoKQorICAgICAgICAgICAgdmFsdWUgPSBidWZbbWF0Y2guZW5kKDIpICsgMTptYXRjaC5zdGFydCgxKSArIGxlbmd0aCAtIDFdCisKKyAgICAgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLmRlY29kZSgidXRmOCIpCisgICAgICAgICAgICBrZXl3b3JkID0ga2V5d29yZC5lbmNvZGUodGFyZmlsZS5lbmNvZGluZykKKworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5kZWNvZGUoInV0ZjgiKQorICAgICAgICAgICAgaWYga2V5d29yZCBpbiB0eXBlX21hcHBpbmc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHR5cGVfbWFwcGluZ1trZXl3b3JkXSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKHRhcmZpbGUuZW5jb2RpbmcpCisKKyAgICAgICAgICAgIHBheF9oZWFkZXJzW2tleXdvcmRdID0gdmFsdWUKKyAgICAgICAgICAgIHBvcyArPSBsZW5ndGgKKworICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciB0aGF0IHdpbGwgYmUgcGF0Y2hlZCB3aXRoIHRoZQorICAgICAgICAjIHN1cHBsZW1lbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF4IGhlYWRlciAoZXh0ZW5kZWQKKyAgICAgICAgIyBvbmx5KS4KKyAgICAgICAgdCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKKworICAgICAgICBpZiBzZWxmLnR5cGUgIT0gWEdMVFlQRSBhbmQgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKKyAgICAgICAgICAgICMgdGhlIHBheCBoZWFkZXIncyBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih0LCBrZXl3b3JkLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCisgICAgICAgICAgICB0LnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMuY29weSgpCisKKyAgICAgICAgcmV0dXJuIHQKKworICAgIGRlZiBfYmxvY2soc2VsZiwgY291bnQpOgorICAgICAgICAiIiJSb3VuZCB1cCBhIGJ5dGUgY291bnQgYnkgQkxPQ0tTSVpFIGFuZCByZXR1cm4gaXQsCisgICAgICAgICAgIGUuZy4gX2Jsb2NrKDgzNCkgPT4gMTAyNC4KKyAgICAgICAgIiIiCisgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGNvdW50LCBCTE9DS1NJWkUpCisgICAgICAgIGlmIHJlbWFpbmRlcjoKKyAgICAgICAgICAgIGJsb2NrcyArPSAxCisgICAgICAgIHJldHVybiBibG9ja3MgKiBCTE9DS1NJWkUKIAogICAgIGRlZiBpc3JlZyhzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiBSRUdVTEFSX1RZUEVTCkBAIC0xMDQwLDEyICsxNDYyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZXMgKGlmIGRlYnVnID49IDApLiBJZiA+IDAsIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyZSBwYXNzZWQgdG8gdGhlIGNhbGxlciBhcyBleGNlcHRpb25zLgogCi0gICAgcG9zaXggPSBGYWxzZSAgICAgICAgICAgICAgICMgSWYgVHJ1ZSwgZ2VuZXJhdGVzIFBPU0lYLjEtMTk5MC1jb21wbGlhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlcyAobm8gR05VIGV4dGVuc2lvbnMhKQorICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUICAgICAjIFRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYW4gYXJjaGl2ZS4KIAotICAgIGZpbGVvYmplY3QgPSBFeEZpbGVPYmplY3QKKyAgICBlbmNvZGluZyA9IEVOQ09ESU5HICAgICAgICAgIyBUcmFuc2ZlciBVVEYtOCBzdHJpbmdzIGZyb20gUE9TSVguMS0yMDAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaGVhZGVycyB0byB0aGlzIGVuY29kaW5nLgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSk6CisgICAgdGFyaW5mbyA9IFRhckluZm8gICAgICAgICAgICMgVGhlIGRlZmF1bHQgVGFySW5mbyBjbGFzcyB0byB1c2UuCisKKyAgICBmaWxlb2JqZWN0ID0gRXhGaWxlT2JqZWN0ICAgIyBUaGUgZGVmYXVsdCBFeEZpbGVPYmplY3QgY2xhc3MgdG8gdXNlLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgZm9ybWF0PU5vbmUsCisgICAgICAgICAgICB0YXJpbmZvPU5vbmUsIGRlcmVmZXJlbmNlPU5vbmUsIGlnbm9yZV96ZXJvcz1Ob25lLCBlbmNvZGluZz1Ob25lLAorICAgICAgICAgICAgcGF4X2hlYWRlcnM9Tm9uZSwgZGVidWc9Tm9uZSwgZXJyb3JsZXZlbD1Ob25lKToKICAgICAgICAgIiIiT3BlbiBhbiAodW5jb21wcmVzc2VkKSB0YXIgYXJjaGl2ZSBgbmFtZScuIGBtb2RlJyBpcyBlaXRoZXIgJ3InIHRvCiAgICAgICAgICAgIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLCAnYScgdG8gYXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcKICAgICAgICAgICAgZmlsZSBvciAndycgdG8gY3JlYXRlIGEgbmV3IGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLiBgbW9kZScKQEAgLTEwNTQsNTggKzE0ODIsODYgQEAKICAgICAgICAgICAgY2FuIGJlIGRldGVybWluZWQsIGBtb2RlJyBpcyBvdmVycmlkZGVuIGJ5IGBmaWxlb2JqJ3MgbW9kZS4KICAgICAgICAgICAgYGZpbGVvYmonIGlzIG5vdCBjbG9zZWQsIHdoZW4gVGFyRmlsZSBpcyBjbG9zZWQuCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLmFic3BhdGgobmFtZSkKLQogICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJyYXciOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCi0gICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCi0gICAgICAgIHNlbGYubW9kZSA9IHsiciI6ICJyYiIsICJhIjogInIrYiIsICJ3IjogIndiIn1bbW9kZV0KKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLl9tb2RlID0geyJyIjogInJiIiwgImEiOiAicitiIiwgInciOiAid2IifVttb2RlXQogCiAgICAgICAgIGlmIG5vdCBmaWxlb2JqOgotICAgICAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAiYSIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm5hbWUpOgorICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJhIiBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgogICAgICAgICAgICAgICAgICMgQ3JlYXRlIG5vbmV4aXN0ZW50IGZpbGVzIGluIGFwcGVuZCBtb2RlLgotICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSAidyIKLSAgICAgICAgICAgICAgICBzZWxmLm1vZGUgPSAid2IiCi0gICAgICAgICAgICBmaWxlb2JqID0gX29wZW4oc2VsZi5uYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICAgICAgc2VsZi5tb2RlID0gInciCisgICAgICAgICAgICAgICAgc2VsZi5fbW9kZSA9ICJ3YiIKKyAgICAgICAgICAgIGZpbGVvYmogPSBfb3BlbihuYW1lLCBzZWxmLl9tb2RlKQogICAgICAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiBzZWxmLm5hbWUgaXMgTm9uZSBhbmQgaGFzYXR0cihmaWxlb2JqLCAibmFtZSIpOgotICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguYWJzcGF0aChmaWxlb2JqLm5hbWUpCisgICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmUgYW5kIGhhc2F0dHIoZmlsZW9iaiwgIm5hbWUiKToKKyAgICAgICAgICAgICAgICBuYW1lID0gZmlsZW9iai5uYW1lCiAgICAgICAgICAgICBpZiBoYXNhdHRyKGZpbGVvYmosICJtb2RlIik6Ci0gICAgICAgICAgICAgICAgc2VsZi5tb2RlID0gZmlsZW9iai5tb2RlCisgICAgICAgICAgICAgICAgc2VsZi5fbW9kZSA9IGZpbGVvYmoubW9kZQogICAgICAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IFRydWUKKyAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5hYnNwYXRoKG5hbWUpCiAgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKIAotICAgICAgICAjIEluaXQgZGF0YXN0cnVjdHVyZXMKKyAgICAgICAgIyBJbml0IGF0dHJpYnV0ZXMuCisgICAgICAgIGlmIGZvcm1hdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CisgICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnRhcmluZm8gPSB0YXJpbmZvCisgICAgICAgIGlmIGRlcmVmZXJlbmNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kZXJlZmVyZW5jZSA9IGRlcmVmZXJlbmNlCisgICAgICAgIGlmIGlnbm9yZV96ZXJvcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaWdub3JlX3plcm9zID0gaWdub3JlX3plcm9zCisgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIGlmIGRlYnVnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IGRlYnVnCisgICAgICAgIGlmIGVycm9ybGV2ZWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmVycm9ybGV2ZWwgPSBlcnJvcmxldmVsCisKKyAgICAgICAgIyBJbml0IGRhdGFzdHJ1Y3R1cmVzLgogICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCiAgICAgICAgIHNlbGYubWVtYmVycyA9IFtdICAgICAgICMgbGlzdCBvZiBtZW1iZXJzIGFzIFRhckluZm8gb2JqZWN0cwogICAgICAgICBzZWxmLl9sb2FkZWQgPSBGYWxzZSAgICAjIGZsYWcgaWYgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQKICAgICAgICAgc2VsZi5vZmZzZXQgPSAwICAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQogICAgICAgICBzZWxmLmlub2RlcyA9IHt9ICAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZSBtZW1iZXJzIGFscmVhZHkgYWRkZWQKKyAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9ICAgIyBzYXZlIGNvbnRlbnRzIG9mIGdsb2JhbCBwYXggaGVhZGVycwogCi0gICAgICAgIGlmIHNlbGYuX21vZGUgPT0gInIiOgorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInIiOgogICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IE5vbmUKICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBzZWxmLm5leHQoKQogCi0gICAgICAgIGlmIHNlbGYuX21vZGUgPT0gImEiOgorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImEiOgogICAgICAgICAgICAgIyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUsCiAgICAgICAgICAgICAjIGJlZm9yZSB0aGUgZmlyc3QgZW1wdHkgYmxvY2suCiAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQogICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBSZWFkRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKDApCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubmV4dCgpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYub2Zmc2V0ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKC0gQkxPQ0tTSVpFLCAxKQogICAgICAgICAgICAgICAgICAgICBicmVhawogCi0gICAgICAgIGlmIHNlbGYuX21vZGUgaW4gImF3IjoKKyAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CiAgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCiAKKyAgICAgICAgICAgIGlmIHBheF9oZWFkZXJzOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYudGFyaW5mby5jcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwYXhfaGVhZGVycy5jb3B5KCksIHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBsZW4oYnVmKQorCisgICAgZGVmIF9nZXRwb3NpeChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZm9ybWF0ID09IFVTVEFSX0ZPUk1BVAorICAgIGRlZiBfc2V0cG9zaXgoc2VsZiwgdmFsdWUpOgorICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgd2FybmluZ3Mud2FybigidXNlIHRoZSBmb3JtYXQgYXR0cmlidXRlIGluc3RlYWQiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIGlmIHZhbHVlOgorICAgICAgICAgICAgc2VsZi5mb3JtYXQgPSBVU1RBUl9GT1JNQVQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gR05VX0ZPUk1BVAorICAgIHBvc2l4ID0gcHJvcGVydHkoX2dldHBvc2l4LCBfc2V0cG9zaXgpCisKICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAjIEJlbG93IGFyZSB0aGUgY2xhc3NtZXRob2RzIHdoaWNoIGFjdCBhcyBhbHRlcm5hdGUgY29uc3RydWN0b3JzIHRvIHRoZQogICAgICMgVGFyRmlsZSBjbGFzcy4gVGhlIG9wZW4oKSBtZXRob2QgaXMgdGhlIG9ubHkgb25lIHRoYXQgaXMgbmVlZGVkIGZvcgpAQCAtMTExOCw3ICsxNTc0LDcgQEAKICAgICAjIGJ5IGFkZGluZyBpdCB0byB0aGUgbWFwcGluZyBpbiBPUEVOX01FVEguCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgb3BlbihjbHMsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgYnVmc2l6ZT0yMCo1MTIpOgorICAgIGRlZiBvcGVuKGNscywgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBidWZzaXplPVJFQ09SRFNJWkUsICoqa3dhcmdzKToKICAgICAgICAgIiIiT3BlbiBhIHRhciBhcmNoaXZlIGZvciByZWFkaW5nLCB3cml0aW5nIG9yIGFwcGVuZGluZy4gUmV0dXJuCiAgICAgICAgICAgIGFuIGFwcHJvcHJpYXRlIFRhckZpbGUgY2xhc3MuCiAKQEAgLTExNTEsOCArMTYwNyw4IEBACiAgICAgICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgc2F2ZWRfcG9zID0gZmlsZW9iai50ZWxsKCkKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsICJyIiwgZmlsZW9iaikKLSAgICAgICAgICAgICAgICBleGNlcHQgKFJlYWRFcnJvciwgQ29tcHJlc3Npb25FcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsICJyIiwgZmlsZW9iaiwgKiprd2FyZ3MpCisgICAgICAgICAgICAgICAgZXhjZXB0IChSZWFkRXJyb3IsIENvbXByZXNzaW9uRXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoc2F2ZWRfcG9zKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQpAQCAtMTE2OSw3ICsxNjI1LDcgQEAKICAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJXIiICUgY29tcHR5cGUpCi0gICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCBmaWxlbW9kZSwgZmlsZW9iaikKKyAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsIGZpbGVtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKIAogICAgICAgICBlbGlmICJ8IiBpbiBtb2RlOgogICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgifCIsIDEpCkBAIC0xMTgwLDI1ICsxNjM2LDI2IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQogCiAgICAgICAgICAgICB0ID0gY2xzKG5hbWUsIGZpbGVtb2RlLAotICAgICAgICAgICAgICAgICAgICBfU3RyZWFtKG5hbWUsIGZpbGVtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgIF9TdHJlYW0obmFtZSwgZmlsZW1vZGUsIGNvbXB0eXBlLCBmaWxlb2JqLCBidWZzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCiAgICAgICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgICAgIHJldHVybiB0CiAKICAgICAgICAgZWxpZiBtb2RlIGluICJhdyI6Ci0gICAgICAgICAgICByZXR1cm4gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaikKKyAgICAgICAgICAgIHJldHVybiBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKIAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmRpc2Nlcm5pYmxlIG1vZGUiKQogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHRhcm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lKToKKyAgICBkZWYgdGFyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAiIiIKICAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQotICAgICAgICByZXR1cm4gY2xzKG5hbWUsIG1vZGUsIGZpbGVvYmopCisgICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05KToKKyAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05LCAqKmt3YXJncyk6CiAgICAgICAgICIiIk9wZW4gZ3ppcCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICAiIiIKQEAgLTEyMTYsMTQgKzE2NzMsMTUgQEAKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwKLSAgICAgICAgICAgICAgICBnemlwLkd6aXBGaWxlKG5hbWUsIG1vZGUsIGNvbXByZXNzbGV2ZWwsIGZpbGVvYmopKQorICAgICAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaiksCisgICAgICAgICAgICAgICAgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgcmV0dXJuIHQKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBiejJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05KToKKyAgICBkZWYgYnoyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSwgKiprd2FyZ3MpOgogICAgICAgICAiIiJPcGVuIGJ6aXAyIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgICIiIgpAQCAtMTI0MSw3ICsxNjk5LDcgQEAKICAgICAgICAgICAgIGZpbGVvYmogPSBiejIuQloyRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsPWNvbXByZXNzbGV2ZWwpCiAKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmopCisgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBiemlwMiBmaWxlIikKICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCkBAIC0xMjY0LDcgKzE3MjIsNyBAQAogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIGlmIHNlbGYuX21vZGUgaW4gImF3IjoKKyAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CiAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKEJMT0NLU0laRSAqIDIpKQogICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gKEJMT0NLU0laRSAqIDIpCiAgICAgICAgICAgICAjIGZpbGwgdXAgdGhlIGVuZCB3aXRoIHplcm8tYmxvY2tzCkBAIC0xMzMwLDcgKzE3ODgsOCBAQAogCiAgICAgICAgICMgTm93LCBmaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoCiAgICAgICAgICMgaW5mb3JtYXRpb24gc3BlY2lmaWMgZm9yIHRoZSBmaWxlLgotICAgICAgICB0YXJpbmZvID0gVGFySW5mbygpCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8oKQorICAgICAgICB0YXJpbmZvLnRhcmZpbGUgPSBzZWxmCiAKICAgICAgICAgIyBVc2Ugb3Muc3RhdCBvciBvcy5sc3RhdCwgZGVwZW5kaW5nIG9uIHBsYXRmb3JtCiAgICAgICAgICMgYW5kIGlmIHN5bWxpbmtzIHNoYWxsIGJlIHJlc29sdmVkLgpAQCAtMTM0Niw4ICsxODA1LDggQEAKICAgICAgICAgc3RtZCA9IHN0YXRyZXMuc3RfbW9kZQogICAgICAgICBpZiBzdGF0LlNfSVNSRUcoc3RtZCk6CiAgICAgICAgICAgICBpbm9kZSA9IChzdGF0cmVzLnN0X2lubywgc3RhdHJlcy5zdF9kZXYpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5kZXJlZmVyZW5jZSBhbmQgXAotICAgICAgICAgICAgICAgICAgICBzdGF0cmVzLnN0X25saW5rID4gMSBhbmQgaW5vZGUgaW4gc2VsZi5pbm9kZXM6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kZXJlZmVyZW5jZSBhbmQgc3RhdHJlcy5zdF9ubGluayA+IDEgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgaW5vZGUgaW4gc2VsZi5pbm9kZXMgYW5kIGFyY25hbWUgIT0gc2VsZi5pbm9kZXNbaW5vZGVdOgogICAgICAgICAgICAgICAgICMgSXMgaXQgYSBoYXJkbGluayB0byBhbiBhbHJlYWR5CiAgICAgICAgICAgICAgICAgIyBhcmNoaXZlZCBmaWxlPwogICAgICAgICAgICAgICAgIHR5cGUgPSBMTktUWVBFCkBAIC0xNDI0LDcgKzE4ODMsNyBAQAogICAgICAgICAgICAgICAgIHByaW50KCIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiIFwKICAgICAgICAgICAgICAgICAgICAgICAlIHRpbWUubG9jYWx0aW1lKHRhcmluZm8ubXRpbWUpWzo2XSwgZW5kPScgJykKIAotICAgICAgICAgICAgcHJpbnQodGFyaW5mby5uYW1lLCBlbmQ9JyAnKQorICAgICAgICAgICAgcHJpbnQodGFyaW5mby5uYW1lICsgKCIvIiBpZiB0YXJpbmZvLmlzZGlyKCkgZWxzZSAiIiksIGVuZD0nICcpCiAKICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgpAQCAtMTQ1Niw3ICsxOTE1LDcgQEAKICAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgICBpZiBhcmNuYW1lID09ICIuIjoKICAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9ICIiCi0gICAgICAgICAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcigiLiIpOgorICAgICAgICAgICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGYsIG9zLnBhdGguam9pbihhcmNuYW1lLCBmKSkKICAgICAgICAgICAgIHJldHVybgogCkBAIC0xNDk1LDcgKzE5NTQsNyBAQAogCiAgICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKIAotICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKHNlbGYucG9zaXgpCisgICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoc2VsZi5mb3JtYXQsIHNlbGYuZW5jb2RpbmcpCiAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCiAKQEAgLTE1MjcsNyArMTk4Niw3IEBACiAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IGRpcmVjdG9yeSB3aXRoIGEgc2FmZSBtb2RlLCBzbyB0aGF0CiAgICAgICAgICAgICAgICAgIyBhbGwgZmlsZXMgYmVsb3cgY2FuIGJlIGV4dHJhY3RlZCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSksIDA3NzcpCisgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLm5hbWUpLCAwNzAwKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMuYXBwZW5kKHRhcmluZm8pCkBAIC0xNTU5LDEwICsyMDE4LDEwIEBACiAgICAgICAgICIiIgogICAgICAgICBzZWxmLl9jaGVjaygiciIpCiAKLSAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIFRhckluZm8pOgotICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgotICAgICAgICBlbHNlOgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgogCiAgICAgICAgICMgUHJlcGFyZSB0aGUgbGluayB0YXJnZXQgZm9yIG1ha2VsaW5rKCkuCiAgICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKToKQEAgLTE1OTUsMTAgKzIwNTQsMTAgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX2NoZWNrKCJyIikKIAotICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgVGFySW5mbyk6Ci0gICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCi0gICAgICAgIGVsc2U6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCiAKICAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iamVjdChzZWxmLCB0YXJpbmZvKQpAQCAtMTgxMSwyMCArMjI3MCwxMSBAQAogICAgICAgICAjIFJlYWQgdGhlIG5leHQgYmxvY2suCiAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQotICAgICAgICAgICAgaWYgbm90IGJ1ZjoKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdGFyaW5mbyA9IFRhckluZm8uZnJvbWJ1ZihidWYpCi0KLSAgICAgICAgICAgICAgICAjIFNldCB0aGUgVGFySW5mbyBvYmplY3QncyBvZmZzZXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCi0gICAgICAgICAgICAgICAgIyBUYXJGaWxlIGFuZCBzZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcwotICAgICAgICAgICAgICAgICMgc2hvdWxkIGJlZ2luLgotICAgICAgICAgICAgICAgIHRhcmluZm8ub2Zmc2V0ID0gc2VsZi5vZmZzZXQKLSAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKLQotICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnByb2NfbWVtYmVyKHRhcmluZm8pCisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQorICAgICAgICAgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQogCiAgICAgICAgICAgICBleGNlcHQgSGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKQEAgLTE4MzcsMTQ5ICsyMjg3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgICBicmVhawogCi0gICAgICAgICMgU29tZSBvbGQgdGFyIHByb2dyYW1zIHJlcHJlc2VudCBhIGRpcmVjdG9yeSBhcyBhIHJlZ3VsYXIKLSAgICAgICAgIyBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KLSAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIGFuZCB0YXJpbmZvLm5hbWUuZW5kc3dpdGgoIi8iKToKLSAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IERJUlRZUEUKLQotICAgICAgICAjIERpcmVjdG9yeSBuYW1lcyBzaG91bGQgaGF2ZSBhICcvJyBhdCB0aGUgZW5kLgotICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6Ci0gICAgICAgICAgICB0YXJpbmZvLm5hbWUgKz0gIi8iCi0KLSAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQotICAgICAgICByZXR1cm4gdGFyaW5mbwotCi0gICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIyBUaGUgZm9sbG93aW5nIGFyZSBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYQotICAgICMgbWVtYmVyLiBUaGUgZW50cnkgcG9pbnQgaXMgcHJvY19tZW1iZXIoKSB3aGljaCBpcyBjYWxsZWQgd2l0aCBhIFRhckluZm8KLSAgICAjIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIGhlYWRlciBibG9jayBmcm9tIHRoZSBjdXJyZW50IG9mZnNldC4gVGhlCi0gICAgIyBwcm9jX21lbWJlcigpIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzIHRvIGFkZCBjdXN0b20KLSAgICAjIHByb2NfKigpIG1ldGhvZHMuIEEgcHJvY18qKCkgbWV0aG9kIE1VU1QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKLSAgICAjIG9wZXJhdGlvbnM6Ci0gICAgIyAxLiBTZXQgdGFyaW5mby5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAotICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0aGF0IGZvbGxvd3MuCi0gICAgIyAyLiBTZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IG1lbWJlcidzIGhlYWRlciB3aWxsCi0gICAgIyAgICBiZWdpbi4KLSAgICAjIDMuIFJldHVybiB0YXJpbmZvIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCi0gICAgZGVmIHByb2NfbWVtYmVyKHNlbGYsIHRhcmluZm8pOgotICAgICAgICAiIiJDaG9vc2UgdGhlIHJpZ2h0IHByb2Nlc3NpbmcgbWV0aG9kIGZvciB0YXJpbmZvIGRlcGVuZGluZwotICAgICAgICAgICBvbiBpdHMgdHlwZSBhbmQgY2FsbCBpdC4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIHRhcmluZm8udHlwZSBpbiAoR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSyk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jX2dudWxvbmcodGFyaW5mbykKLSAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9TUEFSU0U6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jX3NwYXJzZSh0YXJpbmZvKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY19idWlsdGluKHRhcmluZm8pCi0KLSAgICBkZWYgcHJvY19idWlsdGluKHNlbGYsIHRhcmluZm8pOgotICAgICAgICAiIiJQcm9jZXNzIGEgYnVpbHRpbiB0eXBlIG1lbWJlciBvciBhbiB1bmtub3duIG1lbWJlcgotICAgICAgICAgICB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuCi0gICAgICAgICIiIgotICAgICAgICB0YXJpbmZvLm9mZnNldF9kYXRhID0gc2VsZi5vZmZzZXQKLSAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIG9yIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgotICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCi0gICAgICAgICAgICBzZWxmLm9mZnNldCArPSBzZWxmLl9ibG9jayh0YXJpbmZvLnNpemUpCi0gICAgICAgIHJldHVybiB0YXJpbmZvCi0KLSAgICBkZWYgcHJvY19nbnVsb25nKHNlbGYsIHRhcmluZm8pOgotICAgICAgICAiIiJQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCi0gICAgICAgICAgIG9yIGxvbmdsaW5rIG1lbWJlci4KLSAgICAgICAgIiIiCi0gICAgICAgIGJ1ZiA9ICIiCi0gICAgICAgIGNvdW50ID0gdGFyaW5mby5zaXplCi0gICAgICAgIHdoaWxlIGNvdW50ID4gMDoKLSAgICAgICAgICAgIGJsb2NrID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQotICAgICAgICAgICAgYnVmICs9IGJsb2NrCi0gICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKLSAgICAgICAgICAgIGNvdW50IC09IEJMT0NLU0laRQotCi0gICAgICAgICMgRmV0Y2ggdGhlIG5leHQgaGVhZGVyIGFuZCBwcm9jZXNzIGl0LgotICAgICAgICBiID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQotICAgICAgICB0ID0gVGFySW5mby5mcm9tYnVmKGIpCi0gICAgICAgIHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKLSAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCi0gICAgICAgIG5leHQgPSBzZWxmLnByb2NfbWVtYmVyKHQpCi0KLSAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgbmV4dCBoZWFkZXIgd2l0aAotICAgICAgICAjIHRoZSBsb25nbmFtZSBpbmZvcm1hdGlvbi4KLSAgICAgICAgbmV4dC5vZmZzZXQgPSB0YXJpbmZvLm9mZnNldAotICAgICAgICBpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9MT05HTkFNRToKLSAgICAgICAgICAgIG5leHQubmFtZSA9IGJ1Zi5yc3RyaXAoTlVMKQotICAgICAgICBlbGlmIHRhcmluZm8udHlwZSA9PSBHTlVUWVBFX0xPTkdMSU5LOgotICAgICAgICAgICAgbmV4dC5saW5rbmFtZSA9IGJ1Zi5yc3RyaXAoTlVMKQotCi0gICAgICAgIHJldHVybiBuZXh0Ci0KLSAgICBkZWYgcHJvY19zcGFyc2Uoc2VsZiwgdGFyaW5mbyk6Ci0gICAgICAgICIiIlByb2Nlc3MgYSBHTlUgc3BhcnNlIGhlYWRlciBwbHVzIGV4dHJhIGhlYWRlcnMuCi0gICAgICAgICIiIgotICAgICAgICBidWYgPSB0YXJpbmZvLmJ1ZgotICAgICAgICBzcCA9IF9yaW5nYnVmZmVyKCkKLSAgICAgICAgcG9zID0gMzg2Ci0gICAgICAgIGxhc3Rwb3MgPSAwCi0gICAgICAgIHJlYWxwb3MgPSAwCi0gICAgICAgICMgVGhlcmUgYXJlIDQgcG9zc2libGUgc3BhcnNlIHN0cnVjdHMgaW4gdGhlCi0gICAgICAgICMgZmlyc3QgaGVhZGVyLgotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNCk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQotICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgaWYgb2Zmc2V0ID4gbGFzdHBvczoKLSAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb2Zmc2V0IC0gbGFzdHBvcykpCi0gICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCi0gICAgICAgICAgICByZWFscG9zICs9IG51bWJ5dGVzCi0gICAgICAgICAgICBsYXN0cG9zID0gb2Zmc2V0ICsgbnVtYnl0ZXMKLSAgICAgICAgICAgIHBvcyArPSAyNAotCi0gICAgICAgIGlzZXh0ZW5kZWQgPSBvcmQoYnVmWzQ4Ml0pCi0gICAgICAgIG9yaWdzaXplID0gbnRpKGJ1Zls0ODM6NDk1XSkKLQotICAgICAgICAjIElmIHRoZSBpc2V4dGVuZGVkIGZsYWcgaXMgZ2l2ZW4sCi0gICAgICAgICMgdGhlcmUgYXJlIGV4dHJhIGhlYWRlcnMgdG8gcHJvY2Vzcy4KLSAgICAgICAgd2hpbGUgaXNleHRlbmRlZCA9PSAxOgotICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQotICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCi0gICAgICAgICAgICBwb3MgPSAwCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQotICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6Ci0gICAgICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKLSAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCi0gICAgICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcwotICAgICAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcwotICAgICAgICAgICAgICAgIHBvcyArPSAyNAotICAgICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNTA0XSkKLQotICAgICAgICBpZiBsYXN0cG9zIDwgb3JpZ3NpemU6Ci0gICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb3JpZ3NpemUgLSBsYXN0cG9zKSkKLQotICAgICAgICB0YXJpbmZvLnNwYXJzZSA9IHNwCi0KLSAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIHNlbGYub2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHRhcmluZm8uc2l6ZSkKLSAgICAgICAgdGFyaW5mby5zaXplID0gb3JpZ3NpemUKLQogICAgICAgICByZXR1cm4gdGFyaW5mbwogCiAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIyBMaXR0bGUgaGVscGVyIG1ldGhvZHM6CiAKLSAgICBkZWYgX2Jsb2NrKHNlbGYsIGNvdW50KToKLSAgICAgICAgIiIiUm91bmQgdXAgYSBieXRlIGNvdW50IGJ5IEJMT0NLU0laRSBhbmQgcmV0dXJuIGl0LAotICAgICAgICAgICBlLmcuIF9ibG9jayg4MzQpID0+IDEwMjQuCi0gICAgICAgICIiIgotICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChjb3VudCwgQkxPQ0tTSVpFKQotICAgICAgICBpZiByZW1haW5kZXI6Ci0gICAgICAgICAgICBibG9ja3MgKz0gMQotICAgICAgICByZXR1cm4gYmxvY2tzICogQkxPQ0tTSVpFCi0KICAgICBkZWYgX2dldG1lbWJlcihzZWxmLCBuYW1lLCB0YXJpbmZvPU5vbmUpOgogICAgICAgICAiIiJGaW5kIGFuIGFyY2hpdmUgbWVtYmVyIGJ5IG5hbWUgZnJvbSBib3R0b20gdG8gdG9wLgogICAgICAgICAgICBJZiB0YXJpbmZvIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludC4KQEAgLTIwMTIsOCArMjMyNCw4IEBACiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKLSAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5fbW9kZSBub3QgaW4gbW9kZToKLSAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImJhZCBvcGVyYXRpb24gZm9yIG1vZGUgJXIiICUgc2VsZi5fbW9kZSkKKyAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5tb2RlIG5vdCBpbiBtb2RlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiYmFkIG9wZXJhdGlvbiBmb3IgbW9kZSAlciIgJSBzZWxmLm1vZGUpCiAKICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICIiIlByb3ZpZGUgYW4gaXRlcmF0b3Igb2JqZWN0Lgo=