ZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2NvbW0uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2NvbW0uYwppbmRleCA1OTViODUyLi42Yzk5NWE5IDEwMDY0NAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9jb21tLmMKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvY29tbS5jCkBAIC0xNiw2ICsxNiwxNSBAQAogICBkZXN0LT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7CiB9CiAKK3ZhcmFyZ3Mgdm9pZCBzZW5kX2RlYnVnKG9iamVjdHxzdHJpbmcgd2l6LCBzdHJpbmcgbXNnLCBzdHJpbmcgbXNnX3ByZWZpeCkKK3sKKyAgaWYgKHN0cmluZ3Aod2l6KSkKKyAgICB3aXo9ZmluZF9wbGF5ZXIod2l6KTsKKyAgaWYgKG9iamVjdHAod2l6KSkKKyAgICAgIHdpei0+UmVjZWl2ZU1zZyhtc2csIE1UX0RFQlVHfE1TR19CU19MRUFWRV9MRlN8TVNHX0RPTlRfU1RPUkUsCisgICAgICAgICAgICAgICAgICAgICAgMCwgbXNnX3ByZWZpeCwgcHJldmlvdXNfb2JqZWN0KCkpOworfQorCiBzdGF0aWMgaW50IF9zaG91dF9maWx0ZXIoIG9iamVjdCBvYiwgc3RyaW5nIHBhdCApCiB7CiAgICAgc3RyaW5nICppZ25vcmU7CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRldWlkLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRldWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2YTc1OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldGV1aWQuYwpAQCAtMCwwICsxLDI2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0ZXVpZCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRldWlkKQorCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCitpbnQgc2V0ZXVpZChzdHJpbmcgc3RyKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgaWYgKCFzdHIpCisgICAgeworICAgICAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19FVUlELCAwKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGVmdW46OmNhbGxfZGlyZWN0KF9fTUFTVEVSX09CSkVDVF9fLCAidmFsaWRfc2V0ZXVpZCIsIG9iLCBzdHIpICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfRVVJRCwgc3RyKTsKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMKaW5kZXggMDRhMzEyYi4uYTFkOTg3YSAxMDA2NDQKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYwpAQCAtODcsNiArODcsNyBAQAogI2luY2x1ZGUgX19ESVJfXyJsaXZpbmdzLmMiCiAjaW5jbHVkZSBfX0RJUl9fImNvbW0uYyIKICNpbmNsdWRlIF9fRElSX18iZmlsZXMuYyIKKyNpbmNsdWRlIF9fRElSX18ic2V0ZXVpZC5jIgogCiAjZGVmaW5lIFRPICAgICAgICBlZnVuOjp0aGlzX29iamVjdCgpCiAjZGVmaW5lIFRJICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL1JFQURNRSBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzNDI5YS4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1zaW11bF9lZnVuIAotLS0tLS0tLS0tLSAKLURhcyBzaW11bF9lZnVuIE9iamVrdCAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1biBiZW51dHp0IGRpZSBEYXRlaWVuCi1pbiAvc2VjdXJlL3NpbXVsX2VmdW4uCi1JbSBWZXJ6ZWljaG5pcyAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUgaXN0IGVpbmUgU2ljaGVyaGVpdHNrb3BpZSB2b24gYWxsZW4gCi1EYXRlaWVuIGluIC9zZWN1cmUvc2ltdWxfZWZ1bi4KLQotRmFsbHMgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYyBuaWNodCBsYWRiYXIgaXN0LCB3aXJkIAotL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYyBhbHMgRXJzYXR6IHZlcnN1Y2h0LiBXZW5uIGF1Y2ggZGFzCi1uaWNodCBsYWRiYXIgaXN0LCBlcmZvbGd0IGVpbiBTaHV0ZG93biBkZXMgTXVkcy4KLQotQmVpIEFlbmRlcnVuZ2VuIHNvbGx0ZSBfenVlcnN0XyBkaWUgbm9ybWFsZSBzaW11bCBlZnVuIGVkaXRpZXJ0IHVuZAotYW5zY2hsaWVzc2VuZCB6ZXJzdG9lcnQvZW50bGFkZW4gd2VyZGVuLCB3b3JhdWZoaW4gc2llIGltcGxpeml0IGR1cmNoIGRlbgotRHJpdmVyIHVuZCBNYXN0ZXIgbmV1Z2VsYWRlbiB3aXJkLiBJc3QgZGllcyBlcmZvbGdyZWljaCB1bmQgZGllIG5ldWUKLXNpbXVsX2VmdW4gbGFldWZ0IChlcnN0IGRhbm4hKSBrb3BpZXJ0IG1hbiBkaWUgRGF0ZWllbiBhdXMgCi0vc2VjdXJlL3NpbXVsX2VmdW4gbmFjaCAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUuCi0KLURpZSBEYXRlaWVuIGhpZXIgc2luZCBtaXQgQXVzbmFobWUgZGVyIHNpbXVsX2VmdW4uYyBzZWxic3QgX25pY2h0XyBkYXp1IAotZ2VkYWNodCwgZ2VsYWRlbiB6dSB3ZXJkZW4uCi0KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2NvbW0uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2NvbW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiNTk4Yy4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9jb21tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+Ci0KLS8vIFNlbmRldCBhbiBhbGxlIE9iamVrdGUgaW4gcm9vbSB1bmQgcm9vbSBzZWxiZXIgZHVyY2ggQXVmcnVmIHZvbgotLy8gUmVjZWl2ZU1zZygpLgotdmFyYXJncyB2b2lkIHNlbmRfcm9vbShvYmplY3R8c3RyaW5nIHJvb20sIHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19hY3Rpb24sIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3QgKmV4Y2x1ZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBvcmlnaW4pCi17Ci0gIGlmIChzdHJpbmdwKHJvb20pKQotICAgIHJvb209bG9hZF9vYmplY3Qocm9vbSk7Ci0gIAotICBvcmlnaW4gfHw9IHByZXZpb3VzX29iamVjdCgpOwotICBvYmplY3QgKmRlc3QgPSBleGNsdWRlID8gYWxsX2ludmVudG9yeShyb29tKSAtIGV4Y2x1ZGUgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ludmVudG9yeShyb29tKTsKLQotICBkZXN0LT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7Ci0gIHJvb20tPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKLX0KLQotc3RhdGljIGludCBfc2hvdXRfZmlsdGVyKCBvYmplY3Qgb2IsIHN0cmluZyBwYXQgKQotewotICAgIHN0cmluZyAqaWdub3JlOwotCi0gICAgaWYgKCAhZW52aXJvbm1lbnQob2IpICkKLSAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBzaXplb2YoIHJlZ2V4cCggKHsgb2JqZWN0X25hbWUoIGVudmlyb25tZW50KG9iKSApIH0pLCBwYXQgKSApOwotfQotCi12YXJhcmdzIHZvaWQgc2hvdXQoIHN0cmluZyBzLCBtaXhlZCB3aGVyZSApewotICAgIG9iamVjdCAqdTsKLSAgICBzdHJpbmcgKnBmYWRlOwotCi0gICAgaWYgKCAhc2l6ZW9mKCB1ID0gdXNlcnMoKSAtICh7IHRoaXNfcGxheWVyKCkgfSkgKSApCi0gICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCAhd2hlcmUgKQotICAgICAgIHBmYWRlID0gKHsgIi8iIH0pOwotICAgIGVsc2UgaWYgKCBpbnRwKHdoZXJlKSApCi0gICAgICAgcGZhZGUgPQotICAgICAgICAgICAoeyBpbXBsb2RlKCBlZnVuOjpleHBsb2RlKCBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iIClbMC4uMl0sICIvIiApICsgIi8iIH0pOwotICAgIGVsc2UgaWYgKCBzdHJpbmdwKHdoZXJlKSApCi0gICAgICAgcGZhZGUgPSAoeyB3aGVyZSB9KTsKLSAgICBlbHNlCi0gICAgICAgcGZhZGUgPSB3aGVyZTsKLQotICAgIHUgPSBmaWx0ZXIoIHUsICJfc2hvdXRfZmlsdGVyIiwgTUUsIGltcGxvZGUoIHBmYWRlLCAifCIgKSApOwotICAgIHUtPlJlY2VpdmVNc2cocywgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfV1JBUHxNU0dfRE9OVF9TVE9SRSwKLSAgICAgICAgICAgICAgICAgIE1BX1NIT1VUX1NFRlVOLCAwLCBwcmV2aW91c19vYmplY3QoKSk7Ci19Ci0KLQotI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCi0vLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gY2F0KCkuCi0jZGVmaW5lIENBVF9NQVhfTElORVMgNTAKLXZhcmFyZ3MgaW50IGNhdChzdHJpbmcgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbnVtKQotewotICAgIGlmIChleHRlcm5fY2FsbCgpKQotICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotCi0gICAgaW50IG1vcmU7Ci0KLSAgICBpZiAobnVtIDwgMCB8fCAhdGhpc19wbGF5ZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIXN0YXJ0KQotICAgICAgICBzdGFydCA9IDE7Ci0KLSAgICBpZiAoIW51bSB8fCBudW0gPiBDQVRfTUFYX0xJTkVTKSB7Ci0gICAgICAgIG51bSA9IENBVF9NQVhfTElORVM7Ci0gICAgICAgIG1vcmUgPSBzaXplb2YocmVhZF9maWxlKGZpbGUsIHN0YXJ0K251bSwgMSkpOwotICAgIH0KLQotICAgIHN0cmluZyB0eHQgPSByZWFkX2ZpbGUoZmlsZSwgc3RhcnQsIG51bSk7Ci0gICAgaWYgKCF0eHQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKLQotICAgIGlmIChtb3JlKQotICAgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiKioqKipUUlVOQ0FURUQqKioqXG4iKTsKLQotICAgIHJldHVybiBzaXplb2YodHh0ICYgIlxuIik7Ci19Ci0jdW5kZWYgQ0FUX01BWF9MSU5FUwotI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCi0KLSNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgotLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIHRhaWwoKS4KLSNkZWZpbmUgVEFJTF9NQVhfQllURVMgMTAwMAotdmFyYXJncyBpbnQgdGFpbChzdHJpbmcgZmlsZSkKLXsKLSAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKLSAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLQotICAgIGlmICghc3RyaW5ncChmaWxlKSB8fCAhdGhpc19wbGF5ZXIoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBzdHJpbmcgdHh0ID0gcmVhZF9ieXRlcyhmaWxlLCAtKFRBSUxfTUFYX0JZVEVTICsgODApLCAoVEFJTF9NQVhfQllURVMgKyA4MCkpOwotICAgIC8vIHJlYWRfYnl0ZXMoKSByZXR1cm5zIDAgaWYgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGdpdmVuIGJ5Ci0gICAgLy8gcGFyYW1ldGVyICMyIGxpZXMgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0gICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSB0cnkgYW5kIHJlYWQgdGhlIGVudGlyZSBmaWxlLgotICAgIGlmICghc3RyaW5ncCh0eHQpICYmIGZpbGVfc2l6ZShmaWxlKSA8IFRBSUxfTUFYX0JZVEVTKzgwKQotICAgICAgdHh0ID0gcmVhZF9maWxlKGZpbGUpOwotICAgIC8vIEV4aXQgaWYgc3RpbGwgbm90aGluZyBjb3VsZCBiZSByZWFkLgotICAgIGlmICghc3RyaW5ncCh0eHQpKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBjdXQgb2ZmIGZpcnN0IChpbmNvbXBsZXRlKSBsaW5lCi0gICAgaW50IGluZGV4ID0gc3Ryc3RyKHR4dCwgIlxuIik7Ci0gICAgaWYgKGluZGV4ID4gLTEpIHsKLSAgICAgICAgaWYgKGluZGV4ICsgMSA8IHNpemVvZih0eHQpKQotICAgICAgICAgICAgdHh0ID0gdHh0W2luZGV4KzEuLl07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHR4dCA9ICIiOwotICAgIH0KLQotICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLSN1bmRlZiBUQUlMX01BWF9CWVRFUwotI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCi0KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwN2MyZi4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9kZWJ1Z19pbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIGRlYnVnX2luZm8oKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGVidWdfaW5mbykKLQotI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+Ci0jaW5jbHVkZSA8ZGVidWdfaW5mby5oPgotCi1taXhlZCBkZWJ1Z19pbmZvKGludCB3aGF0LCB2YXJhcmdzIG1peGVkKiBhcmdzKQotewotICAgIGlmIChzaXplb2YoYXJncykgPiAyKQotICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOwotCi0gICAgc3dpdGNoKHdoYXQpCi0gICAgewotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3IgZGVidWdfaW5mbygpLlxuIiwgd2hhdCkpOwotCi0gICAgICAgIGNhc2UgRElORk9fT0JKRUNUOgotICAgICAgICB7Ci0gICAgICAgICAgICBvYmplY3Qgb2I7Ci0KLSAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7Ci0gICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKLQotICAgICAgICAgICAgb2IgPSBhcmdzWzBdOwotICAgICAgICAgICAgcHJpbnRmKCJPX0hFQVJUX0JFQVQgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCkgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKLSAgICAgICAgICAgIHByaW50ZigiT19FTkFCTEVfQ09NTUFORFMgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gICAgICAgICAgICBwcmludGYoIk9fQ0xPTkUgICAgICAgICAgIDogJXNcbiIsIGVmdW46OmNsb25lcChvYikgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOwotICAgICAgICAgICAgcHJpbnRmKCJPX0RFU1RSVUNURUQgICAgICA6IEZBTFNFXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiT19TV0FQUEVEICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gICAgICAgICAgICBwcmludGYoIk9fT05DRV9JTlRFUkFDVElWRTogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKSA/ICJUUlVFIiA6ICJGQUxTRSIpOwotICAgICAgICAgICAgcHJpbnRmKCJPX1JFU0VUX1NUQVRFICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKLSAgICAgICAgICAgIHByaW50ZigiT19XSUxMX0NMRUFOX1VQICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApICAgID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gICAgICAgICAgICBwcmludGYoIk9fUkVQTEFDRUQgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCkgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOwotICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX3Jlc2V0ICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKSk7Ci0gICAgICAgICAgICBwcmludGYoInRpbWVfb2ZfcmVmIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKSk7Ci0gICAgICAgICAgICBwcmludGYoInJlZiAgICAgICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUykpOwotCi0gICAgICAgICAgICBpbnQgZ3RpY2tzID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7Ci0gICAgICAgICAgICBpZihndGlja3MpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkJTA5ZFxuIiwgZ3RpY2tzLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWRcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7Ci0KLSAgICAgICAgICAgIHByaW50Zigic3dhcF9udW0gICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKSk7Ci0gICAgICAgICAgICBwcmludGYoIm5hbWUgICAgICAgIDogJyVzJ1xuIiwgICAgIGVmdW46Om9iamVjdF9uYW1lKG9iKSk7Ci0gICAgICAgICAgICBwcmludGYoImxvYWRfbmFtZSAgIDogJyVzJ1xuIiwgICAgIGVmdW46OmxvYWRfbmFtZShvYikpOwotCi0gICAgICAgICAgICBvYmplY3QgbmV4dF9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7Ci0gICAgICAgICAgICBpZiAobmV4dF9vYikKLSAgICAgICAgICAgICAgICBwcmludGYoIm5leHRfYWxsICAgIDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUobmV4dF9vYikpOwotCi0gICAgICAgICAgICBvYmplY3QgcHJldl9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7Ci0gICAgICAgICAgICBpZiAocHJldl9vYikKLSAgICAgICAgICAgICAgICBwcmludGYoIlByZXZpb3VzIG9iamVjdCBpbiBvYmplY3QgbGlzdDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUocHJldl9vYikpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50ZigiVGhpcyBvYmplY3QgaXMgdGhlIGhlYWQgb2YgdGhlIG9iamVjdCBsaXN0LlxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRElORk9fTUVNT1JZOgotICAgICAgICB7Ci0gICAgICAgICAgICBvYmplY3Qgb2I7Ci0KLSAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7Ci0gICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKLQotICAgICAgICAgICAgb2IgPSBhcmdzWzBdOwotCi0gICAgICAgICAgICBwcmludGYoInByb2dyYW0gcmVmJ3MgJTNkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpKTsKLSAgICAgICAgICAgIHByaW50ZigiTmFtZTogJyVzJ1xuIiwgICAgICAgICAgZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKSk7Ci0gICAgICAgICAgICBwcmludGYoInByb2dyYW0gc2l6ZSAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpKTsKLSAgICAgICAgICAgIHByaW50ZigibnVtIGZ1bmMnczogICUzZCAoJTRkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpKTsKLSAgICAgICAgICAgIHByaW50ZigibnVtIHZhcnM6ICAgICUzZCAoJTRkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpKTsKLQotICAgICAgICAgICAgcHJpbnRmKCJudW0gc3RyaW5nczogJTNkICglNGQpIDogb3ZlcmhlYWQgJWQgKyBkYXRhICVkICglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpICsgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCkpOwotCi0gICAgICAgICAgICBwcmludGYoIm51bSBpbmhlcml0cyAlM2QgKCU0ZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKSk7Ci0KLSAgICAgICAgICAgIHByaW50ZigidG90YWwgc2l6ZSAgICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCkpOwotCi0gICAgICAgICAgICBwcmludGYoImRhdGEgc2l6ZSAgICAgICAlNmQgKCU2ZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBESU5GT19PQkpMSVNUOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDApCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOwotCi0gICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ICogb2JzID0gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCAxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JzWzBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIGFyZ3NbMV0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIERJTkZPX01BTExPQzoKLSAgICAgICAgICAgIHdyaXRlKGRlYnVnX2luZm8oRElORk9fU1RBVFVTLCAibWFsbG9jIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBESU5GT19TVEFUVVM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyB3aGljaDsKLSAgICAgICAgICAgIGludCBvcHQ7Ci0KLSAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQotICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKLQotICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykgfHwgIWFyZ3NbMF0pCi0gICAgICAgICAgICAgICAgd2hpY2ggPSAiIjsKLSAgICAgICAgICAgIGVsc2UgaWYoc3RyaW5ncChhcmdzWzBdKSkKLSAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKLQotICAgICAgICAgICAgc3dpdGNoKHdoaWNoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgIiI6Ci0gICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICJ0YWJsZXMiOgotICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAic3dhcCI6Ci0gICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIjoKLSAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6Ci0gICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKG9wdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIERJTkZPX0RVTVA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBvcHQ7Ci0KLSAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQotICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKLQotICAgICAgICAgICAgaWYoIXN0cmluZ3AoYXJnc1swXSkpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKLQotICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAib2JqZWN0cyI6Ci0gICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgImRlc3RydWN0ZWQiOgotICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUU19ERVNUUlVDVEVEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgIm9wY29kZXMiOgotICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT1BDT0RFUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICJtZW1vcnkiOgotICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfTUVNT1JZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAnJXMnIHRvIGRlYnVnX2luZm8oRElORk9fRFVNUCkuXG4iLCBhcmdzWzBdKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhvcHQsIGFyZ3NbMS4uMV0uLi4pOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBESU5GT19EQVRBOgotICAgICAgICB7Ci0gICAgICAgICAgICBtaXhlZCAqIHJlc3VsdDsKLQotICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOwotCi0gICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKLQotICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQotICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDMgdG8gZGVidWdfaW5mbygpLlxuIik7Ci0KLSAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgRElEX1NUQVRVUzoKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NUQVRVU19NQVgpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BQ1RJT05TKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BQ1RJT05TKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NIQURPV1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NIQURPV1MpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBQRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0xJU1RdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fTElTVCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ORVdMWV9ERVNUXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX05FV0xZX0RFU1RSVUNURUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfREVTVFJVQ1RFRF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ERVNUUlVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1BST0NFU1NFRF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTEFTVF9QUk9DRVNTRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfQVZHX1BST0NdICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX09CSkVDVFNfUkVMQVRJVkUpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX1RBQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0xPVFNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVF9UQUJMRV9TTE9UUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUX1RBQkxFKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX09CSlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfQUNUSVZFX0NZQ0xFUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNfVE9UQUxdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TTE9UU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0hFQVJUQkVBVFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1BST0NFU1NFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUU19MQVNUX1BST0NFU1NFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQVZHX1BST0NdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfSEVBUlRCRUFUU19SRUxBVElWRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9DQUxMT1VUUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FSUkFZUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQVJSQVlTKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01BUFBJTkdTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IWUJSSURfTUFQUElOR1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hZQlJJRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEFTSF9NQVBQSU5HU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IQVNIKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RfVFlQRVMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU19TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVF9UWVBFUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQUEVEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBfU0laRV0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVVNFUl9SRVNFUlZFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1VTRVIpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BU1RFUl9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9NQVNURVIpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NZU1RFTV9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9TWVNURU0pOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUREX01FU1NBR0VdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRVNTQUdFU19PVVQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19PVVQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTX0lOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfSU4pOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFX0lOXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfSU4pOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFldICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV9ISVRTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTF9ISVRTKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVklSVFVBTF9TVFJJTkdTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfVEFCTEVfU0laRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfVEFCTEUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9PVkVSSEVBRF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19PVkVSSEVBRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1VOVEFCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1VOVEFCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVEFCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1RBQkxFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNfQllWQUxVRV0gID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOX0JZVkFMVUVdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DSEFJTlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NMT1RTX1VTRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9BRERFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfQURERUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9ERUxFVEVEXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfUkVNT1ZFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NPTExJU0lPTlNdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfQ09MTElTSU9OUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EX0JZVkFMVUVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9WQUxVRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9DQUNIRURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX1RBQkxFX1NMT1RTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRUdFWCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRVUVTVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfRk9VTkRdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9ISVRTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfQ09MTF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9DT0xMSVNJT05TKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX0ZJTEVdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9TV0FQXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfU1dBUCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9CT09UX1RJTUVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfQk9PVF9USU1FKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERJRF9TV0FQOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1dBUF9NQVgpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VOU1dBUFBFRF0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1VOU1dBUFBFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfVU5TV0FQUEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJTXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSX1NJWkVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX0ZSRUUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZJTEVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRVVTRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19SRVVTRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSEVTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIX0xFTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBfU1RFUFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIRVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSF9MRU5dICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQX1NURVBTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19DT01QQUNUXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRENfU1dBUF9DT01QQUNUX01PREUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFQ1lDTEVfRlJFRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TV0FQX1JFQ1lDTEVfUEhBU0UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgRElEX01FTU9SWToKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX01FTU9SWV9NQVgpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX05BTUVdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9BTExPQ0FUT1JfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1lTX0FMTE9DQVRFRF9CTE9DS1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfRlJFRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0ZSRUUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX1dBU1RFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfV0FTVEUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tfQ0hVTktTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19DSFVOS1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfRlJFRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0ZSRUUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX1dBU1RFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfV0FTVEUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NVQ0NFU1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTF9TVUNDRVNTRVMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0lOQ1JFTUVOVF9TSVpFX0NBTExfRElGRlMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVU5NQU5BR0VEX0JMT0NLUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1fU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfVU5NQU5BR0VEX0JMT0NLUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX09WRVJIRUFEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfT1ZFUkhFQUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BTExPQ0FURURdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX09WRVJIRUFEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVVNFRF0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1RPVEFMX1VOVVNFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VOVVNFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX0ZVTEwpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNfUkVRXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19SRVFfU1VDQ0VTU10gICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExfVEFSR0VUX0hJVFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX0lOU1BFQ1RFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfSU5TUEVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19NRVJHRURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX01FUkdFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfUkVTVUxUXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19SRVNVTFRJTkcpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BVkxfTk9ERVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlJFRV9CTE9DS1NfQVZMX05PREVTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fRVhUX1NUQVRJU1RJQ1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0VYVEVOREVEX1NUQVRJU1RJQ1MpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpZHggPSBhcmdzWzBdOwotICAgICAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKLSAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3IgZGVidWdfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBESU5GT19UUkFDRToKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHdoaWNoID0gRElUX0NVUlJFTlQ7Ci0KLSAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQotICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKLSAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQotICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOwotICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoICh3aGljaCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVCk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERJVF9FUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOwotCi0gICAgICAgICAgICAgICAgY2FzZSBESVRfVU5DQVVHSFRfRVJST1I6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX1VOQ0FVR0hUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKLQotICAgICAgICAgICAgICAgIGNhc2UgRElUX1NUUl9DVVJSRU5UOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9BU19TVFJJTkcpOwotCi0gICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVF9ERVBUSDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfREVQVEgpOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBESU5GT19FVkFMX05VTUJFUjoKLSAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9FVkFMX05VTUJFUik7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWM5NjMuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIGVuYWJsZV9jb21tYW5kcygpCi0gKiBhbmQgZGlzYWJsZV9jb21tYW5kcygpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhlbmFibGVfY29tbWFuZHMpCi0KLXZvaWQgZW5hYmxlX2NvbW1hbmRzKCkKLXsKLSAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKLQotICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDEpOwotICAgIGVmdW46OnNldF90aGlzX3BsYXllcihvYik7Ci19Ci0KLSNlbmRpZgotCi0jaWYgISBfX0VGVU5fREVGSU5FRF9fKGRpc2FibGVfY29tbWFuZHMpCi0KLXZvaWQgZGlzYWJsZV9jb21tYW5kcygpCi17Ci0gICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7Ci0KLSAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAwKTsKLSAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIoMCk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvaGFzaC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWJiZjYwLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2hhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpbmNsdWRlICIvc3lzL3Rscy5oIgotCi1kZXByZWNhdGVkIHN0cmluZyBtZDUobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQotewotICAgIGlmIChleHRlcm5fY2FsbCgpKQotICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLQotICAgIHJldHVybiBoYXNoKFRMU19IQVNIX01ENSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKLX0KLQotZGVwcmVjYXRlZCBzdHJpbmcgc2hhMShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCi17Ci0gICAgaWYgKGV4dGVybl9jYWxsKCkpCi0gICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotCi0gICAgcmV0dXJuIGhhc2goVExTX0hBU0hfU0hBMSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKLX0KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2xpdmluZ3MuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2xpdmluZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwZmNlZS4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9saXZpbmdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLy8gKiBsaXZpbmdfbmFtZS1CZWhhbmRsdW5nCi0KLSNkZWZpbmUgY2xlYW5fbG9nKHMpCi0vLyNkZWZpbmUgY2xlYW5fbG9nKHMpIGxvZ19maWxlKCJDTEVBTl9TSU0iLGN0aW1lKHRpbWUoKSlbNC4uMThdKyI6ICIrKHMpKTsKLQotcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsaXZpbmdfbmFtZV9tLCBuYW1lX2xpdmluZ19tLCBuZXRkZWFkOwotCi1wcml2YXRlIHZvaWQgSW5pdExpdmluZ0RhdGEobWl4ZWQgd2l6aW5mbykgewotICAvLyBsaXZpbmdfbmFtZSBpc3QgZWluIFBvaW50ZXIgZGVyIGF1Y2ggaW4gZGVyIGV4dHJhX3dpemluZm8gZ2VoYWx0ZW4gCi0gIC8vIHdpcmQsIHNvIGthbm4gZGllIHNpbXVsX2VmdW4gbmV1IGdlbGFkZW4gd2VyZGVuLCBvaG5lIGRhc3MgZGllc2VzCi0gIC8vIE1hcHBpbmcgdmVybG9yZW4gZ2VodAotICBpZiAoIW1hcHBpbmdwKGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSkpCi0gICAgbGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdID0gbV9hbGxvY2F0ZSgwLCAxKTsKLQotICAvLyBHbGVpY2hlcyBnaWx0IGZ1ZXIgZGFzIE1hcHBpbmcgTmFtZS1MaXZpbmcKLSAgaWYgKCFtYXBwaW5ncChuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10pKQotICAgIG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSA9IG1fYWxsb2NhdGUoMCwgMSk7Ci0KLSAgLy8gTmV0enRvdGUgc2luZCBlYmVuZmFsbHMgaW4gZGVyIGV4dHJhX3dpemluZm8KLSAgaWYgKCFtYXBwaW5ncChuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0pKQotICAgIG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSA9IChbXSk7Ci19Ci0KLXB1YmxpYyB2YXJhcmdzIHN0cmluZyBnZXR1dWlkKCBvYmplY3Qgb2IgKQotewotICAgIG1peGVkICpyZXQ7Ci0KLSAgICBpZiAoICFvYmplY3RwKG9iKSApCi0gICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKLQotICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICkKLSAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKLQotICAgIHJldCA9IChtaXhlZCltYXN0ZXIoKS0+Z2V0X3VzZXJpbmZvKCBnZXR1aWQob2IpICk7Ci0KLSAgICBpZiAoICFwb2ludGVycChyZXQpIHx8IHNpemVvZihyZXQpIDwgNSApCi0gICAgICAgcmV0dXJuIGdldHVpZChvYik7Ci0KLSAgICAvLyBVc2VybmFtZSArICJfIiArIENyZWF0aW9uRGF0ZQotICAgIHJldHVybiByZXRbMF0gKyAiXyIgKyByZXRbNV07Ci19Ci0KLXZvaWQgc2V0X29iamVjdF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSwgb2JqZWN0IG9iaikKLXsKLSAgc3RyaW5nIG9sZDsKLSAgbWl4ZWQgYTsKLSAgaW50IGk7Ci0KLSAgaWYgKHByZXZpb3VzX29iamVjdCgpPT1vYmogfHwgcHJldmlvdXNfb2JqZWN0KCk9PXRoaXNfb2JqZWN0KCkgfHwKLSAgICAgIHByZXZpb3VzX29iamVjdCgpPT1tYXN0ZXIoKSkKLSAgewotICAgIGlmKCFsaXZuYW1lIHx8ICFzdHJpbmdwKGxpdm5hbWUpKSB7Ci0gICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiJU86IGlsbGVnYWwgbGl2aW5nIG5hbWU6ICVPXG4iLCBvYmosIGxpdm5hbWUpKTsKLSAgICB9Ci0gICAgaWYgKG9sZCA9IGxpdmluZ19uYW1lX21bb2JqXSkgewotICAgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW29sZF0pKSB7Ci0gICAgICAgYVttZW1iZXIoYSwgb2JqKV0gPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBvbGQpOwotICAgICAgfQotICAgIH0KLSAgICBsaXZpbmdfbmFtZV9tW29ial0gPSBsaXZuYW1lOwotICAgIGlmIChhID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkgewotICAgICAgaWYgKCFwb2ludGVycChhKSkgewotICAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSAoe2EsIG9ian0pOwotICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIC8qIFRyeSB0byByZWFsbG9jYXRlIGVudHJ5IGZyb20gZGVzdHJ1Y3RlZCBvYmplY3QgKi8KLSAgICAgIGlmICgoaSA9IG1lbWJlcihhLCAwKSkgPj0gMCkgewotICAgICAgIGFbaV0gPSBvYmo7Ci0gICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IGEgKyAoe29ian0pOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gb2JqOwotICB9Ci19Ci0KLXZvaWQgc2V0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lKQotewotICBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKGxpdm5hbWUscHJldmlvdXNfb2JqZWN0KCkpOwotfQotCi12b2lkIHJlbW92ZV9saXZpbmdfbmFtZSgpCi17Ci0gIHN0cmluZyBsaXZuYW1lOwotCi0gIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCi0gICAgcmV0dXJuOwotICBpZiAobGl2bmFtZT1saXZpbmdfbmFtZV9tW3ByZXZpb3VzX29iamVjdCgpXSkKLSAgewotICAgIG1fZGVsZXRlKGxpdmluZ19uYW1lX20scHJldmlvdXNfb2JqZWN0KCkpOwotICAgIGlmIChvYmplY3RwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQotICAgIHsKLSAgICAgIGlmIChuYW1lX2xpdmluZ19tW2xpdm5hbWVdPT1wcmV2aW91c19vYmplY3QoKSkKLSAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocG9pbnRlcnAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCi0gICAgewotICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXS09KHtwcmV2aW91c19vYmplY3QoKX0pOwotICAgICAgaWYgKCFzaXplb2YobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCi0gICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBfc2V0X25ldGRlYWQoKQotewotICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCi0gICAgbmV0ZGVhZFtnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpXT1wcmV2aW91c19vYmplY3QoKTsKLX0KLQotdm9pZCBfcmVtb3ZlX25ldGRlYWQoKQotewotICBtX2RlbGV0ZShuZXRkZWFkLGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOwotfQotCi1vYmplY3QgZmluZF9uZXRkZWFkKHN0cmluZyB1dWlkKQotewotICBpbnQgaTsKLSAgc3RyaW5nIHVpZDsKLSAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KLSAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOwotICBpZiAoIWlzX3V1aWQpCi0gICAgdWlkID0gdXVpZDsKLSAKLSAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChuZXRkZWFkW3VpZF0pICE9IHV1aWQpCi0gICAgICByZXR1cm4gMDsKLQotICByZXR1cm4gbmV0ZGVhZFt1aWRdOwotfQotCi1zdHJpbmcgKmR1bXBfbmV0ZGVhZCgpCi17Ci0gIHJldHVybiBtX2luZGljZXMobmV0ZGVhZCk7Ci19Ci0KLW9iamVjdCBmaW5kX2xpdmluZyhzdHJpbmcgbGl2bmFtZSkgewotICBtaXhlZCAqYSwgcjsKLSAgaW50IGk7Ci0KLSAgaWYgKHBvaW50ZXJwKHIgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkgewotICAgIGlmIChtZW1iZXIociwwKT49MCkKLSAgICAgIHItPSh7MH0pOwotICAgIGlmICghc2l6ZW9mKHIpKXsKLSAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7Ci0gICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9saXZpbmcgbG9lc2NodCAlc1xuIixsaXZuYW1lKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCAhbGl2aW5nKHIgPSAoYSA9IHIpWzBdKSkgewotICAgICAgZm9yIChpID0gc2l6ZW9mKGEpOyAtLWk7KSB7Ci0gICAgICAgaWYgKGxpdmluZyhhWzxpXSkpIHsKLSAgICAgICAgIHIgPSBhWzxpXTsKLSAgICAgICAgIGFbPGldID0gYVswXTsKLSAgICAgICAgIHJldHVybiBhWzBdID0gcjsKLSAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByOwotICB9Ci0gIHJldHVybiBsaXZpbmcocikgJiYgcjsKLX0KLQotb2JqZWN0ICpmaW5kX2xpdmluZ3Moc3RyaW5nIGxpdm5hbWUpCi17Ci0gIG1peGVkIHI7Ci0KLSAgaWYgKHBvaW50ZXJwKHI9bmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCi0gICAgci09KHswfSk7Ci0gIGVsc2UKLSAgICBpZiAob2JqZWN0cChyKSkKLSAgICAgIHI9KHtyfSk7Ci0gIGlmICghcG9pbnRlcnAocil8fCFzaXplb2YocikpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiByOwotfQotCi1vYmplY3QgZmluZF9wbGF5ZXIoc3RyaW5nIHV1aWQpIHsKLSAgb2JqZWN0ICpvYmpzOwotICBtaXhlZCByZXM7Ci0gIGludCBpOwotICBzdHJpbmcgdWlkOwotCi0gIGlmICghc3RyaW5ncCh1dWlkKSkKLSAgICByZXR1cm4gMDsKLSAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KLSAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOwotICBpZiAoIWlzX3V1aWQpCi0gICAgdWlkID0gdXVpZDsKLQotICBpZiAocG9pbnRlcnAocmVzID0gbmFtZV9saXZpbmdfbVt1aWRdKSkgewotICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSBnZ2YuIGVudGZlcm5lbgotICAgIGlmIChtZW1iZXIocmVzLDApPj0wKSB7Ci0gICAgICByZXMtPSh7MH0pOwotICAgICAgbmFtZV9saXZpbmdfbVt1aWRdID0gcmVzOwotICAgIH0KLSAgICAvLyBnZ2YuIE5hbWVuIG9obmUgT2JqZWt0ZSBlbnRmZXJuZW4uCi0gICAgaWYgKCFzaXplb2YocmVzKSl7Ci0gICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLHVpZCk7Ci0gICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9wbGF5ZXIgbG9lc2NodCAlc1xuIix1aWQpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBvYmpzID0gcmVzOwotICAgIHJlcyA9IG9ianNbMF07Ci0gICAgLy8gV2VubiBkYXMgMC4gRWxlbWVudCBkZXIgU3BpZWxlciBpc3QsIHNpbmQgd2lyIGZlcnRpZy4gQW5zb25zdGVuIHN1Y2hlbgotICAgIC8vIHdpciBkZW4gU3BpZWxlciB1bmQgc2NoaWViZW4gaWhuIGFuIGRpZSAwLiBTdGVsbGUgaW0gQXJyYXkuCi0gICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSB7Ci0gICAgICBmb3IgKGkgPSBzaXplb2Yob2Jqcyk7IC0taTspIHsKLSAgICAgICBpZiAob2Jqc1s8aV0gJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmpzWzxpXSkpIHsKLSAgICAgICAgIHJlcyA9IG9ianNbPGldOwotICAgICAgICAgb2Jqc1s8aV0gPSBvYmpzWzBdOwotICAgICAgICAgb2Jqc1swXSA9IHJlczsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJlcyA9IChvYmplY3RwKHJlcykgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSA/IHJlcyA6IDA7Ci0gICAgfQotICAgIC8vIGVsc2U6IGluIHJlcyBzdGVodCBkZXIgU3BpZWxlciBzY2hvbi4KLSAgfQotICBlbHNlIGlmIChvYmplY3RwKHJlcykpIC8vIHIgaXN0IG5lbiBFaW56ZWxvYmpla3QKLSAgICByZXMgPSBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykgPyByZXMgOiAwOwotCi0gIC8vIHJlcyBpc3QgamV0enQgZ2dmLiBkZXIgU3BpZWxlci4gQWJlciB3ZW5uIGRlciBuZSBhbmRlcmUgYWxzIGRpZSBnZXN1Y2h0ZQotICAvLyBVVUlEIGhhdCwgaXN0IGRhcyBFcmdlYm5pcyB0cm90emRlbSAwLgotICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKHJlcykhPXV1aWQpCi0gICAgICByZXR1cm4gMDsKLQotICAvLyBlbmRsaWNoIGdlZnVuZGVuCi0gIHJldHVybiByZXM7Ci19Ci0KLXByaXZhdGUgaW50IGNoZWNrX21hdGNoKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5ICkKLXsKLSAgICBtaXhlZCBtYXRjaDsKLQotICAgIGlmICggIShtYXRjaCA9IG5hbWVfbGl2aW5nX21bc3RyXSkgKQotICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCAhcG9pbnRlcnAobWF0Y2gpICkKLSAgICAgICBtYXRjaCA9ICh7IG1hdGNoIH0pOwotCi0gICAgbWF0Y2ggLT0gKHswfSk7Ci0KLSAgICBpZiAoIHNpemVvZihtYXRjaCkgKXsKLSAgICAgICBpZiAoIHBsYXllcnNfb25seSApCi0gICAgICAgICAgIHJldHVybiBzaXplb2YoZmlsdGVyKCBtYXRjaCwgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlLyonKi8gKSkKLSAgICAgICAgICAgICAgPiAwOwotICAgICAgIGVsc2UKLSAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgbV9kZWxldGUoIG5hbWVfbGl2aW5nX20sIHN0ciApOwotICAgIGNsZWFuX2xvZyggc3ByaW50ZigiY2hlY2tfbWF0Y2ggbG9lc2NodCAlc1xuIiwgc3RyKSApOwotICAgIHJldHVybiAwOwotfQotCi0vL1RPRE86OiBzdHJpbmd8c3RyaW5nKiBleGNsdWRlCi12YXJhcmdzIG1peGVkIG1hdGNoX2xpdmluZyggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSwgbWl4ZWQgZXhjbHVkZSApCi17Ci0gICAgaW50IGksIHM7Ci0gICAgbWl4ZWQgbWF0Y2gsICp1c2VyOwotCi0gICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApCi0gICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoICFwb2ludGVycChleGNsdWRlKSApCi0gICAgICAgZXhjbHVkZSA9ICh7IGV4Y2x1ZGUgfSk7Ci0KLSAgICBpZiAoIG1lbWJlcihleGNsdWRlLCBzdHIpIDwgMCAmJiBjaGVja19tYXRjaChzdHIsIHBsYXllcnNfb25seSkgKQotICAgICAgIHJldHVybiBzdHI7Ci0KLSAgICB1c2VyID0gbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pOwotICAgIHMgPSBzaXplb2Yoc3RyKTsKLSAgICBtYXRjaCA9IDA7Ci0KLSAgICBmb3IgKCBpID0gc2l6ZW9mKHVzZXIpOyBpLS07ICkKLSAgICAgICBpZiAoIHN0ciA9PSB1c2VyW2ldWzAuLnMtMV0gJiYgbWVtYmVyKCBleGNsdWRlLCB1c2VyW2ldICkgPCAwICkKLSAgICAgICAgICAgaWYgKCBtYXRjaCApCi0gICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBpZiAoIGNoZWNrX21hdGNoKHVzZXJbaV0sIHBsYXllcnNfb25seSkgKQotICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB1c2VyW2ldOwotCi0gICAgaWYgKCAhbWF0Y2ggKQotICAgICAgIHJldHVybiAtMjsKLQotICAgIHJldHVybiBtYXRjaDsKLX0KLQotbWl4ZWQgKmR1bXBfbGl2aW5ncygpCi17Ci0gIHJldHVybiBzb3J0X2FycmF5KG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwjJz4pOwotfQotCi0vLyAqIHJlZ2VsbWFlc3NpZyBMaXN0ZW4gdm9uIEJhbGxhc3QgYmVmcmVpZW4KLXByaXZhdGUgdm9pZCBjbGVhbl9uYW1lX2xpdmluZ19tKHN0cmluZyAqa2V5cywgaW50IGxlZnQsIGludCBudW0pCi17Ci0gIGludCBpLCBqOwotICBtaXhlZCBhOwotCi0gIHdoaWxlIChsZWZ0ICYmIG51bS0tKQotICB7Ci0gICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW2tleXNbLS1sZWZ0XV0pICYmIG1lbWJlcihhLCAwKT49MCkKLSAgICB7Ci0gICAgICBhLT0oezB9KTsKLSAgICAgIG5hbWVfbGl2aW5nX21ba2V5c1tsZWZ0XV0gPSBhOwotICAgIH0KLSAgICBpZiAoIWEgfHwgKHBvaW50ZXJwKGEpICYmICFzaXplb2YoYSkpKQotICAgIHsKLSAgICAgIGNsZWFuX2xvZygiVG9hc3RpbmcgIitrZXlzW2xlZnRdKyJcbiIpOwotICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwga2V5c1tsZWZ0XSk7Ci0gICAgfSBlbHNlIGNsZWFuX2xvZyhzcHJpbnRmKCJLRUVQSU5HICVzICglTylcbiIsa2V5c1tsZWZ0XSxwb2ludGVycChhKT9zaXplb2YoYSk6YSkpOwotICB9Ci0gIGlmIChsZWZ0KQotICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwgMSwga2V5cywgbGVmdCwgODApOwotICBlbHNlCi0gICAgY2xlYW5fbG9nKCJDbGVhbiBwcm9jZXNzIGZpbmlzaGVkXG4iKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNsZWFuX25ldGRlYWQoKSB7Ci0gIGludCBpOwotICBzdHJpbmcgKnM7Ci0gIG9iamVjdCBvYjsKLQotICBzPW1faW5kaWNlcyhuZXRkZWFkKTsKLSAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKQotICAgIGlmICghb2JqZWN0cChvYj1uZXRkZWFkW3NbaV1dKSB8fCBpbnRlcmFjdGl2ZShvYikpCi0gICAgICBtX2RlbGV0ZShuZXRkZWFkLHNbaV0pOwotfQotCi1wcml2YXRlIHZvaWQgQ2xlYW5MaXZpbmdEYXRhKCkgewotICBpZiAoZmluZF9jYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20pIDwgMCkgewotICAgIGNsZWFuX2xvZygiU3RhcnRpbmcgY2xlYW4gcHJvY2Vzc1xuIik7Ci0gICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLAotICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICBtX2luZGljZXMobmFtZV9saXZpbmdfbSksCi0gICAgICAgICAgICAgICAgIHNpemVvZihuYW1lX2xpdmluZ19tKSwKLSAgICAgICAgICAgICAgICAgODAKLSAgICAgICAgICAgICAgICAgKTsKLSAgfQotICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25ldGRlYWQsMik7Ci19Ci0KLSN1bmRlZiBjbGVhbl9sb2cKLQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL29iamVjdF9pbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2MwMDkuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gb2JqZWN0X2luZm8oKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiBfX0VGVU5fREVGSU5FRF9fKGRyaXZlcl9pbmZvKSAvKiBOZXdlciB2ZXJzaW9uIGlzIHRoZXJlICovCi0KLSNpbmNsdWRlIDxvYmplY3RpbmZvLmg+Ci0jaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KLQotbWl4ZWQgb2JqZWN0X2luZm8ob2JqZWN0IG9iLCBpbnQgd2hhdCwgdmFyYXJncyBpbnQqIGluZGV4KQotewotICAgIG1peGVkICogcmVzdWx0OwotCi0gICAgaWYgKHNpemVvZihpbmRleCkgPiAxKQotICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIG9iamVjdF9pbmZvXG4iKTsKLQotICAgIHN3aXRjaCh3aGF0KQotICAgIHsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIG9iamVjdF9pbmZvKCkuXG4iLCB3aGF0KSk7Ci0KLSAgICAgICAgY2FzZSBPSU5GT19CQVNJQzoKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lCX01BWCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdFtPSUJfSEVBUlRfQkVBVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9JU19XSVpBUkRdICAgICAgICAgPSAwOyAgIC8qIE5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gKi8KLSAgICAgICAgICAgIHJlc3VsdFtPSUJfRU5BQkxFX0NPTU1BTkRTXSAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9DTE9ORV0gICAgICAgICAgICAgPSBlZnVuOjpjbG9uZXAob2IpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9ERVNUUlVDVEVEXSAgICAgICAgPSAwOyAgIC8qIE5vdCBwb3NzaWJsZSBhbnltb3JlLiAqLwotICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQUEVEXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX09OQ0VfSU5URVJBQ1RJVkVdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVTRVRfU1RBVEVdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfV0lMTF9DTEVBTl9VUF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApOwotICAgICAgICAgICAgcmVzdWx0W09JQl9MQU1CREFfUkVGRVJFTkNFRF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFNQkRBX1JFRkVSRU5DRUQpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9TSEFET1ddICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpICYmIDE7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX1JFUExBQ0VEXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfUkVTRVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9USU1FX09GX1JFRl0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX1JFRl0gICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUyk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX0dJR0FUSUNLU10gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9USUNLU10gICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQX05VTV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pOwotICAgICAgICAgICAgcmVzdWx0W09JQl9QUk9HX1NXQVBQRURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TV0FQUEVEKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfVkFSX1NXQVBQRURdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1ZBUl9TV0FQUEVEKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfTkFNRV0gICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X25hbWUob2IpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9MT0FEX05BTUVdICAgICAgICAgPSBlZnVuOjpsb2FkX25hbWUob2IpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9QUkVWX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0NMRUFOVVBdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9DTEVBTlVQX1RJTUUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9JTkZPX1BPU0lUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSVBfTUFYKTsKLQotICAgICAgICAgICAgcmVzdWx0W09JUF9ORVhUXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lQX1BSRVZdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSVBfUE9TXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BPUyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT0lORk9fTUVNT1JZOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSU1fTUFYKTsKLQotICAgICAgICAgICAgcmVzdWx0W09JTV9SRUZdICAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUyk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX05BTUVdICAgICAgICAgICAgICAgPSBlZnVuOjpwcm9ncmFtX25hbWUob2IpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9QUk9HX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX05VTV9GVU5DVElPTlNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfRlVOQ1RJT05TXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fVkFSSUFCTEVTXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1ZBUklBQkxFU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1NUUklOR1NdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX0RBVEFdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19UT1RBTF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5IRVJJVEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0lOSEVSSVRFRF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfU0laRV0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9EQVRBX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX0RBVEFfU0laRV0gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fSU5IRVJJVF0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19JTkhFUklUKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fQ0xPTkVdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19DTE9ORSk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX05PX1NIQURPV10gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fU0hBRE9XKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOQ0xVREVTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5DTFVERUQpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9TSEFSRV9WQVJJQUJMRVNdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQVJFX1ZBUklBQkxFUyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzaXplb2YoaW5kZXgpKQotICAgIHsKLSAgICAgICAgaW50IGlkeCA9IGluZGV4WzBdOwotICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCi0gICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBvYmplY3RfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCi0gICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTQ2ZGNkLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9lZGl0aW5nKCkuCi0gKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KLSAqLwotCi0jaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2VkaXRpbmcpCi0KLSNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+Ci0KLWludHxvYmplY3QgcXVlcnlfZWRpdGluZyhvYmplY3Qgb2IpCi17Ci0gICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfRURJVElORyk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2EzMmFlLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lkbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pZGxlKCkuCi0gKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KLSAqLwotCi0jaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lkbGUpCi0KLSNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+Ci0KLWludCBxdWVyeV9pZGxlKG9iamVjdCBvYikKLXsKLSAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSURMRSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDhjMzExLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pbnB1dF9wZW5kaW5nKCkuCi0gKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KLSAqLwotCi0jaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lucHV0X3BlbmRpbmcpCi0KLSNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+Ci0KLW9iamVjdCBxdWVyeV9pbnB1dF9wZW5kaW5nKG9iamVjdCBvYikKLXsKLSAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JTlBVVF9QRU5ESU5HKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzRlYTAuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBxdWVyeV9pcF9uYW1lKCkgYW5kCi0gKiBxdWVyeV9pcF9udW1iZXIoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaXBfbmFtZSkKLQotI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KLQotcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbmFtZShvYmplY3QgcGxheWVyKQotewotICAgIG9iamVjdCBvYiA9IHBsYXllcjsKLSAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKLQotICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOwotICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OQU1FKTsKLX0KLQotcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBwbGF5ZXIpCi17Ci0gICAgb2JqZWN0IG9iID0gcGxheWVyOwotICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOwotCi0gICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7Ci0gICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05VTUJFUik7Ci19Ci0KLS8vICogSGVya3VuZnRzLUVybWl0dGx1bmcKLXN0cmluZyBxdWVyeV9pcF9udW1iZXIob2JqZWN0IG9iKQotewotICBvYj0gb2IgfHwgdGhpc19wbGF5ZXIoKTsKLSAgaWYgKCFvYmplY3RwKG9iKSB8fCAhaW50ZXJhY3RpdmUob2IpKSByZXR1cm4gMDsKLSAgaWYob2ItPnF1ZXJ5X3JlYWxpcCgpICYmIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpIT0iIikKLSAgewotICAgIHJldHVybiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKTsKLSAgfQotICByZXR1cm4gX3F1ZXJ5X2lwX251bWJlcihvYik7Ci19Ci0KLXN0cmluZyBxdWVyeV9pcF9uYW1lKG1peGVkIG9iKQotewotICBpZiAoICFvYiB8fCBvYmplY3RwKG9iKSApCi0gICAgICBvYj1fcXVlcnlfaXBfbnVtYmVyKG9iKTsKLSAgcmV0dXJuIChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmhvc3Qob2IpOwotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiZjM5MC4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9saW1pdHMoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbGltaXRzKQotCi0jaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KLQotdmFyYXJncyBpbnQqIHF1ZXJ5X2xpbWl0cyhpbnQgZGVmKQotewotICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhkZWYgPyBEQ19ERUZBVUxUX1JVTlRJTUVfTElNSVRTIDogRElfQ1VSUkVOVF9SVU5USU1FX0xJTUlUUyk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzNmYwZS4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9sb2FkX2F2ZXJhZ2UoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbG9hZF9hdmVyYWdlKQotCi0jaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KLQotc3RyaW5nIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpCi17Ci0gICAgcmV0dXJuIGVmdW46OnNwcmludGYoIiUuMmYgY21kcy9zLCAlLjJmIGNvbXAgbGluZXMvcyIsCi0gICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9DT01NQU5EUyksCi0gICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9MSU5FUykpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYwMDlkLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbXVkX3BvcnQoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbXVkX3BvcnQpCi0KLSNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+Ci0jaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KLQotaW50IHF1ZXJ5X211ZF9wb3J0KHZhcmFyZ3MgaW50KnxvYmplY3QqIGFyZ3MpCi17Ci0gICAgaWYoIXNpemVvZihhcmdzKSAmJiBlZnVuOjp0aGlzX3BsYXllcigpICYmIGVmdW46OmludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQotICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh0aGlzX3BsYXllcigpLCBJSV9NVURfUE9SVCk7Ci0KLSAgICBpZihzaXplb2YoYXJncykgPiAxKQotICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHF1ZXJ5X211ZF9wb3J0XG4iKTsKLQotICAgIGlmKHNpemVvZihhcmdzKSAmJiBlZnVuOjpvYmplY3RwKGFyZ3NbMF0pICYmIGVmdW46OmludGVyYWN0aXZlKGFyZ3NbMF0pKQotICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhhcmdzWzBdLCBJSV9NVURfUE9SVCk7Ci0KLSAgICBpZihzaXplb2YoYXJncykgJiYgaW50cChhcmdzWzBdKSkKLSAgICB7Ci0gICAgICAgIGludCogcG9ydHMgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpOwotICAgICAgICBpZihhcmdzWzBdIDwgLTEgfHwgYXJnc1swXSA+PSBzaXplb2YocG9ydHMpKQotICAgICAgICAgICAgcmFpc2VfZXJyb3IoZWZ1bjo6c3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X211ZF9wb3J0KCk6IHZhbHVlICVkIG91dCBvZiByYW5nZS5cbiIsIGFyZ3NbMF0pKTsKLSAgICAgICAgZWxzZSBpZihhcmdzWzBdID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIHNpemVvZihwb3J0cyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBwb3J0c1thcmdzWzBdXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKVswXTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNzgyOWYuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkKLQotI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+Ci0KLWludCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iamVjdCBvYikKLXsKLSAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9zbm9vcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE2OWMwLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc25vb3AoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLQotI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KLQotcHJpdmF0ZSBvYmplY3QgX3F1ZXJ5X3Nub29wKG9iamVjdCBvYikKLXsKLSAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG9iamVjdCBwcmV2ID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7Ci0gICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHByZXYpOwotI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zbm9vcCkKLSAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfU05PT1BfTkVYVCk7Ci0jZWxzZQotICAgIHJldHVybiBlZnVuOjpxdWVyeV9zbm9vcChvYik7Ci0jZW5kaWYKLX0KLQotbm9tYXNrIG9iamVjdCBxdWVyeV9zbm9vcChvYmplY3Qgd2hvKSB7Ci0gIG9iamVjdCBzbm9vcGVyOwotCi0gIHNub29wZXI9X3F1ZXJ5X3Nub29wKHdobyk7Ci0gIGlmICghc25vb3BlcikgcmV0dXJuIDA7Ci0gIGlmIChxdWVyeV93aXpfZ3JwKHNub29wZXIpPnF1ZXJ5X3dpel9ncnAoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgJiYKLSAgICAgIElTX0FSQ0goc25vb3BlcikpIHJldHVybiAwOwotICByZXR1cm4gc25vb3BlcjsKLX0KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk5NWViLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X2hlYXJ0X2JlYXQoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X2hlYXJ0X2JlYXQpCi0KLSNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+Ci0KLWludCBzZXRfaGVhcnRfYmVhdChpbnQgZmxhZykKLXsKLSAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKLSAgICBpbnQgaGIgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7Ci0KLSAgICBpZiAoIWZsYWcgPT0gIWhiKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxY2NkYi4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyogVGhlc2UgYXJlIHRoZSBzcGVjaWFsIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlciB0aGF0IGFyZSBhY3RpdmF0ZWQgd2l0aAotICogc2V0X2lzX3dpemFyZCgpLiBUaGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBhZGRlZCB0byB0aGUgcGxheWVyIG9iamVjdC4KLSAqIEFsc28gc2V0X2lzX3dpemFyZCgpIG11c3QgYmUgY2FsbGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIHBsYXllciBvYmplY3QsCi0gKiBub3QgYXMgYW4gKHNpbXVsLSllZnVuLgotICovCi0KLSNpbmNsdWRlIDxjb21tYW5kcy5oPgotI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+Ci0KLS8qIGlzX3dpemFyZDoKLSAqICAxOiBoYXMgYWN0aW9ucywKLSAqICAwOiBuZXZlciBoYWQgYWN0aW9ucywKLSAqIC0xOiBoYWQgYWN0aW9ucyBvbmNlLgotICovCi1wcml2YXRlIG5vc2F2ZSBpbnQgaXNfd2l6YXJkOwotCi1wcml2YXRlIGludCBkcml2ZXJfbWFsbG9jKHN0cmluZyBzdHIpCi17Ci0gICAgaWYoaXNfd2l6YXJkIDw9IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYoIXNpemVvZihzdHIpKQotICAgIHsKLSAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmKHN0ciA9PSAiZXh0c3RhdHMiKQotICAgIHsKLSAgICAgICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1wcml2YXRlIGludCBkcml2ZXJfZHVtcGFsbG9iaihzdHJpbmcgc3RyKQotewotICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHdyaXRlKCJEdW1waW5nIHRvIC9PQkpfRFVNUCAuLi4gIik7Ci0gICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUUyk7Ci0gICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT0JKRUNUU19ERVNUUlVDVEVEKTsKLSAgICB3cml0ZSgiZG9uZVxuIik7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXByaXZhdGUgaW50IGRyaXZlcl9vcGNkdW1wKHN0cmluZyBzdHIpCi17Ci0gICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhERElfT1BDT0RFUyk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXByaXZhdGUgaW50IGRyaXZlcl9zdGF0dXMoc3RyaW5nIHN0cikKLXsKLSAgICBpbnQgb3B0OwotICAgIGlmKGlzX3dpemFyZCA8PSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHN3aXRjaChzdHIgfHwgIiIpCi0gICAgewotICAgICAgICBjYXNlICIiOgotICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAidGFibGVzIjoKLSAgICAgICAgY2FzZSAiIHRhYmxlcyI6Ci0gICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICJzd2FwIjoKLSAgICAgICAgY2FzZSAiIHN3YXAiOgotICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgIm1hbGxvYyI6Ci0gICAgICAgIGNhc2UgIiBtYWxsb2MiOgotICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKLSAgICAgICAgY2FzZSAiIG1hbGxvYyBleHRzdGF0cyI6Ci0gICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgd3JpdGUoZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KSk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBzZXRfaXNfd2l6YXJkKHZhcmFyZ3MgPG9iamVjdHxpbnQ+KiBhcmdzKQotewotICAgIGludCBvbGR2YWwgPSBpc193aXphcmQ7Ci0KLSAgICBpZighc2l6ZW9mKGFyZ3MpKQotICAgICAgICByYWlzZV9lcnJvcigiVG9vIGZldyBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7Ci0gICAgaWYoc2l6ZW9mKGFyZ3MpID4gMikKLSAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKLSAgICBpZighb2JqZWN0cChhcmdzWzBdKSkKLSAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMSB0byBzZXRfaXNfd2l6YXJkKClcbiIpOwotICAgIGlmKGFyZ3NbMF0gIT0gdGhpc19vYmplY3QoKSkKLSAgICAgICAgcmFpc2VfZXJyb3IoIk9ubHkgc2V0X2lzX3dpemFyZCBmb3IgdGhlIGN1cnJlbnQgb2JqZWN0IHN1cHBvcnRlZFxuIik7Ci0gICAgaWYodGhpc19wbGF5ZXIoKSAhPSB0aGlzX29iamVjdCgpKQotICAgICAgICByYWlzZV9lcnJvcigiVGhlIGN1cnJlbnQgb2JqZWN0IG11c3QgYmUgdGhpc19wbGF5ZXIoKSBmb3Igc2V0X2lzX3dpemFyZCgpXG4iKTsKLSAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKLSAgICAgICAgcmFpc2VfZXJyb3IoIkJhZCBhcmcgMiB0byBzZXRfaXNfd2l6YXJkKClcbiIpOwotCi0gICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWFyZ3NbMV0pCi0gICAgewotICAgICAgICBpZihpc193aXphcmQgPiAwKQotICAgICAgICAgICAgaXNfd2l6YXJkID0gLTE7Ci0gICAgfQotICAgIGVsc2UgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgYXJnc1sxXTwwKQotICAgIHsKLSAgICAgICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCFpc193aXphcmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfbWFsbG9jLCAibWFsbG9jIik7Ci0gICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX2R1bXBhbGxvYmosICJkdW1wYWxsb2JqIik7Ci0gICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX29wY2R1bXAsICJvcGNkdW1wIik7Ci0gICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX3N0YXR1cywgInN0YXR1cyIsIEFBX05PU1BBQ0UpOwotICAgICAgICB9Ci0gICAgICAgIGlzX3dpemFyZCA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9sZHZhbCA+IDA7Ci19CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNTk2OTIuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9wcm9tcHQoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X3Byb21wdCkKLQotI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KLQotdmFyYXJncyBzdHJpbmd8Y2xvc3VyZSBzZXRfcHJvbXB0KHN0cmluZ3xjbG9zdXJlfGludCBwcm9tcHQsIG9iamVjdCBvYikKLXsKLSAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKLQotICAgIG1peGVkIG9sZHByb21wdCA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElDX1BST01QVCk7Ci0KLSAgICBpZighaW50cChwcm9tcHQpKQotICAgICAgICBlZnVuOjpjb25maWd1cmVfaW50ZXJhY3RpdmUob2IsIElDX1BST01QVCwgcHJvbXB0KTsKLQotICAgIHJldHVybiBvbGRwcm9tcHQ7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2hhZG93LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaGFkb3cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwOGM3My4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaGFkb3cuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zaGFkb3dpbmcoKQotICogYW5kIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIHNoYWRvdygpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zaGFkb3dpbmcpCi0KLSNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgotCi1vYmplY3QgcXVlcnlfc2hhZG93aW5nKG9iamVjdCBvYikKLXsKLSAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKTsKLX0KLQotcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQotewotICAgIGlmKGZsYWcpCi0gICAgewotICAgICAgICBvYmplY3Qgc2hhZG93ZXIgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoMSk7Ci0gICAgICAgIGVmdW46OnNldF90aGlzX29iamVjdChzaGFkb3dlcik7Ci0KLSAgICAgICAgaWYgKGVmdW46OnNoYWRvdyhvYikpCi0gICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8oc2hhZG93ZXIsIE9JX1NIQURPV19QUkVWKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfTkVYVCk7Ci19Ci0jZWxzZQotcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQotewotICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKLSAgcmV0dXJuIGVmdW46OnNoYWRvdyhvYiwgZmxhZyk7Ci19Ci0jZW5kaWYKLQotCi1wdWJsaWMgb2JqZWN0IHNoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQotewotICBvYmplY3QgcmVzID0gZnVuY2FsbCgjJ19zaGFkb3csb2IsIGZsYWcpOwotICBpZiAoZmxhZykKLSAgICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5SZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLXByaXZhdGUgdm9pZCBfdW5zaGFkb3coKSB7Ci0gIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOwotICBlZnVuOjp1bnNoYWRvdygpOwotfQotCi1wdWJsaWMgdm9pZCB1bnNoYWRvdygpIHsKLSAgZnVuY2FsbCgjJ191bnNoYWRvdyk7Ci0gICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlVucmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOwotfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY4Nzg5Li4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NpbXVsX2VmdW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE5OTUgKzAsMCBAQAotLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgotLy8KLS8vIHNpbXVsX2VmdW4uYyAtLSBzaW11bCBlZnVuJ3MKLS8vCi0vLyAkSWQ6IHNpbXVsX2VmdW4uYyA3NDA4IDIwMTAtMDItMDYgMDA6Mjc6MjVaIFplc3N0cmEgJAotI3ByYWdtYSBzdHJpY3RfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCi0jcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdyxub19pbmhlcml0Ci0jcHJhZ21hIHBlZGFudGljLHJhbmdlX2NoZWNrLHdhcm5fZGVwcmVjYXRlZAotI3ByYWdtYSB3YXJuX2VtcHR5X2Nhc3RzLHdhcm5fbWlzc2luZ19yZXR1cm4sd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKLQotLy8gQWJzb2x1dGUgUGZhZGUgZXJmb3JkZXJsaWNoIC0genVtIFplaXRwdW5rdCwgd28gZGVyIE1hc3RlciBnZWxhZGVuCi0vLyB3aXJkLCBzaW5kIG5vY2gga2VpbmUgSW5jbHVkZS1QZmFkZSBkYSAuLi4KLQotI2RlZmluZSBTTk9PUExPR0ZJTEUgIlNOT09QIgotI2RlZmluZSBBU05PT1BMT0dGSUxFICJBUkNIL1NOT09QIgotCi0jaW5jbHVkZSAiL3NlY3VyZS9jb25maWcuaCIKLSNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgotI2luY2x1ZGUgIi9zeXMvc25vb3BpbmcuaCIKLSNpbmNsdWRlICIvc3lzL2xhbmd1YWdlLmgiCi0jaW5jbHVkZSAiL3N5cy90aGluZy9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiL3N5cy93aXpsaXN0LmgiCi0jaW5jbHVkZSAiL3N5cy9lcnEuaCIKLSNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCi0jaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKLSNpbmNsdWRlICIvc3lzL3BsYXllci9iYXNlLmgiCi0jaW5jbHVkZSAiL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oIgotI2luY2x1ZGUgIi9zeXMvY29udGFpbmVyLmgiCi0jaW5jbHVkZSAiL3N5cy9kZWZpbmVzLmgiCi0jaW5jbHVkZSAiL3N5cy90ZWxuZXQuaCIKLSNpbmNsdWRlICIvc3lzL29iamVjdGluZm8uaCIKLSNpbmNsdWRlICIvc3lzL2ZpbGVzLmgiCi0jaW5jbHVkZSAiL3N5cy9zdHJpbmdzLmgiCi0jaW5jbHVkZSAiL3N5cy90aW1lLmgiCi0jaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgotI2luY2x1ZGUgIi9zeXMvbm90aWZ5X2ZhaWwuaCIKLSNpbmNsdWRlICIvc3lzL3Rscy5oIgotI2luY2x1ZGUgIi9zeXMvaW5wdXRfdG8uaCIKLSNpbmNsdWRlICIvc3lzL29iamVjdF9pbmZvLmgiCi0KLS8qIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqLwotc3RyaW5nIGR0aW1lKGludCB3YW5uKTsKLXZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhayk7Ci1pbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcik7Ci1ub21hc2sgdmFyYXJncyBpbnQgc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KTsKLXZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pOwotaW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KTsKLXB1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKTsKLW5vbWFzayBpbnQgc2VjdXJlX2xldmVsKCk7Ci1ub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCk7Ci1wdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKTsKLW5vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpOwotdmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2Fwcyk7Ci0KLQotLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKLSNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQotdmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKTsKLSNlbmRpZgotI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQotdmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0byk7Ci0jZW5kaWYKLSNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCi1pbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKTsKLSNlbmRpZgotCi0vLyBJbmNsdWRlIHRoZSBkaWZmZXJlbnQgc3ViICdtb2R1bGVzJyBvZiB0aGUgc2ltdWxfZWZ1bgotI2luY2x1ZGUgX19ESVJfXyJkZWJ1Z19pbmZvLmMiCi0jaW5jbHVkZSBfX0RJUl9fImVuYWJsZV9jb21tYW5kcy5jIgotI2luY2x1ZGUgX19ESVJfXyJoYXNoLmMiCi0jaW5jbHVkZSBfX0RJUl9fIm9iamVjdF9pbmZvLmMiCi0jaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2VkaXRpbmcuYyIKLSNpbmNsdWRlIF9fRElSX18icXVlcnlfaWRsZS5jIgotI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pbnB1dF9wZW5kaW5nLmMiCi0jaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lwX25hbWUuYyIKLSNpbmNsdWRlIF9fRElSX18icXVlcnlfbGltaXRzLmMiCi0jaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xvYWRfYXZlcmFnZS5jIgotI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9tdWRfcG9ydC5jIgotI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMiCi0jaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X3Nub29wLmMiCi0jaW5jbHVkZSBfX0RJUl9fInNldF9oZWFydF9iZWF0LmMiCi0jaWYgX19CT09UX1RJTUVfXyA8IDE0NTYyNjE4NTkKLSNpbmNsdWRlIF9fRElSX18ic2V0X3Byb21wdC5jIgotI2VuZGlmCi0jaW5jbHVkZSBfX0RJUl9fInNoYWRvdy5jIgotI2luY2x1ZGUgX19ESVJfXyJsaXZpbmdzLmMiCi0jaW5jbHVkZSBfX0RJUl9fImNvbW0uYyIKLQotI2RlZmluZSBUTyAgICAgICAgZWZ1bjo6dGhpc19vYmplY3QoKQotI2RlZmluZSBUSSAgICAgICAgZWZ1bjo6dGhpc19pbnRlcmFjdGl2ZSgpCi0jZGVmaW5lIFRQICAgICAgICBlZnVuOjp0aGlzX3BsYXllcigpCi0jZGVmaW5lIFBPICAgICAgICBlZnVuOjpwcmV2aW91c19vYmplY3QoMCkKLSNkZWZpbmUgTEVWRUwoeCkgcXVlcnlfd2l6X2xldmVsKHgpCi0jZGVmaW5lIE5BTUUoeCkgIGNhcGl0YWxpemUoZ2V0dWlkKHgpKQotCi0jZGVmaW5lIERFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKSBcCi0gIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikseCkKLQotbWl4ZWQgZHRpbWVfY2FjaGUgPSAoey0xLCIifSk7Ci0KLSNpZmRlZiBJT1NUQVRTCi1zdHJ1Y3QgaW9zdGF0X3MgewotICBzdHJpbmcgb25hbWU7Ci0gIGludCB0aW1lOwotICBpbnQgc2l6ZTsKLX07Ci1taXhlZCBzYXZlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsIDApIH0pOwotbWl4ZWQgcmVzdG9yZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLDApIH0pOwotLy9taXhlZCB3cml0ZWZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7Ci0vL21peGVkIHJlYWRmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOwotLy9taXhlZCBsb2dfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7Ci0KLW1peGVkIF9fX2lvc3RhdHMoaW50IHR5cGUpIHsKLSAgc3dpdGNoKHR5cGUpIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gc2F2ZW9fc3RhdDsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gcmVzdG9yZW9fc3RhdDsKLS8qICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiB3cml0ZWZpbGVfc3RhdDsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gcmVhZGZpbGVfc3RhdDsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gbG9nX3N0YXQ7Ci0gICAgICAqLwotICB9Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRpZSBzaW11bF9lZnVuIGVudHNvcmdlbiBrb2VubmVuLgotc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKLSAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7Ci0gICAgICByZXR1cm4gIkR1IGRhcmZzdCBkYXMgc2ltdWxfZWZ1biBPYmpla3QgbmljaHQgemVyc3RvZXJlbiFcbiI7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1wdWJsaWMgbm9tYXNrIHZvaWQgcmVtb3ZlX2ludGVyYWN0aXZlKCBvYmplY3Qgb2IgKQotewotICAgIGlmICggb2JqZWN0cChvYikgJiYgcHJldmlvdXNfb2JqZWN0KCkKLSAgICAgICAgJiYgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddICE9ICIvc2VjdXJlLyIKLSAgICAgICAgJiYgKChwcmV2aW91c19vYmplY3QoKSAhPSBvYgotICAgICAgICAgICAgICYmIChvYiAhPSB0aGlzX3BsYXllcigpIHx8IG9iICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkpCi0gICAgICAgICAgICB8fCAocHJldmlvdXNfb2JqZWN0KCkgPT0gb2IKLSAgICAgICAgICAgICAgICYmICh0aGlzX3BsYXllcigpICYmIHRoaXNfcGxheWVyKCkgIT0gb2IKLSAgICAgICAgICAgICAgICAgICB8fCB0aGlzX2ludGVyYWN0aXZlKCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICE9IG9iKSkgKSApCi0KLSAgICAgICBsb2dfZmlsZSggIlBMQVlFUkRFU1QiLAotICAgICAgICAgICAgICAgIHNwcmludGYoICIlczogJU8gYXVzZ2Vsb2dndCB2b24gUE8gJU8sIFRJICVPLCBUUCAlT1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIG9iLCBwcmV2aW91c19vYmplY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSApICk7Ci0KLSAgICBlZnVuOjpyZW1vdmVfaW50ZXJhY3RpdmUob2IpOwotfQotCi0KLXZvaWQgX19fdXBkbWFzdGVyKCkKLXsKLSAgICBvYmplY3Qgb2I7Ci0KLSAgICAvL3NvbGx0ZSBuaWNodCBqZWRlciBkdWVyZmVuLgotICAgIGlmIChwcm9jZXNzX2NhbGwoKSB8fCAhQVJDSF9TRUNVUklUWSkKLSAgICAgIHJhaXNlX2Vycm9yKCJJbGxlZ2FsIHVzZSBvZiBfX191cGRtYXN0ZXIoKSEiKTsKLQotICAgIHdyaXRlKCJSZW1vdmluZyBvbGQgbWFzdGVyIC4uLiAiKTsKLSAgICBmb3JlYWNoKHN0cmluZyBmaWxlOiAKLSAgICAgICAgZ2V0X2RpcigiL3NlY3VyZS9tYXN0ZXIvKi5jIixHRVRESVJfTkFNRVN8R0VURElSX1VOU09SVEVEfEdFVERJUl9QQVRIKSkgewotICAgICAgaWYgKG9iID0gZmluZF9vYmplY3QoZmlsZSkpCi0gICAgICAgZWZ1bjo6ZGVzdHJ1Y3Qob2IpOwotICAgIH0KLSAgICBlZnVuOjpkZXN0cnVjdChlZnVuOjpmaW5kX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKSk7Ci0gICAgd3JpdGUoImRvbmUuXG5Mb2FkaW5nIGFnYWluIC4uLiAiKTsKLSAgICBsb2FkX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKTsKLQotICAgIHdyaXRlKCJkb25lLlxuIik7Ci19Ci0KLXZhcmFyZ3Mgc3RyaW5nIGNvdW50cnkobWl4ZWQgaXAsIHN0cmluZyBudW0pIHsKLSAgbWl4ZWQgcmV0OwotCi0gIGlmKHJldCA9IChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmNvdW50cnkobnVtIHx8IGlwKSkgewotICAgIHJldHVybiByZXQ7Ci0gIH0gZWxzZSByZXR1cm4gIj8/PyI7Ci19Ci0KLQotLy8gKiBTbm9vcGVuIHVuZCB3YXMgZGF6dWdlaG9lcnQKLXN0YXRpYyBvYmplY3QgZmluZF9zbm9vcGVkKG9iamVjdCB3aG8pCi17Ci0gIG9iamVjdCAqdTsKLSAgaW50IGk7Ci0KLSAgZm9yIChpPXNpemVvZih1PXVzZXJzKCkpLTE7aT49MDtpLS0pCi0gICAgaWYgKHdobz09ZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh1W2ldLCBJSV9TTk9PUF9ORVhUKSkKLSAgICAgIHJldHVybiB1W2ldOwotICByZXR1cm4gMDsKLX0KLQotcHJpdmF0ZSBzdHJpbmcgTGN1dChzdHJpbmcgc3RyKSB7Ci0gIHJldHVybiBzdHJbNS4uMTFdK3N0clsxOC4uXTsKLX0KLQotbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKCBvYmplY3QgbWUsIG9iamVjdCB5b3UgKQotewotICAgIGludCByZXQ7Ci0gICAgb2JqZWN0IHNub29wZXIwLCBzbm9vcGVyLCBzbm9vcGVyMiwgc25vb3BlcjM7Ci0KLSAgICBpZiggIW9iamVjdHAobWUpIHx8IG1lID09IHlvdSB8fCAhUE8gKQotICAgICAgIHJldHVybiAwOwotCi0gICAgc25vb3BlcjAgPSBmaW5kX3Nub29wZWQobWUpOwotCi0gICAgIGlmKHlvdSl7Ci0gICAgICAgIGlmICggUE8gIT0gbWUgJiYgcXVlcnlfd2l6X2dycChtZSkgPj0gcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgaWYgKCBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKLSAgICAgICAgICAgICAhKHlvdS0+UXVlcnlBbGxvd1Nub29wKG1lKSkgKQotICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSB8fCBJU19BUkNIKHlvdSkgKQotICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgaWYgKCAoc25vb3BlciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSkgJiYKLSAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKHNub29wZXIpID49IHF1ZXJ5X3dpel9ncnAobWUpICl7Ci0gICAgICAgICAgICBpZiAoIChpbnQpc25vb3Blci0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKQotICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiJXMgc25vb3BlZCBqZXR6dCAlcy5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZS0+bmFtZShXRVIpLCB5b3UtPm5hbWUoV0VSKSApICk7Ci0KLSAgICAgICAgICAgIHNub29wZXIyID0gbWU7Ci0KLSAgICAgICAgICAgIHdoaWxlICggc25vb3BlcjMgPSBpbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSApewotICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgd2lyZCBzZWluZXJzZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsc25vb3BlcjItPm5hbWUoV0VSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjMtPm5hbWUoV0VNKSApICk7Ci0gICAgICAgICAgICAgICBzbm9vcGVyMiA9IHNub29wZXIzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlZnVuOjpzbm9vcCggc25vb3Blciwgc25vb3BlcjIgKTsKLQotICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSAhPSBzbm9vcGVyICkKLSAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUga2FubnN0ICVzIG5pY2h0IHNub29wZW4uXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBzbm9vcHN0IGpldHp0ICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOwotICAgICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKHNub29wZXIpICl7Ci0gICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZigiJXM6ICVPICVPICVPXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHNub29wZXIwKQotICAgICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7Ci0KLSAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIC0+ICVzICglTykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSkpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTAwMDAwICk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgKHNub29wZXIpCi0gICAgICAgICAgICAgICBpZiAoICFtZS0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKXsKLSAgICAgICAgICAgICAgICAgICBwcmludGYoICIlcyB3aXJkIGJlcmVpdHMgdm9uICVzIGdlc25vb3BlZC4gQmVudXR6ZSBkYXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJmXCItRmxhZywgd2VubiBkdSBkZW5ub2NoIHNub29wZW4gd2lsbHN0LlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeW91LT5uYW1lKFdFUiksIHNub29wZXItPm5hbWUoV0VNKSApOwotICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgIHJldCA9IGVmdW46OnNub29wKCBtZSwgeW91ICk7Ci0KLSAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSAmJiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUpewotICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAotICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7Ci0KLSAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKLSAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKLQotICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLCBzcHJpbnRmKCAiJXMgLT4gJXMgKCVPKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHlvdSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoeW91KSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lICl7Ci0gICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcmV0ICYmIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgotICAgICAgICAgICAgICFJU19ERVBVVFkobWUpICkKLSAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB5b3UsICIqKiogIiArIE5BTUUobWUpICsgIiBzbm9vcHQgRGljaCFcbiIgKTsKLQotICAgICAgICByZXR1cm4gcmV0OwotICAgICB9Ci0gICAgIGVsc2UgewotICAgICAgICBpZiAoIChtZSA9PSBQTyB8fAotICAgICAgICAgICAgICBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA+IHF1ZXJ5X3dpel9ncnAobWUpIHx8Ci0gICAgICAgICAgICAgIChxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSA9PSBxdWVyeV93aXpfZ3JwKG1lKSAmJgotICAgICAgICAgICAgICBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKFBPLCBJSV9TTk9PUF9ORVhUKSA9PSBtZSkpICYmIHNub29wZXIwICl7Ci0gICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICl7Ci0gICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7Ci0KLSAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlZnVuOjpzbm9vcChtZSk7Ci0gICAgICAgIH0KLSAgICAgfQotICAgICByZXR1cm4gMDsKLX0KLQotCi0KLS8vICogRW11bGF0aW9uIGRlcyAnYWx0ZW4nIGV4cGxvZGUgZHVyY2ggZGFzIG5ldWUKLXN0cmluZyAqb2xkX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCkgewotICBpbnQgcywgdDsKLSAgc3RyaW5nICpzdHJzOwotCi0gIGlmICghc3RyaW5ncChzdHIpKSB7Ci0gICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKLSAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDEgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgotICAgICAgICAgIiUuMzBPXG4iLHN0cikpOwotICB9Ci0gIGlmICghc3RyaW5ncChkZWwpKSB7Ci0gICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKLSAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IDIgdG8gb2xkX2V4cGxvZGUoKSEgRXhwZWN0ZWQgPHN0cmluZz4sIGdvdDogIgotICAgICAgICAgIiUuMzBPXG4iLGRlbCkpOwotICB9Ci0gIGlmKGRlbCA9PSAiIikKLSAgICByZXR1cm4gKHtzdHJ9KTsKLSAgc3Rycz1lZnVuOjpleHBsb2RlKHN0ciwgZGVsKTsKLSAgdD1zaXplb2Yoc3RycyktMTsKLSAgd2hpbGUoczw9dCAmJiBzdHJzW3MrK10gPT0gIiIpO3MtLTsKLSAgd2hpbGUodD49MCAmJiBzdHJzW3QtLV0gPT0gIiIpO3QrKzsKLSAgaWYoczw9dCkKLSAgICByZXR1cm4gc3Ryc1tzLi50XTsKLSAgcmV0dXJuICh7fSk7Ci19Ci0KLWludCBmaWxlX3RpbWUoc3RyaW5nIHBhdGgpIHsKLSAgbWl4ZWQgKnY7Ci0KLSAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLSAgaWYgKHNpemVvZih2PWdldF9kaXIocGF0aCxHRVRESVJfREFURVMpKSkgcmV0dXJuIHZbMF07Ci0gIHJldHVybigwKTsgLy9zb25zdAotfQotCi0vLyAqIEJlaSA1MGsgR3JvZXNzZSBMb2ctRmlsZSByb3RpZXJlbgotdmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKSB7Ci0gIG1peGVkICpzdDsKLQotICBmaWxlPSIvbG9nLyIrZmlsZTsKLSAgZmlsZT1pbXBsb2RlKChlZnVuOjpleHBsb2RlKGZpbGUsIi8iKS0oeyIuLiJ9KSksIi8iKTsKLS8vICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiam9mIiksc3ByaW50ZigiTE9HIEZJTEU6ICVPIC0+ICVPXG4iLHByZXZpb3VzX29iamVjdCgpLGZpbGUpKTsKLSAgaWYgKCFmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y2FsbF9vdGhlcixQTyksInNlY3VyZS9tYXN0ZXIiLC8vJykKLSAgICAgICAgICAgICAgInZhbGlkX3dyaXRlIixmaWxlLGdldGV1aWQoUE8pLCJsb2dfZmlsZSIsUE8pKQotICAgICAgcmV0dXJuIDA7Ci0gIGlmICggc2l6ZV90b19icmVhayA+PSAwICYgKAotICAgICAgc2l6ZW9mKHN0ID0gZ2V0X2RpcihmaWxlLDIpICkgJiYgc3RbMF0gPj0gKHNpemVfdG9fYnJlYWt8TUFYX0xPR19TSVpFKSkpCi0gICAgICBjYXRjaChyZW5hbWUoZmlsZSwgZmlsZSArICIub2xkIik7cHVibGlzaCk7IC8qIE5vIHBhbmljIGlmIGZhaWx1cmUgKi8KLSAgcmV0dXJuKHdyaXRlX2ZpbGUoZmlsZSx0eHQpKTsKLX0KLQotLy8gKiBNYWdpZXItTGV2ZWwgYWJmcmFnZW4KLWludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKSB7Ci0gIHJldHVybiAoaW50KSIvc2VjdXJlL21hc3RlciItPnF1ZXJ5X3dpel9sZXZlbChwbGF5ZXIpOwotfQotCi0jaWZkZWYgX19BTElTVFNfXwotLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkga2V5KQotbWl4ZWQgKnJlbW92ZV9hbGlzdChtaXhlZCBrZXksbWl4ZWQgKmFsaXN0KQotewotICBpbnQgaSxqOwotCi0gIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpKQotICAgIHJldHVybiBhbGlzdDsKLSAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCi0gIHsKLSAgICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0KSk8MCkKLSAgICAgIHJldHVybiBhbGlzdDsKLSAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07Ci0gIH0KLSAgaSA9IGFzc29jKGtleSxhbGlzdFswXSk7Ci0gIGlmICgoaT1hc3NvYyhrZXksYWxpc3RbMF0pKTwwKQotICAgIHJldHVybiBhbGlzdDsKLSAgYWxpc3Q9YWxpc3RbMC4uXTsKLSAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKLSAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKLSAgcmV0dXJuIGFsaXN0OwotfQotCi0vLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBwb3MpCi1taXhlZCAqZXhjbHVkZV9hbGlzdChpbnQgaSxtaXhlZCAqYWxpc3QpCi17Ci0gIGludCBqOwotICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSB8fCBpPDApCi0gICAgcmV0dXJuIGFsaXN0OwotICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKLSAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07Ci0gIGFsaXN0PWFsaXN0WzAuLl07IC8qIENyZWF0ZSBQSFlTSUNBTCBjb3B5IG9mIGFsaXN0ICovCi0gIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCi0gICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07Ci0gIHJldHVybiBhbGlzdDsgLyogb3JkZXJfYWxpc3QgaXMgTk9UIG5lY2Vzc2FyeSAtIHNlZSAvZG9jL0xQQy9hbGlzdCAqLwotfQotI2VuZGlmIC8vIF9fQUxJU1RTX18KLQotLy8gKiBHZXJtYW4gdmVyc2lvbiBvZiBjdGltZSgpCi0jZGVmaW5lIFRBR0UgKHsiU29uIiwiTW9uIiwiRGllIiwiTWl0IiwiRG9uIiwiRnJlIiwiU2FtIn0pCi0jZGVmaW5lIE1PTkFURSAoeyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBdWciLFwKLSAgICAgICAgICAgICAgICAgIlNlcCIsIk9rdCIsIk5vdiIsIkRleiJ9KQotc3RyaW5nIGR0aW1lKGludCB3YW5uKSB7Ci0gIAotICBpZiAod2FubiA9PSBkdGltZV9jYWNoZVswXSkKLSAgICByZXR1cm4oZHRpbWVfY2FjaGVbMV0pOwotCi0gIGludCAqbHQgPSBsb2NhbHRpbWUod2Fubik7Ci0gIHJldHVybiBzcHJpbnRmKCIlcywgJTJkLiAlcyAlZCwgJTAyZDolMDJkOiUwMmQiLAotICAgICAgVEFHRVtsdFtUTV9XREFZXV0sIGx0W1RNX01EQVldLCBNT05BVEVbbHRbVE1fTU9OXV0sIAotICAgICAgbHRbVE1fWUVBUl0sbHRbVE1fSE9VUl0sIGx0W1RNX01JTl0sIGx0W1RNX1NFQ10pOwotfQotCi0vLyB3ZW5uIHN0cmZ0aW1lIGltIERyaXZlciBuaWNodCBleGlzdGllcnQsIGlzdCBkaWVzIGhpZXIgZWluIEFsaWFzIGF1ZiBkdGltZSgpLAotLy8gendhciBzdGltbXQgZGFzIEZvcm1hdCBkYW5uIG5pY2h0LCBhYmVyIGRpZSBNdWRsaWIgYnVnZ3QgbmljaHQgdW5kIHNjaHJlaWJ0Ci0vLyBlaW4gb3JkZW50bGljaGVzIERhdHVtL1VocnplaXQuCi0jaWYgIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCi12YXJhcmdzIHN0cmluZyBzdHJmdGltZShtaXhlZCBmbXQsIGludCBjbG9jaywgaW50IGxvY2FsaXplZCkgewotICBpZiAoaW50cChjbG9jaykgJiYgY2xvY2sgPj0gMCkKLSAgICByZXR1cm4gZHRpbWUoY2xvY2spOwotICBlbHNlIGlmIChpbnRwKGZtdCkgJiYgZm10ID49IDApCi0gICAgcmV0dXJuIGR0aW1lKGZtdCk7Ci0gIAotICByZXR1cm4gZHRpbWUodGltZSgpKTsKLX0KLSNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQotCi0vLyAqIFNodXRkb3duIG1pdCB6dXNhZXR6bGljaGVtIGxvZ2dpbmcKLW5vbWFzayBpbnQgc2h1dGRvd24oc3RyaW5nIHJlYXNvbikKLXsKLSAgc3RyaW5nIG5hbWU7Ci0gIHN0cmluZyBvYm5hbWU7Ci0gIHN0cmluZyBvdXRwdXQ7Ci0KLSAgaWYgKCFyZWFzb24pCi0gICAgcmV0dXJuIDA7Ci0gIGlmICggIUFSQ0hfU0VDVVJJVFkgJiYgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSE9Uk9PVElEICYmCi0gICAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT0iL29iai9zaHV0IiApCi0gIHsKLSAgICB3cml0ZSgiWW91IGhhdmUgbm8gcGVybWlzc2lvbiB0byBzaHV0IGRvd24gdGhlIGdhbWVkcml2ZXIhXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoKHRoaXNfaW50ZXJhY3RpdmUoKSkmJihuYW1lPWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSkKLSAgewotICAgIG5hbWU9Y2FwaXRhbGl6ZShuYW1lKTsKLSAgICBmaWx0ZXIodXNlcnMoKSwjJ3RlbGxfb2JqZWN0LC8vJwotICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKSsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIhXG4iKTsKLSAgfQotICBlbHNlCi0gICAgbmFtZT0iQU5PTllNT1VTIjsKLSAgaWYgKHByZXZpb3VzX29iamVjdCgpKSBvYm5hbWU9Y2FwaXRhbGl6ZShnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKLSAgb3V0cHV0PW5hbWU7Ci0gIGlmIChvYm5hbWUgJiYgbmFtZSE9b2JuYW1lKSBvdXRwdXQ9b3V0cHV0KyIgKCIrb2JuYW1lKyIpIjsKLSAgaWYgKHByZXZpb3VzX29iamVjdCgpJiZvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk9PSIvb2JqL3NodXQiKXsKLSAgICBvdXRwdXQrPSIgZmFlaHJ0IGRhcyBTcGllbCB2aWEgQXJtYWdlZGRvbiBoZXJ1bnRlci5cbiI7Ci0gICAgb3V0cHV0PWR0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQ7Ci0gICAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7Ci0gICAgZWZ1bjo6c2h1dGRvd24oKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBvdXRwdXQ9Y3RpbWUodGltZSgpKSsiOiAiK291dHB1dCsiIGZhZWhydCBkYXMgU3BpZWwgaGVydW50ZXIuXG4iOwotICBvdXRwdXQrPSIgICAgR3J1bmQ6ICIrcmVhc29uOwotICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKLSAgZWZ1bjo6c2h1dGRvd24oKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vICogbG93ZXJjaGFyCi0KLWludCBsb3dlcmNoYXIoaW50IGNoYXIpIHsKLSAgaWYgKGNoYXI8J0EnIHx8IGNoYXI+J1onKSByZXR1cm4gY2hhcjsKLSAgcmV0dXJuIGNoYXIrMzI7Ci19Ci0KLS8vICogdXBwZXJzdHJpbmcKLQotc3RyaW5nIHVwcGVyc3RyaW5nKHN0cmluZyBzKQotewotI2lmIF9fRUZVTl9ERUZJTkVEX18odXBwZXJfY2FzZSkKLSAgcmV0dXJuKHVwcGVyX2Nhc2UocykpOwotI2Vsc2UKLSAgaW50IGk7Ci0gIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7Ci0gIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkgc1tpXT0oKHNbaV08J2EnfHxzW2ldPid6Jyk/c1tpXTpzW2ldLTMyKTsKLSAgcmV0dXJuIHM7Ci0jZW5kaWYKLX0KLQotLy8gKiBsb3dlcnN0cmluZwotCi1zdHJpbmcgbG93ZXJzdHJpbmcoc3RyaW5nIHMpCi17Ci0gIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7Ci0gIHJldHVybiBsb3dlcl9jYXNlKHMpOwotfQotCi0KLS8vICogR0QgdmVyc2lvbgotc3RyaW5nIHZlcnNpb24oKQotewotICByZXR1cm4gX19WRVJTSU9OX187Ci19Ci0KLS8vICogYnJlYWtfc3RyaW5nCi0vLyBzdHJldGNoKCkgLS0gc3RyZXRjaCBhIGxpbmUgdG8gZmlsbCBhIGdpdmVuIHdpZHRoIAotcHJpdmF0ZSBzdHJpbmcgc3RyZXRjaChzdHJpbmcgcywgaW50IHdpZHRoKSB7Ci0gIGludCBsZW49c2l6ZW9mKHMpOwotICBpZiAobGVuPT13aWR0aCkgcmV0dXJuIHM7Ci0KLSAgLy8gcmVpbmUgTGVlcnplaWxlbiwgZGlyZWt0IHp1cnVlY2tnZWJlbgotICBzdHJpbmcgdHJpbW1lZD10cmltKHMsVFJJTV9MRUZULCIgIik7Ci0gIGlmICh0cmltbWVkPT0iIikgcmV0dXJuIHM7IAotICBpbnQgc3RhcnRfc3BhY2VzID0gbGVuIC0gc2l6ZW9mKHRyaW1tZWQpOwotCi0gIHN0cmluZyogd29yZHMgPSBleHBsb2RlKHRyaW1tZWQsICIgIik7Ci0gIC8vIGRlciBsZXR6dGUga3JpZWd0IGtlaW5lIFNwYWNlcwotICBpbnQgd29yZF9jb3VudD1zaXplb2Yod29yZHMpIC0gMTsKLSAgLy8gd2VubiBaZWlsZSBudXIgYXVzIGVpbmVtIFdvcnQsIHdpcmQgZGFzIFdvcnQgenVydWVja2dlZ2ViZW4KLSAgaWYgKCF3b3JkX2NvdW50KQotICAgIHJldHVybiAiICIqc3RhcnRfc3BhY2VzICsgd29yZHNbMF07Ci0KLSAgaW50IHNwYWNlX2NvdW50ID0gd2lkdGggLSBsZW47Ci0KLSAgaW50IHNwYWNlX3Blcl93b3JkPSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAvIHdvcmRfY291bnQ7Ci0gIC8vIEFuei5Xb2VydGVyIG1pdCBadXNhdHotU3BhY2UKLSAgaW50IHJlc3Q9KHdvcmRfY291bnQrc3BhY2VfY291bnQpICUgd29yZF9jb3VudDsgCi0gIC8vIFJlc3QtU3BhY2VzIFZlcnRlaWxlbgotICBmb3JlYWNoIChpbnQgcG9zIDogcmVzdCkgd29yZHNbcG9zXSs9IiAiOwotICByZXR1cm4gKCIgIipzdGFydF9zcGFjZXMpICsgaW1wbG9kZSggd29yZHMsICIgIipzcGFjZV9wZXJfd29yZCApOwotfQotCi0vLyBhdXMgR2VzY2h3aW5kaWdrZWl0c2dydWVuZGVuIGhhdCBkZXIgQmxvY2tzYXR6IGZ1ZXIgYnJlYWtfc3RyaW5nIGVpbmUKLS8vIGVpZ2VuZSBGdW5rdGlvbiBiZWtvbW1lbjoKLXByaXZhdGUgdmFyYXJncyBzdHJpbmcgYmxvY2tfc3RyaW5nKHN0cmluZyBzLCBpbnQgd2lkdGgsIGludCBmbGFncykgewotICAvLyB3ZW5uIEJTX0xFQVZFX01ZX0xGUywgYWJlciBrZWluIEJTX05PX1BBUklOREVOVCwgZGFubiB3ZXJkZW4gWmVpbGVuIG1pdAotICAvLyBlaW5lbSBMZWVyemVpY2hlbiBiZWdvbm5lbi4KLSAgLy8gQlRXOiBXZW5uICFCU19MRUFWRV9NWV9MRlMsIGhhdCBkZXIgQXVmcnVmZXIgYmVyZWl0cyBhbGxlIFxuIGR1cmNoICIgIgotICAvLyBlcnNldHp0LgotICBpZiAoIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykKLSAgICAgICYmICEoZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpKQotICB7Ci0gICAgICBzID0gIiAiK3JlZ3JlcGxhY2UocywiXG4iLCJcbiAiLDEpOwotICB9Ci0KLSAgLy8gc3ByaW50ZiBmdWVsbHQgZGllIGxldHp0ZSBaZWlsZSBhdWYgZGllIEZlbGRicmVpdGUgKGhpZXIgYWxzbwotICAvLyBaZWlsZW5icmVpdGUpIG1pdCBGdWVsbHplaWNoZW4gYXVmLCB3ZW5uIHNpZSBOSUNIVCBtaXQgXG4gdW1nZWJyb2NoZW4KLSAgLy8gaXN0LiBFcyB3aXJkIGFuIGRpZSBsZXR6dGUgWmVpbGUgYWJlciBrZWluIFplaWxlbnVtYnJ1Y2ggYW5nZWhhZW5ndC4KLSAgLy8gRWlnZW50bGljaCBpc3QgZGFzIEF1ZmZ1ZWxsZW4gZG9vZiwgYWJlciB2ZXJtdXRsaWNoIGlzdCBlcyB1bm5vZXRpZywgZXMKLSAgLy8gd2llZGVyIHJ1ZWNrZ2FlbmdpZyB6dSBtYWNoZW4uCi0gIHMgPSBzcHJpbnRmKCAiJS0qPXMiLCB3aWR0aCwgcyk7Ci0KLSAgc3RyaW5nICp0bXA9ZXhwbG9kZShzLCAiXG4iKTsKLSAgLy8gTnVyIHdlbm4gcyBtZWhyemVpbGlnIGlzdCwgQmxvY2tzYXR6IGRyYXVzIG1hY2hlbi4gRGllIGxldHp0ZSBaZWlsZSB3aXJkCi0gIC8vIG5hdHVlcmxpY2ggbmljaHQgZ2VkZWhudC4gU2llIGlzdCBkYWZ1ZXIgc2Nob24gdm9uIHNwcmludGYoKSBhdWZnZWZ1ZWxsdAotICAvLyB3b3JkZW4uIEJUVzogRGllIGxldHp0ZSBaZWlsZSBlbmRldCB1LlUuIG5vY2ggbmljaHQgbWl0IGVpbmVtIFxuIChiencuCi0gIC8vIG51ciBkYW5uLCB3ZW5uIEJTX0xFQVZFX01ZX0xGUyB1bmQgZGVyIHVlYmVyZ2ViZW5lIFRleHQgc2Nob24gbmVuIFxuIGFtCi0gIC8vIEVuZGUgZGVyIGxldHp0ZW4gWmVpbGUgaGF0KSwgZGFzIG1hY2h0IGRlciBBdWZydWZlci4uLgotICBpZiAoc2l6ZW9mKHRtcCkgPiAxKQotICAgIHJldHVybiBpbXBsb2RlKCBtYXAoIHRtcFswLi48Ml0sICMnc3RyZXRjaC8qJyovLCB3aWR0aCApLCAiXG4iICkgCi0gICAgICArICJcbiIgKyB0bXBbPDFdOwotCi0gIHJldHVybiBzOwotfQotCi1wdWJsaWMgdmFyYXJncyBzdHJpbmcgYnJlYWtfc3RyaW5nKHN0cmluZyBzLCBpbnQgdywgbWl4ZWQgaW5kZW50LCBpbnQgZmxhZ3MpCi17Ci0gICAgaWYgKCAhcyB8fCBzID09ICIiICkgcmV0dXJuICIiOwotCi0gICAgaWYgKCAhdyApIHc9Nzg7Ci0KLSAgICBpZiggaW50cChpbmRlbnQpICkKLSAgICAgICBpbmRlbnQgPSBpbmRlbnQgPyAiICIqaW5kZW50IDogIiI7Ci0KLSAgICBpbnQgaW5kZW50bGVuPXN0cmluZ3AoaW5kZW50KSA/IHNpemVvZihpbmRlbnQpIDogMDsKLQotICAgIGlmIChpbmRlbnRsZW4+dykgewotICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLSAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoImJyZWFrX3N0cmluZzogaW5kZW50IGxvbmdlciAlZCB0aGFuIHdpZHRoICVkXG4iLAotICAgICAgICAgICAgICAgICAgaW5kZW50bGVuLHcpKTsKLSAgICAgIC8vIHc9KChpbmRlbnRsZW4vdykrMSkqdzsKLSAgICB9Ci0KLSAgICBpZiAoIShmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykpIAotICAgICAgcz1yZWdyZXBsYWNlKCBzLCAiXG4iLCAiICIsIDEgKTsKLQotICAgIGlmICggZmxhZ3MgJiBCU19TSU5HTEVfU1BBQ0UgKQotICAgICAgIHMgPSByZWdyZXBsYWNlKCBzLCAiKF58XG58ICkgICoiLCAiXFwxIiwgMSApOwotIAotICAgIHN0cmluZyBwcmVmaXg9IiI7Ci0gICAgaWYgKGluZGVudGxlbiAmJiBmbGFncyAmIEJTX1BSRVBFTkRfSU5ERU5UKSB7Ci0gICAgICBpZiAoaW5kZW50bGVuK3NpemVvZihzKSA+IHcgfHwgCi0gICAgICAgICAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpICYmIHN0cnN0cihzLCJcbiIpPi0xKSB7Ci0gICAgICAgcHJlZml4PWluZGVudCsiXG4iOwotICAgICAgIGluZGVudD0oZmxhZ3MgJiBCU19OT19QQVJJTkRFTlQpID8gIiIgOiAiICI7Ci0gICAgICAgaW5kZW50bGVuPXNpemVvZihpbmRlbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggZmxhZ3MgJiBCU19CTE9DSyApIHsKLSAgICAgIC8qCi0gICAgICAgICAgIHMgPSBpbXBsb2RlKCBtYXAoIGV4cGxvZGUoIHMsICJcbiIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2Jsb2NrX3N0cmluZywgdywgaW5kZW50bGVuLCBmbGFncyksCi0gICAgICAgICAgICAgICAgICAgICAgIiIgKTsKLSAgICAgICovCi0gICAgICBzID0gYmxvY2tfc3RyaW5nKCBzICwgdyAtIGluZGVudGxlbiwgZmxhZ3MgKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBzID0gc3ByaW50ZigiJS0xLio9cyIsdy1pbmRlbnRsZW4scyk7Ci0gICAgfQotICAgIGlmICggc1s8MV0gIT0gJ1xuJyApIHMgKz0gIlxuIjsKLQotICAgIGlmICggIWluZGVudGxlbiApIHJldHVybiBwcmVmaXggKyBzOwotICAgIAotICAgIHN0cmluZyBpbmRlbnQyID0gKCBmbGFncyAmIEJTX0lOREVOVF9PTkNFICkgPyAoIiAiKmluZGVudGxlbikgOmluZGVudDsKLSAgICAgIAotICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyAKLSAgICAgIHJlZ3JlcGxhY2UoIHNbMC4uPDJdLCAiXG4iLCAiXG4iK2luZGVudDIsIDEgKSArICJcbiI7Ci0gICAgICAvKgotICAgICAgIHN0cmluZyAqYnVmOwotCi0gICAgICAgYnVmID0gZXhwbG9kZSggcywgIlxuIiApOwotICAgICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyBpbXBsb2RlKCBidWZbMC4uPDJdLCAiXG4iK2luZGVudDIgKSArIGJ1Zls8MV0gKyAiXG4iOwotICAgICAgKi8KLX0KLQotLy8gKiBFbGVtZW50ZSBhdXMgbWFwcGluZyBsb2VzY2hlbiAtIG1hcHBpbmcgdm9yaGVyIGtvcGllcmVuCi0KLW1hcHBpbmcgbV9jb3B5X2RlbGV0ZShtYXBwaW5nIG0sIG1peGVkIGtleSkgewotICByZXR1cm4gbV9kZWxldGUoY29weShtKSwga2V5KTsKLX0KLQotLy8gKiB0aW1lcwotaW50IGxhc3RfcmVib290X3RpbWUoKQotewotICByZXR1cm4gX19CT09UX1RJTUVfXzsKLX0KLQotaW50IGZpcnN0X2Jvb3RfdGltZSgpCi17Ci0gIHJldHVybiA3MDE1MTc2MDA7Ci19Ci0KLWludCBleGlzdF9kYXlzKCkKLXsKLSAgcmV0dXJuICgoKHRpbWUoKS1maXJzdF9ib290X3RpbWUoKSkvODY0MCkrNSkvMTA7Ci19Ci0KLS8vICogdXB0aW1lIDopCi1zdHJpbmcgdXB0aW1lKCkKLXsKLSAgaW50IHQ7Ci0gIGludCB0bXA7Ci0gIHN0cmluZyBzOwotCi0gIHQ9dGltZSgpLV9fQk9PVF9USU1FX187Ci0gIHM9IiI7Ci0gIGlmICh0Pj04NjQwMCkKLSAgICBzKz1zcHJpbnRmKCIlZCBUYWclcywgIix0bXA9dC84NjQwMCwodG1wPT0xPyIiOiJlIikpOwotICBpZiAodD49MzYwMCkKLSAgICBzKz1zcHJpbnRmKCIlZCBTdHVuZGUlcywgIix0bXA9KHQ9dCU4NjQwMCkvMzYwMCwodG1wPT0xPyIiOiJuIikpOwotICBpZiAodD42MCkKLSAgICBzKz1zcHJpbnRmKCIlZCBNaW51dGUlcyB1bmQgIix0bXA9KHQ9dCUzNjAwKS82MCwodG1wPT0xPyIiOiJuIikpOwotICByZXR1cm4gcytzcHJpbnRmKCIlZCBTZWt1bmRlJXMiLHQ9dCU2MCwodD09MT8iIjoibiIpKTsKLX0KLQotLy8gKiBXYXMgdHVuIGJlaSAnZGFuZ2xpbmcnIGxmdW4tY2xvc3VyZXMgPwotdm9pZCBkYW5nbGluZ19sZnVuX2Nsb3N1cmUoKSB7Ci0gIHJhaXNlX2Vycm9yKCJkYW5nbGluZyBsZnVuIGNsb3N1cmVcbiIpOwotfQotCi0vLyAqIFNwZXJyZW4gYXVzc2VyIGZ1ZXIgbWFzdGVyL3NpbXVsX2VmdW4KLQotI2lmIF9fRUZVTl9ERUZJTkVEX18oc2V0X2Vudmlyb25tZW50KQotbm9tYXNrIHZvaWQgc2V0X2Vudmlyb25tZW50KG9iamVjdCBvMSwgb2JqZWN0IG8yKSB7Ci0gIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Ci19Ci0jZW5kaWYKLQotbm9tYXNrIHZvaWQgc2V0X3RoaXNfcGxheWVyKG9iamVjdCBwbCkgewotICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOwotfQotCi0jaWYgX19FRlVOX0RFRklORURfXyhleHBvcnRfdWlkKQotbm9tYXNrIHZvaWQgZXhwb3J0X3VpZChvYmplY3Qgb2IpIHsKLSAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKLX0KLSNlbmRpZgotCi0vLyAqIEpldHp0IGF1Y2ggY2xvc3VyZXMKLWludCBwcm9jZXNzX2ZsYWc7Ci0KLXB1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpCi17Ci0gIGlmIChwcm9jZXNzX2ZsYWc+MCkKLSAgICByZXR1cm4gcHJvY2Vzc19mbGFnOwotICBlbHNlIHJldHVybigwKTsKLX0KLQotcHJpdmF0ZSBub21hc2sgc3RyaW5nIF9wcm9jZXNzX3N0cmluZyhzdHJpbmcgc3RyLG9iamVjdCBwbykgewotICAgICAgICAgICAgICBzZXRfdGhpc19vYmplY3QocG8pOwotICAgICAgICAgICAgICByZXR1cm4oZWZ1bjo6cHJvY2Vzc19zdHJpbmcoc3RyKSk7Ci19Ci0KLW5vbWFzayBzdHJpbmcgcHJvY2Vzc19zdHJpbmcoIG1peGVkIHN0ciApCi17Ci0gIHN0cmluZyB0bXAsIGVycjsKLSAgaW50IGZsYWc7IAotCi0gIGlmICggY2xvc3VyZXAoc3RyKSApIHsKLSAgICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKLSAgICAgIHJldHVybiBmdW5jYWxsKHN0cik7Ci0gIH0KLSAgZWxzZSBpZiAoc3RyPT0wKQotICAgICAgcmV0dXJuKChzdHJpbmcpc3RyKTsKLSAgZWxzZSBpZiAoICFzdHJpbmdwKHN0cikgKSB7Ci0gICAgICByZXR1cm4gdG9fc3RyaW5nKHN0cik7Ci0gIH0KLQotICBpZiAoICEoZmxhZyA9IHByb2Nlc3NfZmxhZyA+IHRpbWUoKSAtIDYwKSkgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHByb2Nlc3NfZmxhZz10aW1lKCk7Ci0KLSAgZXJyID0gY2F0Y2godG1wID0gZnVuY2FsbCgjJ19wcm9jZXNzX3N0cmluZyxzdHIscHJldmlvdXNfb2JqZWN0KCkpOyBwdWJsaXNoKTsKLQotICBpZiAoICFmbGFnICkKLSAgICBwcm9jZXNzX2ZsYWc9MDsKLQotICBpZiAoZXJyKSB7Ci0gICAgLy8gVmVyYXJiZWl0dW5nIGFiYnJlY2hlbgotICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0gICAgcmFpc2VfZXJyb3IoZXJyKTsKLSAgfQotICByZXR1cm4gdG1wOwotfQotCi0vLyAnbWtkaXIgLXAnIC0gZXJ6ZXVndCBlaW5lIGtvbXBsZXR0ZSBIaWVyYXJjaGllIHZvbiBWZXJ6ZWljaG5pc3Nlbi4KLS8vIHdlbm4gZGFzIFZlcnplaWNobmlzIGFuZ2VsZWd0IHd1cmRlIG9kZXIgc2Nob24gZXhpc3RpZXJ0LCB3aXJkIDEKLS8vIHp1cnVlY2tnZWxpZWZlcnQsIHNvbnN0IDAuCi0vLyBXaXJmdCBlaW5lbiBGZWhsZXIsIHdlbm4gZGFzIGFuZ2ViZW5lIFZlcnplaWNobmlzIG5pY2h0IGFic29sdXQgaXN0IQotcHVibGljIGludCBta2RpcnAoc3RyaW5nIGRpcikgewotICAvLyB3ZW5uIGVzIG51ciBrZWluZW4gZnVlaHJlbmRlbiAvIGdpYnQsIGlzdCBkYXMgZWluIEZlaGxlci4KLSAgaWYgKHN0cnN0cihkaXIsICIvIikgIT0gMCkKLSAgICByYWlzZV9lcnJvcigibWtkaXJwKCk6IFBmYWQgaXN0IG5pY2h0IGFic29sdXRlLlxuIik7Ci0gIC8vIGN1dCBvZmYgdHJhaWxpbmcgLy4uLgotICBpZiAoZGlyWzwxXT09Jy8nKQotICAgICAgZGlyID0gZGlyWzAuLjwyXTsKLQotICBpbnQgZnN0YXQgPSBmaWxlX3NpemUoZGlyKTsKLSAgLy8gd2VubiBlcyBzY2hvbiBleGlzdGllcnQsIHR1biB3aXIgZWluZmFjaCBzbywgYWxzIGhhZXR0ZW4gd2lyIGVzIGFuZ2VsZWd0LgotICBpZiAoZnN0YXQgPT0gRlNJWkVfRElSKQotICAgIHJldHVybiAxOwotICAvLyB3ZW5uIHNjaG9uIG5lIERhdGVpIGV4aXN0aWVydCwgZ2VodCBlcyBuaWNodC4KLSAgaWYgKGZzdGF0ICE9IEZTSVpFX05PRklMRSkKLSAgICByZXR1cm4gMDsKLSAgLy8gd2VubiBlcyBudXIgZWluZW4gLyBnaWJ0IChkZW4gZnVlaHJlbmRlbiksIGRhbm4gaXN0IGVzIGVpbgotICAvLyB0b3BsZXZlbC12ZXJ6ZWljaG5pcywgd2FzIGRpcmVrdCBhbmdlbGVndCB3aXJkLgotICBpZiAoc3RycnN0cihkaXIsIi8iKT09MCkgewotICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKLSAgfQotCi0gIC8vIG1rZGlyKCkgbmljaHQgZGlyZWt0IHJ1ZmVuLCBzb25kZXJuIHZvcmhlciBhbHMgY2xvc3VyZSBhbnMgYXVmcnVmZW5kZQotICAvLyBPYmpla3QgYmluZGVuLiBTb25zdCBsYWV1ZnQgZGllIFJlY2h0ZXBydWVmdW5nIGluIHZhbGlkX3dyaXRlKCkgaW0gTWFzdGVyCi0gIC8vIHVudGVyIGRlciBBbm5haG1lLCBkYXNzIGRpZSBzaW11bF9lZnVuLmMgbWl0IGlocmVyIHJvb3QgaWQgd2FzIHdpbGwuCi0KLSAgLy8gamV0enQgcmVrdXJzaXYgZGllIFZlcnplaWNobmlzaGllcmFyY2hpZSBhbmxlZ2VuLiBXZW5uIGRhcyBlcmZvbGdyZWljaAotICAvLyBpc3QsIGRhbm4ga29lbm5lbiB3aXIgamV0enQgbWl0IG1rZGlyIGRhcyB0aWVmc3RlIFZlcnplaWNobmlzIGFubGVnZW4KLSAgaWYgKG1rZGlycChkaXJbMC4uc3RycnN0cihkaXIsIi8iKS0xXSkgPT0gMSkKLSAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7Ci19Ci0KLQotLy8gKiBQcm9wZXJ0aWVzIGdnZnMuIG1pdHNwZWljaGVybgotbWl4ZWQgc2F2ZV9vYmplY3QobWl4ZWQgbmFtZSkKLXsKLSAgbWFwcGluZyBwcm9wZXJ0aWVzOwotICBtYXBwaW5nIHNhdmU7Ci0gIG1peGVkIGluZGV4LCByZXM7Ci0gIGludCBpOwotCi0gIC8vIG51ciBTdHJpbmdzIHVuZCAwIHp1bGFzc2VuCi0gIGlmICgoIXN0cmluZ3AobmFtZSkgfHwgIXNpemVvZihuYW1lKSkgJiYgCi0gICAgICAoIWludHAobmFtZSkgfHwgbmFtZSE9MCkpIHsKLSAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0gICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAotICAgICAgICAgIk9ubHkgbm9uLWVtcHR5IHN0cmluZ3MgYW5kIDAgbWF5IGJlIHVzZWQgYXMgZmlsZW5hbWUgaW4gIgotICAgICAgICAgInNlZnVuOjpzYXZlX29iamVjdCgpISBBcmd1bWVudCB3YXMgJU9cbiIsbmFtZSkpOwotICB9Ci0KLSAgc2F2ZSA9IG1fYWxsb2NhdGUoMCwgMik7Ci0gIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7Ci0KLSAgaWYobWFwcGluZ3AocHJvcGVydGllcykpCi0gIHsKLSAgICAvLyBkZWxldGUgYWxsIGVudHJpZXMgaW4gbWFwcGluZyBwcm9wZXJ0aWVzIHdpdGhvdXQgU0FWRSBmbGFnIQotICAgIGluZGV4ID0gbV9pbmRpY2VzKHByb3BlcnRpZXMpOwotICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wO2ktLSkKLSAgICB7Ci0gICAgICBpZihwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYgU0FWRSkKLSAgICAgIHsKLSAgICAgICBzYXZlW2luZGV4W2ldXSA9IHByb3BlcnRpZXNbaW5kZXhbaV1dOwotICAgICAgIHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0gPQotICAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJgotICAgICAgICAgICAgICAgICAgICAofihTRVRNTk9URk9VTkR8UVVFUllNTk9URk9VTkR8UVVFUllDQUNIRUR8U0VUQ0FDSEVEKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2Ugc2F2ZSA9IChbXSk7Ci0KLSAgLy8gc2F2ZSBvYmplY3QhCi0gIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YShzYXZlKTsKLSAgLy8gZm9ybWF0OiB3aWUgZGVmaW5pZXJ0IGluIGNvbmZpZy5oCi0gIGlmIChzdHJpbmdwKG5hbWUpKQotICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lLAotICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOwotICBlbHNlCi0gICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksCi0gICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7Ci0gIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKLQotI2lmZGVmIElPU1RBVFMKLSAgLy8gU3RhdHMuLi4KLSAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7Ci0gIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOwotICBzdGF0LT50aW1lID0gdGltZSgpOwotICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKLSAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7Ci0gIGlmIChzdHJpbmdwKG5hbWUpKQotICAgICAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7Ci0gIGVsc2UKLSAgICAgIHN0YXQtPnNpemVvZihyZXMpOwotICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7Ci0gIHNhdmVvX3N0YXRbMV1bc2F2ZW9fc3RhdFswXV0gPSBzdGF0OwotICBzYXZlb19zdGF0WzBdID0gKHNhdmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihzYXZlb19zdGF0WzFdKTsKLSAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbyAyOiAiK3NhdmVvX3N0YXRbMF0rIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmVzOwotfQotCi0vLyAqIEF1Y2ggUHJvcGVydGllcyBsYWRlbgotaW50IHJlc3RvcmVfb2JqZWN0KHN0cmluZyBuYW1lKQotewotICBpbnQgcmVzdWx0OwotICBtaXhlZCBpbmRleDsKLSAgbWl4ZWQgc2F2ZTsKLSAgbWFwcGluZyBwcm9wZXJ0aWVzOwotICBpbnQgaTsKLSAgY2xvc3VyZSBjbDsKLQotICAvLyBnZXQgYWN0dWFsIHByb3BlcnR5IHNldHRpbmdzIChieSBjcmVhdGUoKSkKLSAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKLQotLy8gIERFQlVHKHNwcmludGYoIlJFU1RPUkUgJU9cbiIsbmFtZSkpOwotICAvLyByZXN0b3JlIG9iamVjdAotICByZXN1bHQ9ZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnJlc3RvcmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUpOwotICAvLycpKQotICAvL19nZXRfc2F2ZV9kYXRhIGxpZWZlcnQgdGF0c2FlY2hsaWNoIG1peGVkIHp1cnVlY2ssIHdlbm4gZGFzIGF1Y2ggaW1tZXIgZWluIAotICAvL21hcHBpbmcgc2VpbiBzb2xsdGUuCi0gIHNhdmUgPSAobWl4ZWQpcHJldmlvdXNfb2JqZWN0KCktPl9nZXRfc2F2ZV9kYXRhKCk7Ci0gIGlmKG1hcHBpbmdwKHNhdmUpKQotICB7Ci0gICAgaW5kZXggPSBtX2luZGljZXMoc2F2ZSk7Ci0gICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7IGktLSkKLSAgICB7Ci0gICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldXSA9IHNhdmVbaW5kZXhbaV1dOwotICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSA9IHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmfihTRVRDQUNIRUR8UVVFUllDQUNIRUQpOwotICAgIH0KLSAgfQotICBlbHNlIHByb3BlcnRpZXMgPSAoW10pOwotCi0gIC8vIHJlc3RvcmUgcHJvcGVydGllcwotICBmdW5jYWxsKAotICAgICAgICAgIGJpbmRfbGFtYmRhKAotICAgICAgICAgICAgICAgICAgICAgdW5ib3VuZF9sYW1iZGEoKHsnYXJnfSksIC8vJ30pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsKHsjJ3RoaXNfb2JqZWN0fSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFByb3BlcnRpZXMiLCdhcmd9KSksLy8nKQotICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLHByb3BlcnRpZXMpOwotICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7Ci0KLSNpZmRlZiBJT1NUQVRTCi0gIC8vIFN0YXRzLi4uCi0gIC8vZGVidWdfbWVzc2FnZSgicmVzdG9yZW86ICIrcmVzdG9yZW9fc3RhdFswXSsiXG4iKTsKLSAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7Ci0gIHN0YXQtPm9uYW1lID0gb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpOwotICBzdGF0LT50aW1lID0gdGltZSgpOwotICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKLSAgLy8gICAgT0lNX1RPVEFMX0RBVEFfU0laRSk7Ci0gIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOwotICByZXN0b3Jlb19zdGF0WzFdW3Jlc3RvcmVvX3N0YXRbMF1dID0gc3RhdDsKLQotICByZXN0b3Jlb19zdGF0WzBdID0gKHJlc3RvcmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihyZXN0b3Jlb19zdGF0WzFdKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vICogSEIgZWluZXMgT2JqZWt0ZXMgZWluL2F1c3NjaGFsdGVuCi1pbnQgc2V0X29iamVjdF9oZWFydF9iZWF0KG9iamVjdCBvYiwgaW50IGZsYWcpCi17Ci0gIGlmIChvYmplY3RwKG9iKSkKLSAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNvbmZpZ3VyZV9vYmplY3Qsb2IpLCBvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7Ci19Ci0KLS8vICogTWFnaWVybGV2ZWxncnVwcGVuIGVybWl0dGVsbgotaW50IHF1ZXJ5X3dpel9ncnAobWl4ZWQgd2l6KQotewotICBpbnQgbGV2OwotCi0gIGxldj1xdWVyeV93aXpfbGV2ZWwod2l6KTsKLSAgaWYgKGxldjxTRUVSX0xWTCkgcmV0dXJuIDA7Ci0gIGlmIChsZXY+PUdPRF9MVkwpIHJldHVybiBsZXY7Ci0gIGlmIChsZXY+PUFSQ0hfTFZMKSByZXR1cm4gQVJDSF9HUlA7Ci0gIGlmIChsZXY+PUVMREVSX0xWTCkgcmV0dXJuIEVMREVSX0dSUDsKLSAgaWYgKGxldj49TE9SRF9MVkwpIHJldHVybiBMT1JEX0dSUDsKLSAgaWYgKGxldj49U1BFQ0lBTF9MVkwpIHJldHVybiBTUEVDSUFMX0dSUDsKLSAgaWYgKGxldj49RE9NQUlOTUVNQkVSX0xWTCkgcmV0dXJuIERPTUFJTk1FTUJFUl9HUlA7Ci0gIGlmIChsZXY+PVdJWkFSRF9MVkwpIHJldHVybiBXSVpBUkRfR1JQOwotICBpZiAobGV2Pj1MRUFSTkVSX0xWTCkgcmV0dXJuIExFQVJORVJfR1JQOwotICByZXR1cm4gU0VFUl9HUlA7Ci19Ci0KLW1peGVkICp3aXpsaXN0X2luZm8oKQotewotICBpZiAoQVJDSF9TRUNVUklUWSB8fCAhZXh0ZXJuX2NhbGwoKSkKLSAgICAgICAgICAgIHJldHVybiBlZnVuOjp3aXpsaXN0X2luZm8oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vICogd2l6bGlzdCBhdXNnZWJlbgotdmFyYXJncyB2b2lkIHdpemxpc3Qoc3RyaW5nIG5hbWUsIGludCBzb3J0a2V5ICkgewotCi0gIGlmICghbmFtZSkKLSAgewotICAgIGlmICh0aGlzX3BsYXllcigpKQotICAgICAgbmFtZSA9IGdldHVpZCh0aGlzX3BsYXllcigpKTsKLSAgICBpZiAoIW5hbWUpCi0gICAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTY2hsdWVzc2VsIGRhcmYgbnVyIGluIGVpbmVtIGd1ZWx0aWdlbiBCZXJlaWNoIHNlaW4KLSAgaWYgKHNvcnRrZXk8V0xfTkFNRSB8fCBzb3J0a2V5Pj1XTF9TSVpFKSBzb3J0a2V5PVdMX0NPU1Q7Ci0KLSAgbWl4ZWQqKiB3bCA9IGVmdW46Ondpemxpc3RfaW5mbygpOwotICAvLyBuYWNoIDxzb3J0a2V5PiBzb3J0aWVyZW4KLSAgd2wgPSBzb3J0X2FycmF5KHdsLCBmdW5jdGlvbiBpbnQgKG1peGVkIGEsIG1peGVkIGIpCi0gICAgICB7cmV0dXJuIGFbc29ydGtleV0gPCBiW3NvcnRrZXldOyB9ICk7Ci0KLSAgLy8gU3VtbWUgdWViZXIgYWxsZSBLb21tYW5kb3MgZXJtaXR0ZWxuLgotICBpbnQgdG90YWxfY21kLCBpOwotICBpbnQgcG9zPS0xOwotICBmb3JlYWNoKG1peGVkIGVudHJ5IDogd2wpCi0gIHsKLSAgICB0b3RhbF9jbWQgKz0gZW50cnlbV0xfQ09NTUFORFNdOwotICAgIGlmIChlbnRyeVtXTF9OQU1FXSA9PSBuYW1lKQotICAgICAgcG9zID0gaTsKLSAgICArK2k7Ci0gIH0KLQotICBpZiAocG9zIDwgMCAmJiBuYW1lICE9ICJBTEwiICYmIG5hbWUgIT0gIlRPUDEwMCIpCi0gICAgcmV0dXJuOwotCi0gIGlmIChuYW1lID09ICJUT1AxMDAiKQotICB7Ci0gICAgaWYgKHNpemVvZih3bCkgPiAxMDApCi0gICAgICB3bCA9IHdsWzAuLjEwMF07Ci0gICAgZWxzZQotICAgICAgd2wgPSB3bDsKLSAgfQotICAvLyB1bSBuYW1lIGhlcnVtIHNjaG5laWRlbgotICBlbHNlIGlmIChuYW1lICE9ICJBTEwiKQotICB7Ci0gICAgaWYgKHNpemVvZih3bCkgPD0gMjEpCi0gICAgICB3bCA9IHdsOwotICAgIGVsc2UgaWYgKHBvcyArIDEwIDwgc2l6ZW9mKHdsKSAmJiBwb3MgLSAxMCA+IDApCi0gICAgICB3bCA9IHdsW3Bvcy0xMC4ucG9zKzEwXTsKLSAgICBlbHNlIGlmIChwb3MgPD0yMSkKLSAgICAgIHdsID0gd2xbMC4uMjBdOwotICAgIGVsc2UgaWYgKHBvcyA+PSBzaXplb2Yod2wpIC0gMjEpCi0gICAgICB3bCA9IHdsWzwyMS4uXTsKLSAgICBlbHNlCi0gICAgICB3bCA9IHdsOwotICB9Ci0KLSAgd3JpdGUoIlxuV2l6YXJkIHRvcCBzY29yZSBsaXN0XG5cbiIpOwotICBpZiAodG90YWxfY21kID09IDApCi0gICAgdG90YWxfY21kID0gMTsKLSAgcHJpbnRmKCIlLTIwcyAlLTZzICUtM3MgJS0xN3MgJS02cyAlLTZzICUtNnNcbiIsCi0gICAgICAgICAiRVVJRCIsICJjbWRzIiwgIiUiLCAiQ29zdHMiLCAiSEIiLCAiQXJyYXlzIiwiTWFwcC4iKTsKLSAgZm9yZWFjaChtaXhlZCBlOiB3bCkKLSAgewotICAgIHByaW50ZigiJS06MjBzICU6NmQgJToyZCUlIFslOjZkaywlOjZkR10gJTo2ZCAlOjZkICU6NmRcbiIsCi0gICAgICAgICAgZVtXTF9OQU1FXSwgZVtXTF9DT01NQU5EU10sIGVbV0xfQ09NTUFORFNdICogMTAwIC8gdG90YWxfY21kLAotICAgICAgICAgIGVbV0xfQ09TVF0gLyAxMDAwLCBlW1dMX1RPVEFMX0dJR0FDT1NUXSwKLSAgICAgICAgICBlW1dMX0hFQVJUX0JFQVRTXSwgZVtXTF9BUlJBWV9UT1RBTF0sIGVbV0xfTUFQUElOR19UT1RBTF0KLSAgICAgICAgICApOwotICB9Ci0gIHByaW50ZigiXG5Ub3RhbCAgICAgICAgICU3ZCAgICAgICAgICglZClcblxuIiwgdG90YWxfY21kLCBzaXplb2Yod2wpKTsKLX0KLQotCi0vLyBBYiBoaWVyIGZvbGdlbiBIaWxmc2Z1bmt0aW9uZW4gZnVlciBjYWxsX291dCgpIGJ6dy4gZnVlciBkZXJlbiBCZWdyZW56dW5nCi0KLS8vIGVybWl0dGVsdCBkYXMgT2JqZWt0IGRlcyBDYWxsb3V0cy4KLXByaXZhdGUgb2JqZWN0IF9jYWxsX291dF9vYmooIG1peGVkIGNhbGxfb3V0ICkgewotICAgIHJldHVybiBwb2ludGVycChjYWxsX291dCkgPyBjYWxsX291dFswXSA6IDA7Ci19Ci0KLXByaXZhdGUgdm9pZCBfc2FtZV9vYmplY3QoIG9iamVjdCBvYiwgbWFwcGluZyBtICkgewotICAvLyBpc3QgbmljaHQgc28gYmxvZWQsIHdpZSBlcyBhdXNzaWVodCwgcy4gbmFjaGZvbGdlZGUgVmVyd2VuZHVuZyB2b24gbQotICBpZiAoIG1bb2JdICkKLSAgICBtW29iXSArPSAoeyBvYiB9KTsKLSAgZWxzZQotICAgIG1bb2JdID0gKHsgb2IgfSk7IAotfQotCi0vLyBhbGxlIE9iamVrdGUgaW0gTWFwcGluZyBtIHp1c2FtbWVuZmFzc2VuLCBkaWUgZGVuIGdsZWljaGVuIExvYWRuYW1lIChOYW1lIGRlcgotLy8gQmx1ZXByaW50KSBoYWJlbiwgYWxzbyBhbGxlIENsb25lcyBkZXIgQlAsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4uCi0vLyBPYmpla3RlIHdlcmRlbiBhdWNoIG1laHJmYWNoIGVyZmFzc3QsIGplIG5hY2ggQW56YWhsIGlocmVyIENhbGxvdXRzLgotcHJpdmF0ZSB2b2lkIF9zYW1lX3BhdGgoIG9iamVjdCBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0gKSB7Ci0gIHN0cmluZyBwYXRoOwotICBpZiAoIW9iamVjdHAoa2V5KSB8fCAhcG9pbnRlcnAob2JzKSkgcmV0dXJuOwotCi0gIHBhdGggPSBsb2FkX25hbWUoa2V5KTsKLQotICBpZiAoIG1bcGF0aF0gKQotICAgIG1bcGF0aF0gKz0gb2JzOwotICBlbHNlCi0gICAgbVtwYXRoXSA9IG9iczsKLX0KLQotLy8ga2V5IGthbm4gb2JqZWN0IG9kZXIgc3RyaW5nIHNlaW4uCi1wcml2YXRlIGludCBfdG9vX21hbnkoIG1peGVkIGtleSwgbWFwcGluZyBtLCBpbnQgaSApIHsKLSAgICByZXR1cm4gc2l6ZW9mKG1ba2V5XSkgPj0gaTsKLX0KLQotLy8gYWxsZSBPYmpla3RlIGluIG9icyB6ZXJzdG9lcmVuIHVuZCBGZWhsZXJtZWxkdW5nIGF1c2dlYmVuLiBBQ0hUVU5HOiBEaWUKLS8vIE9iamVrdGUgd2VyZGVuIGlkUiB6dSBlaW5lciBCUCBnZWhvZXJlbiwgbXVlc3NlbiBhYmVyIG5pY2h0ISBJbiBkZW0gRmFsbAotLy8gd2lyZCBhdWYgZGVyIEViZW5lIGFiZXIgbnVyIGVpbiBPYmpla3QgaW4gZGVyIEZlaGxlcm1lbGR1bmcgZXJ3YWVobnQuCi1wcml2YXRlIHZvaWQgX2Rlc3Ryb3koIG1peGVkIGtleSwgb2JqZWN0ICpvYnMsIHN0cmluZyB0ZXh0LCBpbnQgdWlkICkgewotICAgIGlmICghcG9pbnRlcnAob2JzKSkgcmV0dXJuOwotICAgIC8vIEFycmF5IG1pdCB1bmlxdWUgRWludHJhZWdlIGVyemV1Z2VuLgotICAgIG9icyA9IG1faW5kaWNlcyggbWttYXBwaW5nKG9icykgKTsKLSAgICAvLyBGZWhsZXJtZWxkdW5nIGF1ZiBkZXIgRWJlbmUgYXVzZ2ViZW4sIGltIGNhdGNoKCkgbWl0IHB1Ymxpc2gsIGRhbWl0IGVzCi0gICAgLy8gYXVmIGRlciBFYmVuZSBkaXJla3Qgc2Nyb2xsdCwgZGVyIGJhY2t0cmFjZSB2ZXJmdWVnYmFyIGlzdCAoaW0KLSAgICAvLyBnZWdlbnNhdHogenVyIExvZXN1bmcgbWl0dGVscyBDYWxsb3V0KSwgZGllIEF1c2Z1ZWhydW5nIGFiZXIgd2VpdGVyCi0gICAgLy8gbGFldWZ0LgotICAgIGNhdGNoKCBlZnVuOjpyYWlzZV9lcnJvciggICAgICAgICAgIAotICAgICAgICAgc3ByaW50ZiggdGV4dCwgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgIHVpZCA/IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShrZXkpIDoga2V5LCAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgc2l6ZW9mKG9icyksIG9iamVjdF9uYW1lKG9ic1s8MV0pICkgKTtwdWJsaXNoKTsKLSAgICAvLyBVbmQgd2VnIG1pdCBkZW0gS3JhbS4uLgotICAgIGZpbHRlciggb2JzLCAjJ2VmdW46OmRlc3RydWN0LyonKi8gKTsKLX0KLQotLy8gQWxsZSBPYmpla3QgZWluZXIgVUlEIGltIE1hcHBpbmcgbSBtaXQgVUlEIGFscyBLRXlzIHp1c2FtbWVuZmFzc2VuLiBPYmpla3QKLS8vIHNpbmQgZGFiZWkgbmljaHQgdW5pcXVlLgotcHJpdmF0ZSB2b2lkIF9zYW1lX3VpZCggc3RyaW5nIGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSwgY2xvc3VyZSBjZiApIHsKLSAgc3RyaW5nIHVpZDsKLQotICBpZiAoICFwb2ludGVycChvYnMpIHx8ICFzaXplb2Yob2JzKSApCi0gICAgcmV0dXJuOwotCi0gIHVpZCA9IGZ1bmNhbGwoIGNmLCBrZXkgKTsKLQotICBpZiAoIG1bdWlkXSApCi0gICAgbVt1aWRdICs9IG9iczsgLy8gb2JzIGlzdCBuZW4gQXJyYXkKLSAgZWxzZQotICAgIG1bdWlkXSA9IG9iczsKLX0KLQotbm9tYXNrIHZhcmFyZ3Mgdm9pZCBjYWxsX291dCggdmFyYXJncyBtaXhlZCAqYXJncyApCi17Ci0gICAgbWl4ZWQgdG1wLCAqY2FsbF9vdXRzOwotCi0gICAgLy8gQmVpID42MDAgQ2FsbG91dHMgYWxsZSBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDMwIENhbGxvdXRzIGxhdWZlbgotICAgIC8vIGhhYmVuLgotICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDYwMAotICAgICAgICAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQgKQotICAgIHsKLSAgICAgICAvLyBMb2cgZXJ6ZXVnZW4uLi4KLSAgICAgIAotICAgICAgIC8vIE9iamVrdGUgYWxsZXIgQ2FsbG91dHMgZXJtaXR0ZWxuCi0gICAgICAgY2FsbF9vdXRzID0gbWFwKCBlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2NhbGxfb3V0X29iaiApOwotICAgICAgIG1hcHBpbmcgb2JqZWN0bWFwID0gKFtdKTsKLSAgICAgICBmaWx0ZXIoIGNhbGxfb3V0cywgIydfc2FtZV9vYmplY3QsICZvYmplY3RtYXAgKTsKLSAgICAgICAvLyBNYXN0ZXIgbmljaHQgZ3JpbGxlbi4uLgotICAgICAgIGVmdW46Om1fZGVsZXRlKCBvYmplY3RtYXAsIG1hc3RlcigxKSApOwotICAgICAgIC8vIGFsbGUgT2JqZWt0ZSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgotICAgICAgIG1hcHBpbmcgcmVzID0gZmlsdGVyX2luZGljZXMoIG9iamVjdG1hcCwgIydfdG9vX21hbnksIG9iamVjdG1hcCwgMjkgKTsKLSAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBLZXkgdW5kIEFycmF5IG1pdAotICAgICAgIC8vIE9iamVrdGVuIHVlYmVyZ2ViZW4gKGluIGRpZXNlbSBGYWxsIHNpbmQgS2V5cyB1bmQgQXJyYXkgbWl0Ci0gICAgICAgLy8gT2JqZWt0ZW4gamV3ZWlscyBkYXMgZ2xlaWNoZSBPYmpla3QpLgotICAgICAgIGlmICggc2l6ZW9mKHJlcykgKSAgICAgICAKLSAgICAgICAgICAgd2Fsa19tYXBwaW5nKHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5IHNpbmdsZSAiICAgICAgICAgICAgIAotICAgICAgICAgICAgICAib2JqZWN0IFslT10uIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOwotCi0gICAgICAgLy8gQmVpIChhdWNoIG5hY2ggZGVtIGVyc3RlbiBBdWZyYWV1bWVuIG5vY2gpID44MDAgQ2FsbG91dHMgYWxsZQotICAgICAgIC8vIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgNTAgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuIC0gdW5kCi0gICAgICAgLy8gZGllc21hbCB6YWVobGVuIENsb25lcyBuaWNodCBlaWdlbnN0YWVuZGlnISBELmguIGVzIHdlcmRlbiBhbGxlCi0gICAgICAgLy8gQ2xvbmVzIGVpbmVyIEJQIGdla2lsbHQsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4sIGZhbGxzIGFsbGUKLSAgICAgICAvLyBkaWVzZSBPYmpla3RlIF96dXNhbW1lbl8gbWVociBhbHMgNTAgQ2FsbG91dHMgaGFiZW4hCi0gICAgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gODAwICkgewotICAgICAgICAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgdm9uIGRlciBsZXR6dGVuIEFrdGlvbiBzaW5kIGluIG9iamVjdG1hcCBuaWNodAotICAgICAgICAgICAvLyBtZWhyIGRyaW4sIGRhIHNpZSBkb3J0IGFscyBLZXlzIHZlcndlbmRldCB3dXJkZW4uCi0gICAgICAgICAgIG1hcHBpbmcgcGF0aG1hcD0oW10pOwotICAgICAgICAgICAvLyBhbGxlIE9iamVrdCBlaW5lciBCUCBpbiByZXMgc29ydGllcmVuLCBCUC1OYW1lIGFscyBLZXksIEFycmF5cwotICAgICAgICAgICAvLyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgotICAgICAgICAgICB3YWxrX21hcHBpbmcoIG9iamVjdG1hcCwgIydfc2FtZV9wYXRoLCAmcGF0aG1hcCk7Ci0gICAgICAgICAgIC8vIGFsbGUgQlBzICh1bmQgaWhyZSBPYmpla3RlKSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgotICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggcGF0aG1hcCwgIydfdG9vX21hbnkvKicqLywgcGF0aG1hcCwgNTAgKTsKLSAgICAgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gZGllIENsb25lcwotICAgICAgICAgICAvLyB1ZWJlcmdlYmVuLCBkaWUgQ2FsbG91dHMgaGFiZW4uCi0gICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQotICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveS8qJyovLCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgZmlsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7Ci0KLSAgICAgICAgICAgLy8gV2VubiBiZWlkZSBBdWZyYWV1bWFyYmVpdGVuIG5pY2h0cyBnZWJyYWNodCBoYWJlbiB1bmQgaW1tZXIKLSAgICAgICAgICAgLy8gbm9jaCA+MTAwMCBDYWxsb3V0cyBsYXVmZW4sIHdlcmRlbiBkaWVzbWFsIGFsbGUgQ2FsbG91dHMKLSAgICAgICAgICAgLy8gZWluZXIgVUlEIHp1c2FtbWVuZ2V6YWVobHQuCi0gICAgICAgICAgIC8vIEFsbGUgT2JqZWt0ZSBlaW5lciBVSUQsIGRpZSBlcyBpbiBTdW1tZSBhbGxlciBpaHJlciBPYmpla3QgbWl0Ci0gICAgICAgICAgIC8vIENhbGxvdXRzIGF1ZiBtZWhyIGFscyAxMDAgQ2FsbG91dHMgYnJpbmd0LCB3ZXJkZW4gZ2Vyb2VzdGV0LgotICAgICAgICAgICBpZiAoZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDEwMDApCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gZGFzIG5hY2ggQlAtTmFtZW4gdm9yZ2VmaWx0ZXJ0ZSBNYXBwaW5nIGpldHp0IG5hY2ggVUlEcwotICAgICAgICAgICAgICAvLyB6dXNhbW1lbnNvcnRpZXJlbi4gWmVyc3RvZXJ0ZSBDbG9uZXMgZmlsdGVyIF9zYW1lX3VpZCgpCi0gICAgICAgICAgICAgIC8vIHJhdXMuCi0gICAgICAgICAgICAgIG1hcHBpbmcgdWlkbWFwPShbXSk7Ci0gICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcGF0aG1hcCwgIydfc2FtZV91aWQsICZ1aWRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfZnVuY3Rpb24oICJjcmVhdG9yX2ZpbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zZWN1cmUvbWFzdGVyIiApICk7Ci0gICAgICAgICAgICAgIC8vIEluIHJlcyBudW4gVUlEcyBhbHMgS2V5cyB1bmQgQXJyYXlzIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCi0gICAgICAgICAgICAgIC8vIERpZSByYXVzZmlsdGVybiwgZGllIG1laHIgYWxzIDEwMCBPYmpla3RlIChub24tdW5pcXVlLCBkLmguCi0gICAgICAgICAgICAgIC8vIDEwMCBDYWxsb3V0cyEpIGhhYmVuLgotICAgICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggdWlkbWFwLCAjJ190b29fbWFueSwgdWlkbWFwLCAxMDAgKTsKLSAgICAgICAgICAgICAgLy8gdW5kIGVybmV1dCB1ZWJlciBkaWUgS2V5cyBsYXVmZW4gdW5kIGpld2VpbHMgZGllIEFycmF5cyBtaXQKLSAgICAgICAgICAgICAgLy8gZGVuIE9iamVrdGVuIHp1ciBaZXJzdG9lcnVuZyBhbiBfZGVzdHJveSgpLi4uCi0gICAgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQotICAgICAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVUlEICclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGYWxscyBkYXMgYXVmcnVmZW5kZSBPYmpla3QgemVyc3RvZXJ0IHd1cmRlIGJlaW0gQXVmcmFldW1lbgotICAgIGlmICggIXByZXZpb3VzX29iamVjdCgpICkKLSAgICAgICByZXR1cm47Ci0KLSAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7Ci0gICAgYXBwbHkoICMnZWZ1bjo6Y2FsbF9vdXQsIGFyZ3MgKTsKLSAgICByZXR1cm47Ci19Ci0KLW1peGVkIGNhbGxfb3V0X2luZm8oKSB7Ci0gIAotICBvYmplY3QgcG8gPSBwcmV2aW91c19vYmplY3QoKTsKLSAgbWl4ZWQgY29pID0gZWZ1bjo6Y2FsbF9vdXRfaW5mbygpOwotCi0gIC8vIHVuZ2VmaWx0ZXJ0ZW4gT3V0cHV0IG51ciBmdWVyIGJlc3RpbW10ZSBPYmpla3RlLCBPYmpla3RlIGluIC9zdGQgb2RlcgotICAvLyAvb2JqIGhhYmVuIGRpZSBCYWNrYm9uZUlELgotICBpZiAocXVlcnlfd2l6X2xldmVsKGdldHVpZChwbykpID49IEFSQ0hfTFZMCi0gICAgICAgfHwgKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGxvYWRfbmFtZShwbykpID09IEJBQ0tCT05FSUQgKSB7Ci0gICAgICByZXR1cm4gY29pOwotICB9Ci0gIGVsc2UgewotICAgICAgcmV0dXJuIGZpbHRlcihjb2ksIGZ1bmN0aW9uIG1peGVkIChtaXhlZCBhcnIpIHsKLSAgICAgICAgICAgICAgaWYgKHBvaW50ZXJwKGFycikgJiYgYXJyWzBdPT1wbykKLSAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7IH0pOwotICB9Ci19Ci0KLS8vICogWnUgZWluZXIgY2xvc3VyZSBkYXMgT2JqZWt0LCBhbiBkYXMgc2llIGdlYnVuZGVuIGlzdCwgc3VjaGVuCi1taXhlZCBxdWVyeV9jbG9zdXJlX29iamVjdChjbG9zdXJlIGMpIHsKLSAgcmV0dXJuCi0gICAgQ0xPU1VSRV9JU19VTkJPVU5EX0xBTUJEQShnZXRfdHlwZV9pbmZvKGMsIDEpKSA/Ci0gICAgICAwIDoKLSAgKHRvX29iamVjdChjKSB8fCAtMSk7Ci19Ci0KLS8vICogV2lyIHdvbGxlbiBudXIgRUlOIEFyZ3VtZW50IC4uLiBhdXNzZXJkZW0gY2hlY2tzIGZ1ZXIgZGVuIE5ldHp0b3RlbnJhdW0KLXZhcmFyZ3Mgdm9pZCBtb3ZlX29iamVjdChtaXhlZCB3aGF0LCBtaXhlZCB3aGVyZSkKLXsKLSAgb2JqZWN0IHBvLHRtcDsKLQotICBwbz1wcmV2aW91c19vYmplY3QoKTsKLSAgaWYgKCF3aGVyZSkKLSAgewotICAgIHdoZXJlPXdoYXQ7Ci0gICAgd2hhdD1wbzsKLSAgfQotICBpZiAoKChzdHJpbmdwKHdoZXJlKSAmJiB3aGVyZT09TkVUREVBRF9ST09NICkgfHwKLSAgICAgICAob2JqZWN0cCh3aGVyZSkgJiYgd2hlcmU9PWZpbmRfb2JqZWN0KE5FVERFQURfUk9PTSkpKSAmJgotICAgICAgIG9iamVjdHAod2hhdCkgJiYgb2JqZWN0X25hbWUod2hhdCkhPSIvb2JqL3NwZXJyZXIiKQotICB7Ci0gICAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdoYXQpKQotICAgIHsKLSAgICAgIHdoYXQtPnJlbW92ZSgpOwotICAgICAgaWYgKHdoYXQpIGRlc3RydWN0KHdoYXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobGl2aW5nKHdoYXQpIHx8IGludGVyYWN0aXZlKHdoYXQpKQotICAgIHsKLSAgICAgIGxvZ19maWxlKCJOREVBRDIiLHNwcmludGYoIlRSWUVEIFRPIE1PVkUgVE8gTkVUREVBRDogJU9cbiIsd2hhdCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQod2hhdCwwKTsKLSAgfQotICB0bXA9d2hhdDsKLSAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQotICAgICAgLy8gSmEuIE1hbiBydWZ0IGRpZSBfc2V0X3h4eCgpLUZ1bmt0aW9uZW4gZWlnZW50bGljaCBuaWNodCBkaXJla3QgYXVmLgotICAgICAgLy8gQWJlciBkYXMgTGljaHRzeXN0ZW0gaXN0IHNjaG9uICpzbyogcmVjaGVuaW50ZW5zaXYgdW5kIGdlcmFkZSBkZXIKLSAgICAgIC8vIFBfTEFTVF9DT05URU5UX0NIQU5HRS1DYWNoZSB3aXJkICpzbyogb2Z0IGJlbm9ldGlndCwgZGFzcyBlcyBtaXIKLSAgICAgIC8vIGRhIHVtIGplZGVzIGJpc3NjaGVuIFJlY2hlbnplaXQgZ2VodC4KLSAgICAgIC8vIERlciBad2VjayBoZWlsaWd0IGphIGJla2FubnRsaWNoIGRpZSBNaXR0ZWwuIDstKQotICAgICAgLy8KLSAgICAgIC8vIFRpYW1hawotICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7Ci0gIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjptb3ZlX29iamVjdCxwbyksd2hhdCx3aGVyZSk7Ci0gIGlmICh0bXA9d2hhdCkKLSAgICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCi0gICAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOwotfQotCi0KLXZvaWQgc3RhcnRfc2ltdWxfZWZ1bigpIHsKLSAgbWl4ZWQgKmluZm87Ci0KLSAgLy8gRmFsbHMgbm9jaCBuaWNodCBnZXRhbiwgZXh0cmFfd2l6aW5mbyBpbml0aWFsaXNpZXJlbgotICBpZiAoICFwb2ludGVycChpbmZvID0gZ2V0X2V4dHJhX3dpemluZm8oMCkpICkKLSAgICBzZXRfZXh0cmFfd2l6aW5mbygwLCBpbmZvID0gYWxsb2NhdGUoQkFDS0JPTkVfV0laSU5GT19TSVpFKSk7Ci0KLSAgSW5pdExpdmluZ0RhdGEoaW5mbyk7Ci0KLSAgc2V0X25leHRfcmVzZXQoMTApOyAvLyBkaXJla3QgbWFsIGF1ZnJhZXVtZW4KLX0KLQotcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0gIHNldF9uZXh0X3Jlc2V0KDcyMDApOwotICBDbGVhbkxpdmluZ0RhdGEoKTsKLX0KLQotI2lmICFfX0VGVU5fREVGSU5FRF9fKGFic29sdXRlX2hiX2NvdW50KQotaW50IGFic29sdXRlX2hiX2NvdW50KCkgewotICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOwotfQotI2VuZGlmCi0KLXZvaWQgX19zZXRfZW52aXJvbm1lbnQob2JqZWN0IG9iLCBtaXhlZCB0YXJnZXQpCi17Ci0gIHN0cmluZyBwYXRoOwotICBvYmplY3Qgb2JqOwotCi0gIGlmICghb2JqZWN0cChvYikpCi0gICAgcmV0dXJuOwotICBpZiAoIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIHx8ICFBUkNIX1NFQ1VSSVRZICkKLSAgICByZXR1cm47Ci0gIGlmIChvYmplY3RwKHRhcmdldCkpCi0gIHsKLSAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2IsdGFyZ2V0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcGF0aD0oc3RyaW5nKU1BU1RFUi0+X2dldF9wYXRoKHRhcmdldCx0aGlzX2ludGVyYWN0aXZlKCkpOwotICBpZiAoc3RyaW5ncChwYXRoKSAmJiBmaWxlX3NpemUocGF0aCsiLmMiKT49MCAmJgotICAgICAgIWNhdGNoKGxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpICkKLSAgewotICAgIG9iaj1maW5kX29iamVjdChwYXRoKTsKLSAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2Isb2JqKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBfZHVtcF93aXpsaXN0KHN0cmluZyBmaWxlLCBpbnQgc29ydGJ5KSB7Ci0gIGludCBpOwotICBtaXhlZCAqYTsKLQotICBpZiAoIUxPUkRfU0VDVVJJVFkpCi0gICAgcmV0dXJuOwotICBpZiAoIW1hc3RlcigpLT52YWxpZF93cml0ZShmaWxlLGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIikpCi0gIHsKLSAgICB3cml0ZSgiTk8gV1JJVEUgUEVSTUlTU0lPTlxuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGEgPSB3aXpsaXN0X2luZm8oKTsKLSAgYSA9IHNvcnRfYXJyYXkoYSwgbGFtYmRhKCAoeydhLCdifSksCi0gICAgICAgICAgICAgICAgICAgICAgICAoeyMnPCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Esc29ydGJ5fSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdiLHNvcnRieX0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKLSAgcm0oZmlsZSk7Ci0gIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKLSAgICB3cml0ZV9maWxlKGZpbGUsc3ByaW50ZigiJS0xMXM6IGV2YWw9JS04ZCBjbWRzPSUtNmQgSEJzPSUtNWQgYXJyYXk9JS01ZCBtYXBwaW5nPSUtN2RcbiIsCi0gICAgICBhW2ldW1dMX05BTUVdLGFbaV1bV0xfVE9UQUxfQ09TVF0sYVtpXVtXTF9DT01NQU5EU10sYVtpXVtXTF9IRUFSVF9CRUFUU10sCi0gICAgICBhW2ldW1dMX0FSUkFZX1RPVEFMXSxhW2ldW1dMX0NBTExfT1VUXSkpOwotfQotCi1wdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYikgewotCi0gIGlmKCFvYmplY3RwKG9iKSkKLSAgICBvYj1wcmV2aW91c19vYmplY3QoKTsKLSAgLy8gV2VubiBlaW4gT2JqZWt0IGdlc3VjaHQgd2lyZDogQWxsZSBFbnZzIGRpZXNlcyBPYmpla3RzIGVybWl0dGVsbiB1bmQKLSAgLy8gc2NoYXVlbiwgb2IgaW4gZGllc2VuIG9iIHZvcmtvbW10LiBEYW5uIGlzdCB3aGF0IGluIG9iIGVudGhhbHRlbi4KLSAgaWYob2JqZWN0cCh3aGF0KSkgewotICAgIG9iamVjdCAqZW52cz1hbGxfZW52aXJvbm1lbnQod2hhdCk7Ci0gICAgLy8gd2VubiBvYiBrZWluIEVudmlyb25tZW50IGhhdCwgaXN0IGVzIG9mZmVuc2ljaHRsaWNoIG5pY2h0IGluIHdoYXQKLSAgICAvLyBlbnRoYWx0ZW4uCi0gICAgaWYgKCFwb2ludGVycChlbnZzKSkgcmV0dXJuIDA7Ci0gICAgaWYgKG1lbWJlcihlbnZzLCBvYikgIT0gLTEpIHJldHVybiB3aGF0OwotICB9Ci0gIC8vIHNvbnN0IHdpcmRzIHRldXJlciwgdWViZXIgYWxsZSBPYmpla3RlIGltIChkZWVwKSBJbnYgbGF1ZmVuIHVuZCBwZXIgaWQoKQotICAvLyB0ZXN0ZW4uIERhYmVpIG11c3MgYWJlciBkaWUgZ2V3dWVuc2NodGUgTnIuICgiZmxhc2NoZSAzIikgYWJnZXNjaG5pdHRlbgotICAvLyB3ZXJkZW4gdW5kIHNlbGJlciBnZXphZWhsdCB3ZXJkZW4sIHdlbGNoZSBkYXMgZW50c3ByZWNoZW5kZSBPYmpla3QgaXN0LgotICBlbHNlIGlmIChzdHJpbmdwKHdoYXQpKSB7Ci0gICAgICBpbnQgY250OwotICAgICAgc3RyaW5nIG5ld3doYXQ7Ci0gICAgICBpZihzc2NhbmYod2hhdCwiJXMgJWQiLG5ld3doYXQsY250KSE9MikKLSAgICAgICBjbnQ9MTsKLSAgICAgIGVsc2UKLSAgICAgICB3aGF0PW5ld3doYXQ7Ci0gICAgICBmb3JlYWNoKG9iamVjdCBpbnZvYjogZGVlcF9pbnZlbnRvcnkob2IpKSB7Ci0gICAgICAgaWYgKGludm9iLT5pZCh3aGF0KSAmJiAhLS1jbnQpCi0gICAgICAgICAgIHJldHVybiBpbnZvYjsKLSAgICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIldyb25nIGFyZ3VtZW50IDEgdG8gZGVlcF9wcmVzZW50KCkuICIKLSAgICAgICAgICJFeHBlY3RlZCBcIm9iamVjdFwiIG9yIFwic3RyaW5nXCIsIGdvdCAlLjUwTy5cbiIsCi0gICAgICAgICB3aGF0KSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLW1hcHBpbmcgZHVtcF9pcF9tYXBwaW5nKCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLW5vbWFzayB2b2lkIHN3YXAob2JqZWN0IG9iaikKLXsKLSAgd3JpdGUoIllvdXIgYXJlIG5vdCBhbGxvd2VkIHRvIHN3YXAgb2JqZWN0cyBieSBoYW5kIVxuIik7Ci0gIHJldHVybjsKLX0KLQotbm9tYXNrIHZhcmFyZ3Mgdm9pZCBnYXJiYWdlX2NvbGxlY3Rpb24oc3RyaW5nIHN0cikKLXsKLSAgaWYocHJldmlvdXNfb2JqZWN0KCk9PTAgfHwgIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIAotICAgICAgfHwgIUFSQ0hfU0VDVVJJVFkpCi0gIHsKLSAgICB3cml0ZSgiQ2FsbCBHQyBub3cgYW5kIHRoZSBtdWQgd2lsbCBjcmFzaCBpbiA1LTYgaG91cnMuIERPTlQgRE8gSVQhXG4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgZWxzZSBpZiAoc3RyaW5ncChzdHIpKQotICB7Ci0gICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbihzdHIpOwotICB9Ci0gIGVsc2UgCi0gICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbigpOwotfQotCi12YXJhcmdzIHZvaWQgbm90aWZ5X2ZhaWwobWl4ZWQgbmYsIGludCBwcmlvKSB7Ci0gIG9iamVjdCBwbyxvbGRvOwotICBpbnQgb2xkcHJpbzsKLSAgCi0gIGlmICghUEwgfHwgIW9iamVjdHAocG89cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm47Ci0gIGlmICghc3RyaW5ncChuZikgJiYgIWNsb3N1cmVwKG5mKSkgewotICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKLSAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCi0gICAgICAgICAiT25seSBzdHJpbmdzIGFuZCBjbG9zdXJlcyBhbGxvd2VkIGZvciBub3RpZnlfZmFpbCEgIgotICAgICAgICAgIkFyZ3VtZW50IHdhczogJS41ME8uLi5cbiIsbmYpKTsKLSAgfQotCi0gIC8vIGZhbGxzIGVpbiBPYmpla3QgYmVyZWl0cyBuZW4gbm90aWZ5X2ZhaWwoKSBzZXR6dGUsIFByaW9yaXRhZXRlbiBhYnNjaGFldHplbgotICAvLyB1bmQgdmVyZ2xlaWNoZW4uCi0gIGlmIChvYmplY3RwKG9sZG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIHBvIT1vbGRvKSB7Ci0gICAgaWYgKCFwcmlvKSB7ICAgICAgIAotICAgICAgLy9Qcmlvcml0YWV0IGRpZXNlcyBub3RpZnlfZmFpbCgpICdhYnNjaGFldHplbicKLSAgICAgIGlmIChwbz09UEwpIC8vIFNwaWVsZXItaW50ZXJuZSAoc291bC1jbWRzKQotICAgICAgICBwcmlvPU5GX05MX09XTjsKLSAgICAgIGVsc2UgaWYgKGxpdmluZyhwbykpCi0gICAgICAgIHByaW89TkZfTkxfTElWSU5HOwotICAgICAgZWxzZSBpZiAoKGludClwby0+SXNSb29tKCkpCi0gICAgICAgIHByaW89TkZfTkxfUk9PTTsKLSAgICAgIGVsc2UKLSAgICAgICAgcHJpbz1ORl9OTF9USElORzsKLSAgICB9Ci0gICAgLy9Qcmlvcml0YWV0IGRlcyBhbHRlbiBTZXR6ZXJzIGFic2NoYWV0emVuCi0gICAgaWYgKG9sZG89PVBMKQotICAgICAgb2xkcHJpbz1ORl9OTF9PV047Ci0gICAgZWxzZSBpZiAobGl2aW5nKG9sZG8pKQotICAgICAgb2xkcHJpbz1ORl9OTF9MSVZJTkc7Ci0gICAgZWxzZSBpZiAoKGludClvbGRvLT5Jc1Jvb20oKSkKLSAgICAgIG9sZHByaW89TkZfTkxfUk9PTTsKLSAgICBlbHNlCi0gICAgICBvbGRwcmlvPU5GX05MX1RISU5HOwotICB9Ci0gIGVsc2UgLy8gd2VubiBlcyBub2NoIGtlaW4gTm90aWZ5X2ZhaWwgZ2lidDoKLSAgICBvbGRwcmlvPU5GX05MX05PTkU7Ci0KLSAgLy92ZXJnbGVpY2hlbiB1bmQgZ2dmLiBzZXR6ZW4KLSAgaWYgKHByaW8gPj0gb2xkcHJpbykgeyAKLSAgICBzZXRfdGhpc19vYmplY3QocG8pOwotICAgIGVmdW46Om5vdGlmeV9mYWlsKG5mKTsKLSAgfQotCi0gIHJldHVybjsKLX0KLQotdm9pZCBfbm90aWZ5X2ZhaWwoc3RyaW5nIHN0cikKLXsKLSAgLy9xdWVyeV9ub3RpZnlfZmFpbCgpIGJlbnV0emVuLCB1bSBkYXMgT2JqZWt0Ci0gIC8vZGVzIGxldHp0ZW4gbm90aWZ5X2ZhaWwoKSB6dSBlcm1pdHRlbG4KLSAgb2JqZWN0IG87Ci0gIGlmICgobz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgbyE9cHJldmlvdXNfb2JqZWN0KCkpCi0gICAgcmV0dXJuOwotICAvL25vY2gga2VpbiBub3RpZnlfZmFpbCgpIGZ1ZXIgZGllc2VzIEtvbW1hbmRvIGdlc2V0enQsIGF1ZiBnZWh0cy4KLSAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLSAgZWZ1bjo6bm90aWZ5X2ZhaWwoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdHJpbmcgdGltZTJzdHJpbmcoIHN0cmluZyBmb3JtYXQsIGludCB6ZWl0ICkKLXsKLSAgaW50IGksY2gsbWF4dW5pdCxkdW1teTsKLSAgc3RyaW5nICpwYXJ0cywgZm10OwotCi0gIGludCBzZWNzID0gemVpdDsKLSAgaW50IG1pbnMgPSAoemVpdC82MCk7Ci0gIGludCBob3VycyA9ICh6ZWl0LzM2MDApOwotICBpbnQgZGF5cyA9ICh6ZWl0Lzg2NDAwKTsKLSAgaW50IHdlZWtzID0gICh6ZWl0LzYwNDgwMCk7Ci0gIGludCBtb250aHMgPSAoemVpdC8yNDE5MjAwKTsKLSAgaW50IGFiYnIgPSAwOwotCi0gIHBhcnRzID0gcmVnZXhwbG9kZSggZm9ybWF0LCAiXCglXCgtfFwpWzAtOV0qW253ZGhtc3hOV0RITVNYXVwpfFwoJSVcKSIgKTsKLQotICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKLSAgewotICAgIGNoID0gcGFydHNbaV1bPDFdOwotICAgIHN3aXRjaCggcGFydHNbaV1bPDFdICkKLSAgICB7Ci0gICAgY2FzZSAneCc6IGNhc2UgJ1gnOgotICAgICAgIGFiYnIgPSBzc2NhbmYoIHBhcnRzW2ldLCAiJSUlZCIsIGR1bW15ICkgJiYgZHVtbXk9PTA7Ci0gICAgICAgLy8gTk8gYnJlYWsgIQotICAgIGNhc2UgJ24nOiBjYXNlICdOJzoKLSAgICAgICBtYXh1bml0IHw9IDMxOwotICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3cnOiBjYXNlICdXJzoKLSAgICAgICBtYXh1bml0IHw9IDE1OwotICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKLSAgICAgICBtYXh1bml0IHw9IDc7Ci0gICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaCc6IGNhc2UgJ0gnOgotICAgICAgIG1heHVuaXQgfD0gMzsKLSAgICAgICBicmVhazsKLSAgICBjYXNlICdtJzogY2FzZSAnTSc6Ci0gICAgICAgbWF4dW5pdCB8PSAxOwotICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiggbWF4dW5pdCAmIDE2ICkgd2Vla3MgJT0gNDsKLSAgaWYoIG1heHVuaXQgJiA4ICkgZGF5cyAlPSA3OwotICBpZiggbWF4dW5pdCAmIDQgKSBob3VycyAlPSAyNDsKLSAgaWYoIG1heHVuaXQgJiAyICkgbWlucyAlPSA2MDsKLSAgaWYoIG1heHVuaXQgKSBzZWNzICU9IDYwOwotCi0gIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQotICB7Ci0gICAgZm10ID0gcGFydHNbaV1bMC4uPDJdOwotICAgIGNoID0gcGFydHNbaV1bPDFdOwotICAgIGlmKCBjaD09J3gnICkKLSAgICB7Ci0gICAgICBpZiAobW9udGhzID4gMCkgY2g9J24nOwotICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSd3JzsKLSAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdkJzsKLSAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0naCc7IAotICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnbSc7Ci0gICAgICBlbHNlIGNoID0gJ3MnOwotICAgIH0KLSAgICBlbHNlIGlmKCBjaD09J1gnICkKLSAgICB7Ci0gICAgICBpZiAobW9udGhzID4gMCkgY2g9J04nOwotICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSdXJzsKLSAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdEJzsKLSAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0nSCc7IAotICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnTSc7Ci0gICAgICBlbHNlIGNoID0gJ1MnOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2goIGNoICkKLSAgICB7Ci0gICAgICBjYXNlICduJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtb250aHMgKTsgYnJlYWs7Ci0gICAgICBjYXNlICd3JzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCB3ZWVrcyApOyBicmVhazsKLSAgICAgIGNhc2UgJ2QnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGRheXMgKTsgYnJlYWs7Ci0gICAgICBjYXNlICdoJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBob3VycyApOyBicmVhazsKLSAgICAgIGNhc2UgJ20nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1pbnMgKTsgYnJlYWs7Ci0gICAgICBjYXNlICdzJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBzZWNzICk7IGJyZWFrOwotICAgICAgY2FzZSAnTic6Ci0gICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiTSI7Ci0gICAgICAgZWxzZSBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtb250aHM9PTEpID8gIk1vbmF0IiA6ICJNb25hdGUiICk7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdXJzoKLSAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJ3IjsgZWxzZQotICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHdlZWtzPT0xKSA/ICJXb2NoZSIgOiAiV29jaGVuIiApOwotICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnRCc6Ci0gICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiZCI7IGVsc2UKLSAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChkYXlzPT0xKSA/ICJUYWciIDogIlRhZ2UiICk7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdIJzoKLSAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJoIjsgZWxzZQotICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGhvdXJzPT0xKSA/ICJTdHVuZGUiIDogIlN0dW5kZW4iICk7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdNJzoKLSAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJtIjsgZWxzZQotICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1pbnM9PTEpID8gIk1pbnV0ZSIgOiAiTWludXRlbiIgKTsKLSAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1MnOgotICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInMiOyBlbHNlCi0gICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoc2Vjcz09MSkgPyAiU2VrdW5kZSIgOiAiU2VrdW5kZW4iICk7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICclJzoKLSAgICAgICBwYXJ0c1tpXSA9ICIlIjsKLSAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGltcGxvZGUoIHBhcnRzLCAiIiApOwotfQotCi1ub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKQotewotICBzdHJpbmcgZXJyOwotICBvYmplY3Qgb2I7Ci0gIG1peGVkIG07Ci0gIC8vaGF0IG5lbiBTY2hlcnprZWtzIGRpZSBCbHVlcHJpbnQgYmV3ZWd0PwotICBpZiAoKG9iPWZpbmRfb2JqZWN0KCIvc2VjdXJlL2xvZ2luIikpICYmIGVudmlyb25tZW50KG9iKSkKLSAgICAgIGNhdGNoKGRlc3RydWN0KG9iKTtwdWJsaXNoKTsKLSAgZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoInNlY3VyZS9sb2dpbiIpO3B1Ymxpc2gpOwotICBpZiAoZXJyKQotICB7Ci0gICAgd3JpdGUoIkZlaGxlciBiZWltIExhZGVuIHZvbiAvc2VjdXJlL2xvZ2luLmNcbiIrZXJyKyJcbiIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChvYmplY3RwKG09KG1peGVkKW9iLT5uZXdfbG9nb24obmFtZSkpKSBuZXRkZWFkW25hbWVdPW07Ci0gIHJldHVybiBtOwotfQotCi1ub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpCi17Ci0gIGludCAqbGV2ZWw7Ci0gIC8va2V0dGUgZGVyIENhbGxlciBkdXJjaGxhdWZlbiwgZGVuIG5pZWRyaWdzdGVuIExldmVsIGluIGRlciBLZXR0ZQotICAvL3p1cnVlY2tnZWJlbi4gWmVyc3RvZXJ0ZSBPYmpla3RlIChTZWxic3R6ZXJzdG9lcmVyKSBmdWVocmVuIHp1ciBSdWVja2dhYmUKLSAgLy92b24gMC4KLSAgLy9jYWxsZXJfc3RhY2soMSkgZnVlZ3QgZGVtIFJ1ZWNrZ2FiZWFycmF5IHRoaXNfaW50ZXJhY3RpdmUoKSBoaW56dSBiencuIDAsCi0gIC8vd2VubiBlcyBrZWluZW4gSW50ZXJhY3RpdmUgZ2lidC4gRGllIDAgZnVlaHJ0IGRhbm4gd2llIGJlaSB6ZXJzdG9lcnRlbgotICAvL09iamVrdGVuIHp1ciBSdWVja2dhYmUgdm9uIDAsIHdhcyBnZXd1ZW5zY2h0IGlzdCwgZGEgZXMgaGllciBlaW5lbgotICAvL0lOdGVyYWN0aXZlIGdlYmVuIG11c3MuCi0gIGxldmVsPW1hcChjYWxsZXJfc3RhY2soMSksZnVuY3Rpb24gaW50IChvYmplY3QgY2FsbGVyKQotICAgICAge2lmIChvYmplY3RwKGNhbGxlcikpCi0gICAgICAgcmV0dXJuKHF1ZXJ5X3dpel9sZXZlbChnZXRldWlkKGNhbGxlcikpKTsKLSAgICAgICByZXR1cm4oMCk7IC8vIGtlaW4gT2JqZWt0IGRhLCAwLgotICAgICAgfSApOwotICByZXR1cm4obWluKGxldmVsKSk7IC8vZGVuIGtsZWluc3RlbiBXZXJ0IGltIEFycmF5IHp1cnVlY2tnZWJlbiAoZ2dmLiAwKQotfQotCi1ub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCkKLXsKLSAgc3RyaW5nIGV1aWQ7Ci0KLSAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkpIC8vIEVzIG11c3MgZWluZW4gaW50ZXJhY3RpdmUgZ2ViZW4KLSAgICAgcmV0dXJuIDA7Ci0gIGV1aWQ9Z2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOwotICAvLyB1ZWJlciBhbGxlIENhbGxlciBpdGVyaWVyZW4uIFdlbm4gZWluZXMgZGF2b24gZWluZSBhbmRlcmUgZXVpZCBoYXQgYWxzCi0gIC8vIGRlciBJbnRlcmFjdGl2ZSB1bmQgZGllc2UgbmljaHQgZGllIFJPT1RJRCBpc3QsIHdpcmQgMCB6dXJ1ZWNrZ2ViZW4uCi0gIC8vIEViZW5zbywgZmFsbHMgZWluIFNlbGJzdHplcnN0b2VyZXIgaXJnZW5kd28gaW4gZGVyIEtldHRlIGlzdC4KLSAgZm9yZWFjaChvYmplY3QgY2FsbGVyOiBjYWxsZXJfc3RhY2soKSkgewotICAgICAgaWYgKCFvYmplY3RwKGNhbGxlcikgfHwKLSAgICAgICAoZ2V0ZXVpZChjYWxsZXIpIT1ldWlkICYmIGdldGV1aWQoY2FsbGVyKSE9Uk9PVElEKSkKLSAgICAgICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBldWlkOyAvLyAnc2ljaGVyZScgZXVpZCB6dXJ1ZWNrZ2ViZW4KLX0KLQotLy8gSU5QVVRfUFJPTVBUIHVuZCBuZW4gTGVlcnByb21wdCBoaW56dWZ1ZWdlbiwgd2VubiBrZWlucyB1ZWJlcmdlYmVuIHdpcmQuCi0vLyBEYXMgc29sbCBkYXp1IGRpZW5lbiwgZGFzcyBhbGxlIGdnZi4gZWluIEVPUiBhbSBQcm9tcHRlbmRlIGtyaWVnZW4uLi4KLS8vI2lmIF9fQk9PVF9USU1FX18gPCAxMzYwMDE3MjEzCi12YXJhcmdzIHZvaWQgaW5wdXRfdG8oIG1peGVkIGZ1biwgaW50IGZsYWdzLCB2YXJhcmdzIG1peGVkICphcmdzICkKLXsKLSAgICBtaXhlZCAqYXJyOwotICAgIGludCBpOwotCi0gICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCAhcHJldmlvdXNfb2JqZWN0KCkgKQotICAgICAgIHJldHVybjsKLQotICAgIC8vIFRPRE86IGlucHV0X3RvKC4uLixJTlBVVF9QUk9NUFQsICIiLCAuLi4pLCB3ZW5uIGtlaW4gSU5QVVRfUFJPTVBUCi0gICAgLy8gdm9ya29tbXQuLi4KLSAgICBpZiAoIGZsYWdzJklOUFVUX1BST01QVCApIHsgICAgCi0gICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MgfSkgKyBhcmdzOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gZ2dmLiBlaW4gSU5QVVRfUFJPTVBUIGhpbnp1ZnVlZ2VuIHVuZCBuZW4gTGVlcnN0cmluZyBhbHMgUHJvbXB0LgotICAgICAgICBmbGFncyB8PSBJTlBVVF9QUk9NUFQ7Ci0gICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MsICIiIH0pICsgYXJnczsKLSAgICB9Ci0KLSAgICAvLyBBcnJheXMgZ2VnZW4gZmxhdHRlbiBxdW90ZW4uCi0gICAgZm9yICggaSA9IHNpemVvZihhcnIpIC0gMTsgaSA+IDE7IGktLSApCi0gICAgICAgaWYgKCBwb2ludGVycChhcnJbaV0pICkKLSAgICAgICAgICAgYXJyW2ldID0gcXVvdGUoYXJyW2ldKTsKLQotICAgIGFwcGx5KCBiaW5kX2xhbWJkYSggdW5ib3VuZF9sYW1iZGEoICh7fSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgIydlZnVuOjppbnB1dF90by8qJyovIH0pICsgYXJyICksCi0gICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpICkgKTsKLX0KLS8vI2VuZGlmCi0KLW5vbWFzayBpbnQgc2V0X2xpZ2h0KGludCBpKQotLy8gZXJob2VodCBkYXMgTGljaHRsZXZlbCBlaW5lcyBPYmpla3RzIHVtIGkKLS8vIHJlc3VsdDogZGFzIExpY2h0bGV2ZWwgaW5uZXJoYWxiIGRlcyBPYmpla3RzCi17Ci0gICAgb2JqZWN0IG9iLCAqaW52OwotICAgIGludCBsYWxsLCBsaWdodCwgZGFyaywgdG1wOwotCi0gICAgaWYgKCEob2I9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsgLy8gb2huZSBkYXMgZ2VodHMgbmljaHQuCi0KLSAgICAvLyBhdXMga29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIGthbm4gbWFuIGF1Y2ggZGVuIExpY2h0bGV2ZWwgbm9jaCBzZXR6ZW4KLSAgICBpZiAoaSE9MCkgb2ItPlNldFByb3AoUF9MSUdIVCwgb2ItPlF1ZXJ5UHJvcChQX0xJR0hUKStpKTsKLQotICAgIC8vIExpY2h0YmVyZWNobnVuZyBmaW5kZXQgZWlnZW50bGljaCBpbiBkZXIgTXVkbGliIHN0YXR0LgotICAgIHJldHVybiAoaW50KW9iLT5RdWVyeVByb3AoUF9JTlRfTElHSFQpOwotfQotCi0KLXB1YmxpYyBzdHJpbmcgaXNvMmFzY2lpKCBzdHJpbmcgc3RyICkKLXsKLSAgICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkKLSAgICAgICByZXR1cm4gIiI7Ci0KLSAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLkIiwgImFlIiwgMSApOwotICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvYiLCAib2UiLCAxICk7Ci0gICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi/CIsICJ1ZSIsIDEgKTsKLSAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLEIiwgIkFlIiwgMSApOwotICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItYiLCAiT2UiLCAxICk7Ci0gICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3CIsICJVZSIsIDEgKTsKLSAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLfIiwgInNzIiwgMSApOwotICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIlteIC1+XSIsICI/IiwgMSApOwotCi0gICAgcmV0dXJuIHN0cjsKLX0KLQotCi1wdWJsaWMgdmFyYXJncyBzdHJpbmcgQ291bnRVcCggc3RyaW5nICpzLCBzdHJpbmcgc2VwLCBzdHJpbmcgbGFzdHNlcCApCi17Ci0gICAgc3RyaW5nIHJldDsKLQotICAgIGlmICggIXBvaW50ZXJwKHMpICkKLSAgICAgICByZXR1cm4gIiI7Ci0gICAgCi0gICAgaWYgKCFzZXApIHNlcCA9ICIsICI7Ci0gICAgaWYgKCFsYXN0c2VwKSBsYXN0c2VwID0gIiB1bmQgIjsKLQotICAgIHN3aXRjaCAoc2l6ZW9mKHMpKSAgewotICAgICAgIGNhc2UgMDogcmV0PSIiOyBicmVhazsKLSAgICAgICBjYXNlIDE6IHJldD1zWzBdOyBicmVhazsKLSAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICByZXQgPSBpbXBsb2RlKHNbMC4uPDJdLCBzZXApOwotICAgICAgICAgICAgICByZXQgKz0gbGFzdHNlcCArIHNbPDFdOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1ub21hc2sgdmFyYXJncyBpbnQgcXVlcnlfbmV4dF9yZXNldChvYmplY3Qgb2IpIHsKLQotICAgIC8vIFR5cHBydWVmdW5nOiBldHdhcyBhbmRlcmVzIGFscyBPYmpla3RlIG9kZXIgMCBzb2xsZW4gRmVobGVyIHNlaW4uCi0gICAgaWYgKG9iICYmICFvYmplY3RwKG9iKSkKLSAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9uZXh0X3Jlc2V0KCk6IGdvdCAlLjIwTywgIgotICAgICAgICAgICAiZXhwZWN0ZWQgb2JqZWN0LlxuIixvYikpOwotCi0gICAgLy8gRGVmYXVsdG9iamVrdCBQTywgd2VubiAwIHVlYmVyZ2ViZW4uCi0gICAgaWYgKCAhb2JqZWN0cChvYikgKQotICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKLQotICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKLX0KLQotCi0jaWYgIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQotI2RlZmluZSBNQVhMRU4gNTAwMDAKLW5vbWFzayBpbnQgY29weV9maWxlKHN0cmluZyBzb3VyY2UsIHN0cmluZyBkZXN0KQotewotCi0gIGludCBwdHI7Ci0gIHN0cmluZyBieXRlczsKLQotICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICBpZiAoIXNpemVvZihzb3VyY2UpfHwhc2l6ZW9mKGRlc3QpfHxzb3VyY2U9PWRlc3R8fChmaWxlX3NpemUoc291cmNlKT09LTEpfHwKLSAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAotICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAotICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksInJlYWRfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKXx8Ci0gICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKLSAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIixwcmV2aW91c19vYmplY3QoKSkpKQotICAgIHJldHVybiAxOwotICBzd2l0Y2ggKGZpbGVfc2l6ZShkZXN0KSkKLSAgewotICBjYXNlIC0xOgotICAgIGJyZWFrOwotICBjYXNlIC0yOgotICAgIGlmIChkZXN0WzwxXSE9Jy8nKSBkZXN0Kz0iLyI7Ci0gICAgZGVzdCs9ZWZ1bjo6ZXhwbG9kZShzb3VyY2UsIi8iKVs8MV07Ci0gICAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTIpIHJldHVybiAxOwotICAgIGlmIChmaWxlX3NpemUoZGVzdCkhPS0xKSBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBpZiAoIXJtKGRlc3QpKSByZXR1cm4gMTsKLSAgICBicmVhazsKLSAgfQotICBkbwotICB7Ci0gICAgYnl0ZXMgPSByZWFkX2J5dGVzKHNvdXJjZSwgcHRyLCBNQVhMRU4pOyBwdHIgKz0gTUFYTEVOOwotICAgIGlmICghYnl0ZXMpIGJ5dGVzPSIiOwotICAgIHdyaXRlX2ZpbGUoZGVzdCwgYnl0ZXMpOwotICB9Ci0gIHdoaWxlKHNpemVvZihieXRlcykgPT0gTUFYTEVOKTsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCi0KLQotLy8gIyMjIEVyc2F0emF1ZmxvZXN1bmcgaW4gU3RyaW5ncyAjIyMKLXZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpIHsKLSAgaW50IGk7Ci0gIHN0cmluZyAqcGFydHM7Ci0KLSAgcGFydHMgPSByZWdleHBsb2RlKHN0ciwgIkBXRVtBLVNVXSpbMC05XSIpOwotICBpID0gc2l6ZW9mKHBhcnRzKTsKLQotICBpZiAoaT4xKSB7Ci0gICAgaW50IGosIHQ7Ci0gICAgY2xvc3VyZSAqbmFtZV9jbHM7Ci0KLSAgICB0ID0gaiA9IHNpemVvZihvYnMpOwotCi0gICAgbmFtZV9jbHMgID0gIGFsbG9jYXRlKGopOwotICAgIHdoaWxlIChqLS0pCi0gICAgICBpZiAob2JqZWN0cChvYnNbal0pKQotICAgICAgICBuYW1lX2Nsc1tqXSA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG9ic1tqXSk7Ci0gICAgICBlbHNlIGlmIChzdHJpbmdwKG9ic1tqXSkpCi0gICAgICAgIG5hbWVfY2xzW2pdID0gb2JzW2pdOwotCi0gICAgd2hpbGUgKChpLT0gMik+MCkgewotICAgICAgaW50IG9iX25yOwotICAgICAgLy8genUgZXJzZXR6ZW5kZXMgVG9rZW4gaW4gRmFsbCB1bmQgT2JqZWt0aW5kZXggYXVmc3BhbHRlbgotICAgICAgb2JfbnIgPSBwYXJ0c1tpXVs8MV0tJzEnOwotICAgICAgaWYgKG9iX25yPDAgfHwgb2JfbnI+PXQpIHsKLSAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLSAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigicmVwbGFjZV9wZXJzb25hbDogdXNpbmcgd3Jvbmcgb2JqZWN0IGluZGV4ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBvYl9ucikpOwotICAgICAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOwotICAgICAgfQotCi0gICAgICAvLyBjYXN1cyBrYW5uIG1hbiBzY2hvbiBoaWVyIGVudHNjaGVpZGVuCi0gICAgICBpbnQgY2FzdXM7Ci0gICAgICBzdHJpbmcgcGFydCA9IHBhcnRzW2ldOwotICAgICAgc3dpdGNoIChwYXJ0WzNdKSB7Ci0gICAgICAgIGNhc2UgJ1InOiBjYXN1cyA9IFdFUjsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1MnOiBjYXN1cyA9IFdFU1NFTjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ00nOiBjYXN1cyA9IFdFTTsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ04nOiBjYXN1cyA9IFdFTjsgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6ICBjb250aW51ZTsgLy8gcGFzc3Qgc2Nob24gamV0enQgbmljaHQgaW4gZGFzIEhhdXB0bXVzdGVyCi0gICAgICB9Ci0KLSAgICAgIC8vIHVuZCBqZXR6dCBkaWUgZWluemVsbmVuIEtleXdvcmRzIG9obmUgZnVlaHJlbmRlcyAiQFdFIiwgYmVlbmRlbmRlIElkCi0gICAgICBtaXhlZCB0bXA7Ci0gICAgICBzd2l0Y2ggKHBhcnRbMy4uPDJdKSB7Ci0gICAgICAgIGNhc2UgIlIiOiBjYXNlICJTU0VOIjogY2FzZSAiTSI6IGNhc2UgIk4iOiAgICAgICAgICAgICAgIC8vIE5hbWUKLSAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cywgMSk7ICBicmVhazsKLSAgICAgICAgY2FzZSAiUlUiOiBjYXNlICJTU0VOVSI6IGNhc2UgIk1VIjogY2FzZSAiTlUiOiAgICAgICAgICAgLy8gdW5iZXN0aW1tdAotICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzKTsgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJSUVAiOiBjYXNlICJTU0VOUVAiOiBjYXNlICJNUVAiOiBjYXNlICJOUVAiOiAgICAgICAvLyBQcm9ub3VuCi0gICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCi0gICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVByb25vdW4oY2FzdXMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJSUUEiOiBjYXNlICJTU0VOUUEiOiBjYXNlICJNUUEiOiBjYXNlICJOUUEiOiAgICAgICAvLyBBcnRpY2xlCi0gICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCi0gICAgICAgICAgICB0bXAgPSAoc3RyaW5nKXRtcC0+UXVlcnlBcnRpY2xlKGNhc3VzLCAxLCAxKTsKLSAgICAgICAgICBpZiAoc3RyaW5ncCh0bXApICYmICEodG1wWzwxXV4nICcpKSAKLSAgICAgICAgICAgIHRtcCA9IHRtcFswLi48Ml07ICAgICAgICAgICAgICAgIC8vIEV4dHJhLVNwYWNlIHdpZWRlciBsb2VzY2hlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJSUVBQTVMiOiBjYXNlICJTU0VOUVBQTVMiOiBjYXNlICJNUVBQTVMiOiBjYXNlICJOUVBQTVMiOgotICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQotICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgU0lOR1VMQVIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJSUVBQRlMiOiBjYXNlICJTU0VOUVBQRlMiOiBjYXNlICJNUVBQRlMiOiBjYXNlICJOUVBQRlMiOgotICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQotICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBTSU5HVUxBUik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlJRUFBOUyI6IGNhc2UgIlNTRU5RUFBOUyI6IGNhc2UgIk1RUFBOUyI6IGNhc2UgIk5RUFBOUyI6Ci0gICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCi0gICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFNJTkdVTEFSKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiUlFQUE1QIjogY2FzZSAiU1NFTlFQUE1QIjogY2FzZSAiTVFQUE1QIjogY2FzZSAiTlFQUE1QIjoKLSAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKLSAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFBMVVJBTCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlJRUFBGUCI6IGNhc2UgIlNTRU5RUFBGUCI6IGNhc2UgIk1RUFBGUCI6IGNhc2UgIk5RUFBGUCI6Ci0gICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCi0gICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFBMVVJBTCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlJRUFBOUCI6IGNhc2UgIlNTRU5RUFBOUCI6IGNhc2UgIk1RUFBOUCI6IGNhc2UgIk5RUFBOUCI6Ci0gICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCi0gICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFBMVVJBTCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHdlbm4gdG1wIGVpbiBTdHJpbmcgd2FyLCB3ZWlzZW4gd2lyIGVzIGhpZXIgcGF1c2NoYWwgenUKLSAgICAgIGlmIChzdHJpbmdwKHRtcCkpCi0gICAgICAgIHBhcnRzW2ldID0gdG1wOwotCi0gICAgICAvLyBhdWYgV3Vuc2NoIHdpcmQgbmFjaCBTYXR6ZW5kZW4gZ3Jvc3MgZ2VzY2hyaWViZW4KLSAgICAgIGlmIChjYXBzKQotICAgICAgICBzd2l0Y2ggKHBhcnRzW2ktMV1bPDIuLl0pIHsKLSAgICAgICAgICBjYXNlICIuICI6ICBjYXNlICIhICI6ICBjYXNlICI/ICI6Ci0gICAgICAgICAgY2FzZSAiLiI6ICAgY2FzZSAiISI6ICAgY2FzZSAiPyI6Ci0gICAgICAgICAgY2FzZSAiLlxuIjogY2FzZSAiIVxuIjogY2FzZSAiP1xuIjoKLSAgICAgICAgICBjYXNlICJcIiAiOiBjYXNlICJcIlxuIjoKLSAgICAgICAgICAgIHBhcnRzW2ldID0gY2FwaXRhbGl6ZShwYXJ0c1tpXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOwotICB9Ci0gIHJldHVybiBzdHI7Ci19Ci0KLQotLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKLSNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQotZGVwcmVjYXRlZCB2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pIHsKLQotICBpZighc3RyaW5ncChzdHIpKSB7Ci0gICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLSAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBleHRyYWN0KCk6ICVPIixzdHIpKTsKLSAgfQotICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgewotICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQotICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIHRvXSk7Ci0gICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQotICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIDxhYnModG8pXSk7Ci0gICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQotICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIHRvXSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7Ci0gIH0KLSAgZWxzZSBpZiAoaW50cChmcm9tKSkgewotICAgIGlmIChmcm9tPj0wKQotICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIF0pOwotICAgIGVsc2UKLSAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiBdKTsKLSAgfQotICBlbHNlIHsKLSAgICByZXR1cm4oc3RyKTsKLSAgfQotfQotI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCi0KLSNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKLWRlcHJlY2F0ZWQgdmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0bykgewotCi0gIGlmKCFwb2ludGVycChhcnJheSkpIHsKLSAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIHNsaWNlX2FycmF5KCk6ICVPIixhcnJheSkpOwotICB9Ci0gIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7Ci0gICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCi0gICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiB0b10pOwotICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKLSAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIDxhYnModG8pXSk7Ci0gICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQotICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gdG9dKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOwotICB9Ci0gIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKLSAgICBpZiAoZnJvbT49MCkKLSAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIF0pOwotICAgIGVsc2UKLSAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIF0pOwotICB9Ci0gIGVsc2UgewotICAgIHJldHVybihhcnJheSk7Ci0gIH0KLX0KLSNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKLQotI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKLWRlcHJlY2F0ZWQgaW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZykgewotCi0gIGlmIChwb2ludGVycChhcnJheXN0cmluZykpIHsKLSAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLGl0ZW0pKTsKLSAgfQotICBlbHNlIGlmIChzdHJpbmdwKGFycmF5c3RyaW5nKSkgewotICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsdG9faW50KGl0ZW0pKSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLSAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBtZW1iZXJfYXJyYXkoKTogJU8iLGFycmF5c3RyaW5nKSk7Ci0gIH0KLX0KLSNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCi0KLS8vIFRoZSBkaWdpdCBhdCB0aGUgaSd0aCBwb3NpdGlvbiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluICdpJy4KLXN0cmluZyBjb3VudF90YWJsZSA9Ci0gICAgIjAxMTIxMjIzMTIyMzIzMzQxMjIzMjMzNDIzMzQzNDQ1MTIyMzIzMzQyMzM0MzQ0NTIzMzQzNDQ1MzQ0NTQ1NTYiOwotaW50IGJyb2tlbl9jb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKLSAgICBpbnQgaSwgcmVzOwotICAgIGlmKCAhc3RyaW5ncChzKSB8fCAhKGk9c2l6ZW9mKHMpKSApIHJldHVybiAwOwotICAgIGZvciggOyBpLS0+MDsgKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBjb3VudGluZyA2IGJpdHMgYXQgYSB0aW1lIHVzaW5nIGEgcHJlY29tcGlsZWQgdGFibGUuCi0gICAgICAgIHJlcyArPSBjb3VudF90YWJsZVsoc1tpXS0nICcpJjYzXS0nMCc7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLSNpZiAhX19FRlVOX0RFRklORURfXyhjb3VudF9iaXRzKQotaW50IGNvdW50X2JpdHMoIHN0cmluZyBzICkgewotICAgIHJldHVybihicm9rZW5fY291bnRfYml0cyhzKSk7Ci19Ci0jZW5kaWYKLQotCi0vLyAqIFRlaWxlIGF1cyBlaW5lbSBBcnJheSBlbnRmZXJuZW4gKioqIE9CU09MRVRFCi1kZXByZWNhdGVkIG1peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsaW50IGZyb20saW50IHRvKQotewotICBpZiAodG88ZnJvbSkKLSAgICB0byA9IGZyb207Ci0gIHJldHVybiBhcnJbMC4uZnJvbS0xXSthcnJbdG8rMS4uXTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvUkVBRE1FIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDM0MjlhLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXNpbXVsX2VmdW4gCi0tLS0tLS0tLS0tIAotRGFzIHNpbXVsX2VmdW4gT2JqZWt0IC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuIGJlbnV0enQgZGllIERhdGVpZW4KLWluIC9zZWN1cmUvc2ltdWxfZWZ1bi4KLUltIFZlcnplaWNobmlzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZSBpc3QgZWluZSBTaWNoZXJoZWl0c2tvcGllIHZvbiBhbGxlbiAKLURhdGVpZW4gaW4gL3NlY3VyZS9zaW11bF9lZnVuLgotCi1GYWxscyAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jIG5pY2h0IGxhZGJhciBpc3QsIHdpcmQgCi0vc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jIGFscyBFcnNhdHogdmVyc3VjaHQuIFdlbm4gYXVjaCBkYXMKLW5pY2h0IGxhZGJhciBpc3QsIGVyZm9sZ3QgZWluIFNodXRkb3duIGRlcyBNdWRzLgotCi1CZWkgQWVuZGVydW5nZW4gc29sbHRlIF96dWVyc3RfIGRpZSBub3JtYWxlIHNpbXVsIGVmdW4gZWRpdGllcnQgdW5kCi1hbnNjaGxpZXNzZW5kIHplcnN0b2VydC9lbnRsYWRlbiB3ZXJkZW4sIHdvcmF1ZmhpbiBzaWUgaW1wbGl6aXQgZHVyY2ggZGVuCi1Ecml2ZXIgdW5kIE1hc3RlciBuZXVnZWxhZGVuIHdpcmQuIElzdCBkaWVzIGVyZm9sZ3JlaWNoIHVuZCBkaWUgbmV1ZQotc2ltdWxfZWZ1biBsYWV1ZnQgKGVyc3QgZGFubiEpIGtvcGllcnQgbWFuIGRpZSBEYXRlaWVuIGF1cyAKLS9zZWN1cmUvc2ltdWxfZWZ1biBuYWNoIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS4KLQotRGllIERhdGVpZW4gaGllciBzaW5kIG1pdCBBdXNuYWhtZSBkZXIgc2ltdWxfZWZ1bi5jIHNlbGJzdCBfbmljaHRfIGRhenUgCi1nZWRhY2h0LCBnZWxhZGVuIHp1IHdlcmRlbi4KLQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvY29tbS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvY29tbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmI1OThjLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2NvbW0uYworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KLQotLy8gU2VuZGV0IGFuIGFsbGUgT2JqZWt0ZSBpbiByb29tIHVuZCByb29tIHNlbGJlciBkdXJjaCBBdWZydWYgdm9uCi0vLyBSZWNlaXZlTXNnKCkuCi12YXJhcmdzIHZvaWQgc2VuZF9yb29tKG9iamVjdHxzdHJpbmcgcm9vbSwgc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX2FjdGlvbiwgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCAqZXhjbHVkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG9yaWdpbikKLXsKLSAgaWYgKHN0cmluZ3Aocm9vbSkpCi0gICAgcm9vbT1sb2FkX29iamVjdChyb29tKTsKLSAgCi0gIG9yaWdpbiB8fD0gcHJldmlvdXNfb2JqZWN0KCk7Ci0gIG9iamVjdCAqZGVzdCA9IGV4Y2x1ZGUgPyBhbGxfaW52ZW50b3J5KHJvb20pIC0gZXhjbHVkZSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfaW52ZW50b3J5KHJvb20pOwotCi0gIGRlc3QtPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKLSAgcm9vbS0+UmVjZWl2ZU1zZyhtc2csIG1zZ190eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOwotfQotCi1zdGF0aWMgaW50IF9zaG91dF9maWx0ZXIoIG9iamVjdCBvYiwgc3RyaW5nIHBhdCApCi17Ci0gICAgc3RyaW5nICppZ25vcmU7Ci0KLSAgICBpZiAoICFlbnZpcm9ubWVudChvYikgKQotICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIHNpemVvZiggcmVnZXhwKCAoeyBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQob2IpICkgfSksIHBhdCApICk7Ci19Ci0KLXZhcmFyZ3Mgdm9pZCBzaG91dCggc3RyaW5nIHMsIG1peGVkIHdoZXJlICl7Ci0gICAgb2JqZWN0ICp1OwotICAgIHN0cmluZyAqcGZhZGU7Ci0KLSAgICBpZiAoICFzaXplb2YoIHUgPSB1c2VycygpIC0gKHsgdGhpc19wbGF5ZXIoKSB9KSApICkKLSAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoICF3aGVyZSApCi0gICAgICAgcGZhZGUgPSAoeyAiLyIgfSk7Ci0gICAgZWxzZSBpZiAoIGludHAod2hlcmUpICkKLSAgICAgICBwZmFkZSA9Ci0gICAgICAgICAgICh7IGltcGxvZGUoIGVmdW46OmV4cGxvZGUoIG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKVswLi4yXSwgIi8iICkgKyAiLyIgfSk7Ci0gICAgZWxzZSBpZiAoIHN0cmluZ3Aod2hlcmUpICkKLSAgICAgICBwZmFkZSA9ICh7IHdoZXJlIH0pOwotICAgIGVsc2UKLSAgICAgICBwZmFkZSA9IHdoZXJlOwotCi0gICAgdSA9IGZpbHRlciggdSwgIl9zaG91dF9maWx0ZXIiLCBNRSwgaW1wbG9kZSggcGZhZGUsICJ8IiApICk7Ci0gICAgdS0+UmVjZWl2ZU1zZyhzLCBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9XUkFQfE1TR19ET05UX1NUT1JFLAotICAgICAgICAgICAgICAgICAgTUFfU0hPVVRfU0VGVU4sIDAsIHByZXZpb3VzX29iamVjdCgpKTsKLX0KLQotCi0jaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKLS8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biBjYXQoKS4KLSNkZWZpbmUgQ0FUX01BWF9MSU5FUyA1MAotdmFyYXJncyBpbnQgY2F0KHN0cmluZyBmaWxlLCBpbnQgc3RhcnQsIGludCBudW0pCi17Ci0gICAgaWYgKGV4dGVybl9jYWxsKCkpCi0gICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0KLSAgICBpbnQgbW9yZTsKLQotICAgIGlmIChudW0gPCAwIHx8ICF0aGlzX3BsYXllcigpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmICghc3RhcnQpCi0gICAgICAgIHN0YXJ0ID0gMTsKLQotICAgIGlmICghbnVtIHx8IG51bSA+IENBVF9NQVhfTElORVMpIHsKLSAgICAgICAgbnVtID0gQ0FUX01BWF9MSU5FUzsKLSAgICAgICAgbW9yZSA9IHNpemVvZihyZWFkX2ZpbGUoZmlsZSwgc3RhcnQrbnVtLCAxKSk7Ci0gICAgfQotCi0gICAgc3RyaW5nIHR4dCA9IHJlYWRfZmlsZShmaWxlLCBzdGFydCwgbnVtKTsKLSAgICBpZiAoIXR4dCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOwotCi0gICAgaWYgKG1vcmUpCi0gICAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICIqKioqKlRSVU5DQVRFRCoqKipcbiIpOwotCi0gICAgcmV0dXJuIHNpemVvZih0eHQgJiAiXG4iKTsKLX0KLSN1bmRlZiBDQVRfTUFYX0xJTkVTCi0jZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKLQotI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCi0vLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gdGFpbCgpLgotI2RlZmluZSBUQUlMX01BWF9CWVRFUyAxMDAwCi12YXJhcmdzIGludCB0YWlsKHN0cmluZyBmaWxlKQotewotICAgIGlmIChleHRlcm5fY2FsbCgpKQotICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotCi0gICAgaWYgKCFzdHJpbmdwKGZpbGUpIHx8ICF0aGlzX3BsYXllcigpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHN0cmluZyB0eHQgPSByZWFkX2J5dGVzKGZpbGUsIC0oVEFJTF9NQVhfQllURVMgKyA4MCksIChUQUlMX01BWF9CWVRFUyArIDgwKSk7Ci0gICAgLy8gcmVhZF9ieXRlcygpIHJldHVybnMgMCBpZiB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gZ2l2ZW4gYnkKLSAgICAvLyBwYXJhbWV0ZXIgIzIgbGllcyBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLSAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2ltcGx5IHRyeSBhbmQgcmVhZCB0aGUgZW50aXJlIGZpbGUuCi0gICAgaWYgKCFzdHJpbmdwKHR4dCkgJiYgZmlsZV9zaXplKGZpbGUpIDwgVEFJTF9NQVhfQllURVMrODApCi0gICAgICB0eHQgPSByZWFkX2ZpbGUoZmlsZSk7Ci0gICAgLy8gRXhpdCBpZiBzdGlsbCBub3RoaW5nIGNvdWxkIGJlIHJlYWQuCi0gICAgaWYgKCFzdHJpbmdwKHR4dCkpCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8vIGN1dCBvZmYgZmlyc3QgKGluY29tcGxldGUpIGxpbmUKLSAgICBpbnQgaW5kZXggPSBzdHJzdHIodHh0LCAiXG4iKTsKLSAgICBpZiAoaW5kZXggPiAtMSkgewotICAgICAgICBpZiAoaW5kZXggKyAxIDwgc2l6ZW9mKHR4dCkpCi0gICAgICAgICAgICB0eHQgPSB0eHRbaW5kZXgrMS4uXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdHh0ID0gIiI7Ci0gICAgfQotCi0gICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKLQotICAgIHJldHVybiAxOwotfQotI3VuZGVmIFRBSUxfTUFYX0JZVEVTCi0jZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKLQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA3YzJmLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gZGVidWdfaW5mbygpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhkZWJ1Z19pbmZvKQotCi0jaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KLSNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+Ci0KLW1peGVkIGRlYnVnX2luZm8oaW50IHdoYXQsIHZhcmFyZ3MgbWl4ZWQqIGFyZ3MpCi17Ci0gICAgaWYgKHNpemVvZihhcmdzKSA+IDIpCi0gICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7Ci0KLSAgICBzd2l0Y2god2hhdCkKLSAgICB7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBkZWJ1Z19pbmZvKCkuXG4iLCB3aGF0KSk7Ci0KLSAgICAgICAgY2FzZSBESU5GT19PQkpFQ1Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9iamVjdCBvYjsKLQotICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQotICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKLSAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOwotCi0gICAgICAgICAgICBvYiA9IGFyZ3NbMF07Ci0gICAgICAgICAgICBwcmludGYoIk9fSEVBUlRfQkVBVCAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKSAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOwotICAgICAgICAgICAgcHJpbnRmKCJPX0VOQUJMRV9DT01NQU5EUyA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKLSAgICAgICAgICAgIHByaW50ZigiT19DTE9ORSAgICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6Y2xvbmVwKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gICAgICAgICAgICBwcmludGYoIk9fREVTVFJVQ1RFRCAgICAgIDogRkFMU0VcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCJPX1NXQVBQRUQgICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCkgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKLSAgICAgICAgICAgIHByaW50ZigiT19PTkNFX0lOVEVSQUNUSVZFOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gICAgICAgICAgICBwcmludGYoIk9fUkVTRVRfU1RBVEUgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSkgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOwotICAgICAgICAgICAgcHJpbnRmKCJPX1dJTExfQ0xFQU5fVVAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCkgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKLSAgICAgICAgICAgIHByaW50ZigiT19SRVBMQUNFRCAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKSAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gICAgICAgICAgICBwcmludGYoInRpbWVfcmVzZXQgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpKTsKLSAgICAgICAgICAgIHByaW50ZigidGltZV9vZl9yZWYgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpKTsKLSAgICAgICAgICAgIHByaW50ZigicmVmICAgICAgICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKSk7Ci0KLSAgICAgICAgICAgIGludCBndGlja3MgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKLSAgICAgICAgICAgIGlmKGd0aWNrcykKLSAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWQlMDlkXG4iLCBndGlja3MsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKLQotICAgICAgICAgICAgcHJpbnRmKCJzd2FwX251bSAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pKTsKLSAgICAgICAgICAgIHByaW50ZigibmFtZSAgICAgICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6b2JqZWN0X25hbWUob2IpKTsKLSAgICAgICAgICAgIHByaW50ZigibG9hZF9uYW1lICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6bG9hZF9uYW1lKG9iKSk7Ci0KLSAgICAgICAgICAgIG9iamVjdCBuZXh0X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKLSAgICAgICAgICAgIGlmIChuZXh0X29iKQotICAgICAgICAgICAgICAgIHByaW50ZigibmV4dF9hbGwgICAgOiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShuZXh0X29iKSk7Ci0KLSAgICAgICAgICAgIG9iamVjdCBwcmV2X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKLSAgICAgICAgICAgIGlmIChwcmV2X29iKQotICAgICAgICAgICAgICAgIHByaW50ZigiUHJldmlvdXMgb2JqZWN0IGluIG9iamVjdCBsaXN0OiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShwcmV2X29iKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJUaGlzIG9iamVjdCBpcyB0aGUgaGVhZCBvZiB0aGUgb2JqZWN0IGxpc3QuXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBESU5GT19NRU1PUlk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9iamVjdCBvYjsKLQotICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQotICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKLSAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOwotCi0gICAgICAgICAgICBvYiA9IGFyZ3NbMF07Ci0KLSAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSByZWYncyAlM2RcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUykpOwotICAgICAgICAgICAgcHJpbnRmKCJOYW1lOiAnJXMnXG4iLCAgICAgICAgICBlZnVuOjpwcm9ncmFtX25hbWUob2IpKTsKLSAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBzaXplICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSkpOwotICAgICAgICAgICAgcHJpbnRmKCJudW0gZnVuYydzOiAgJTNkICglNGQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUykpOwotICAgICAgICAgICAgcHJpbnRmKCJudW0gdmFyczogICAgJTNkICglNGQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUykpOwotCi0gICAgICAgICAgICBwcmludGYoIm51bSBzdHJpbmdzOiAlM2QgKCU0ZCkgOiBvdmVyaGVhZCAlZCArIGRhdGEgJWQgKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUykgKyBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKSk7Ci0KLSAgICAgICAgICAgIHByaW50ZigibnVtIGluaGVyaXRzICUzZCAoJTRkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpKTsKLQotICAgICAgICAgICAgcHJpbnRmKCJ0b3RhbCBzaXplICAgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKSk7Ci0KLSAgICAgICAgICAgIHByaW50ZigiZGF0YSBzaXplICAgICAgICU2ZCAoJTZkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIERJTkZPX09CSkxJU1Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMCkKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7Ci0KLSAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvYmplY3QgKiBvYnMgPSBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYnNbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdHMoYXJnc1swXSwgYXJnc1sxXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRElORk9fTUFMTE9DOgotICAgICAgICAgICAgd3JpdGUoZGVidWdfaW5mbyhESU5GT19TVEFUVVMsICJtYWxsb2MiKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIERJTkZPX1NUQVRVUzoKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIHdoaWNoOwotICAgICAgICAgICAgaW50IG9wdDsKLQotICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOwotCi0gICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSB8fCAhYXJnc1swXSkKLSAgICAgICAgICAgICAgICB3aGljaCA9ICIiOwotICAgICAgICAgICAgZWxzZSBpZihzdHJpbmdwKGFyZ3NbMF0pKQotICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOwotCi0gICAgICAgICAgICBzd2l0Y2god2hpY2gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAiIjoKLSAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgInRhYmxlcyI6Ci0gICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICJzd2FwIjoKLSAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MiOgotICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKLSAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRElORk9fRFVNUDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG9wdDsKLQotICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOwotCi0gICAgICAgICAgICBpZighc3RyaW5ncChhcmdzWzBdKSkKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOwotCi0gICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJvYmplY3RzIjoKLSAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAiZGVzdHJ1Y3RlZCI6Ci0gICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTX0RFU1RSVUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAib3Bjb2RlcyI6Ci0gICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PUENPREVTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgIm1lbW9yeSI6Ci0gICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9NRU1PUlk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50ICclcycgdG8gZGVidWdfaW5mbyhESU5GT19EVU1QKS5cbiIsIGFyZ3NbMF0pKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKG9wdCwgYXJnc1sxLi4xXS4uLik7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIERJTkZPX0RBVEE6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1peGVkICogcmVzdWx0OwotCi0gICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7Ci0KLSAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKLSAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOwotCi0gICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMyB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKLQotICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBESURfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1RBVFVTX01BWCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FDVElPTlMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FDVElPTlMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU0hBRE9XUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU0hBRE9XUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTElTVF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9MSVNUKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1RdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTkVXTFlfREVTVFJVQ1RFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ERVNUUlVDVEVEXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0RFU1RSVUNURUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfUFJPQ0VTU0VEXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19MQVNUX1BST0NFU1NFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19BVkdfUFJPQ10gICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfT0JKRUNUU19SRUxBVElWRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fVEFCTEUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TTE9UU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUX1RBQkxFX1NMT1RTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RfVEFCTEUpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfT0JKU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9BQ1RJVkVfQ1lDTEVTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU19UT1RBTF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NMT1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSEVBUlRCRUFUUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfUFJPQ0VTU0VEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTX0xBU1RfUFJPQ0VTU0VEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9BVkdfUFJPQ10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0NBTExPVVRTKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQVJSQVlTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BUlJBWVMpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUFQUElOR1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hZQlJJRF9NQVBQSU5HU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSFlCUklEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQVNIX01BUFBJTkdTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hBU0gpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVF9UWVBFUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUX1RZUEVTKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBQRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUF9TSVpFXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VU0VSX1JFU0VSVkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfVVNFUik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFTVEVSX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX01BU1RFUik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1lTVEVNX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BRERfTUVTU0FHRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FU1NBR0VTX09VVCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX09VVCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19PVVQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNfSU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19JTik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVfSU5dICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19JTik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZX0hJVFNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMX0hJVFMpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9WSVJUVUFMX1NUUklOR1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9UQUJMRV9TSVpFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19UQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX09WRVJIRUFEXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX09WRVJIRUFEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVU5UQUJMRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVU5UQUJMRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19UQUJMRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVEFCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU19CWVZBTFVFXSAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5fQllWQUxVRV0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NIQUlOU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0FEREVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19BRERFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0RFTEVURURdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19SRU1PVkVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ09MTElTSU9OU10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9DT0xMSVNJT05TKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRfQllWQUxVRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX1ZBTFVFKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX0NBQ0hFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVgpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfVEFCTEVfU0xPVFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFR0VYKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFVRVNUU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9GT1VORF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0hJVFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9DT0xMXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0NPTExJU0lPTlMpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfRklMRV0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX0ZJTEUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX1NXQVBdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9TV0FQKTsKLQotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0JPT1RfVElNRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9CT09UX1RJTUUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgRElEX1NXQVA6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TV0FQX01BWCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVU5TV0FQUEVEXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfVU5TV0FQUEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19VTlNXQVBQRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUlNdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJfU0laRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfRlJFRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRklMRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFVVNFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX1JFVVNFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIRVNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hfTEVOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUF9TVEVQUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIX0xFTl0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBfU1RFUFMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0NPTVBBQ1RdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhEQ19TV0FQX0NPTVBBQ1RfTU9ERSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVDWUNMRV9GUkVFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NXQVBfUkVDWUNMRV9QSEFTRSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBESURfTUVNT1JZOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfTUVNT1JZX01BWCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTkFNRV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19GUkVFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfRlJFRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfV0FTVEUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19XQVNURSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS19DSFVOS1MpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX0NIVU5LUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19GUkVFKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfRlJFRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfV0FTVEUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19XQVNURSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU1VDQ0VTU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMX1NVQ0NFU1NFUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSU5DUkVNRU5UX1NJWkVfQ0FMTF9ESUZGUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1dICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9VTk1BTkFHRURfQkxPQ0tTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9VTk1BTkFHRURfQkxPQ0tTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fT1ZFUkhFQURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19PVkVSSEVBRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FMTE9DQVRFRF0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfT1ZFUkhFQUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9VU0VEXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVE9UQUxfVU5VU0VEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVU5VU0VEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfRlVMTCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU19SRVFdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX1JFUV9TVUNDRVNTXSAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTF9UQVJHRVRfSElUUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfSU5TUEVDVEVEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19JTlNQRUNURUQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX01FUkdFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfTUVSR0VEKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19SRVNVTFRdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX1JFU1VMVElORyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FWTF9OT0RFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GUkVFX0JMT0NLU19BVkxfTk9ERVMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9FWFRfU1RBVElTVElDU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfRVhURU5ERURfU1RBVElTVElDUyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGlkeCA9IGFyZ3NbMF07Ci0gICAgICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQotICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBkZWJ1Z19pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIERJTkZPX1RSQUNFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgd2hpY2ggPSBESVRfQ1VSUkVOVDsKLQotICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCi0gICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOwotICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCi0gICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7Ci0gICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgRElUX0VSUk9SOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERJVF9VTkNBVUdIVF9FUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOwotCi0gICAgICAgICAgICAgICAgY2FzZSBESVRfU1RSX0NVUlJFTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0FTX1NUUklORyk7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UX0RFUFRIOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9ERVBUSCk7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBjYXNlIERJTkZPX0VWQUxfTlVNQkVSOgotICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxYzk2My4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgZW5hYmxlX2NvbW1hbmRzKCkKLSAqIGFuZCBkaXNhYmxlX2NvbW1hbmRzKCkuCi0gKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KLSAqLwotCi0jaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgotCi0jaWYgISBfX0VGVU5fREVGSU5FRF9fKGVuYWJsZV9jb21tYW5kcykKLQotdm9pZCBlbmFibGVfY29tbWFuZHMoKQotewotICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOwotCi0gICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMSk7Ci0gICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKG9iKTsKLX0KLQotI2VuZGlmCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGlzYWJsZV9jb21tYW5kcykKLQotdm9pZCBkaXNhYmxlX2NvbW1hbmRzKCkKLXsKLSAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKLQotICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDApOwotICAgIGVmdW46OnNldF90aGlzX3BsYXllcigwKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9oYXNoLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYmJmNjAuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI2luY2x1ZGUgIi9zeXMvdGxzLmgiCi0KLWRlcHJlY2F0ZWQgc3RyaW5nIG1kNShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCi17Ci0gICAgaWYgKGV4dGVybl9jYWxsKCkpCi0gICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotCi0gICAgcmV0dXJuIGhhc2goVExTX0hBU0hfTUQ1LCBhcmcsIGl0ZXJhdGlvbnMuLi4pOwotfQotCi1kZXByZWNhdGVkIHN0cmluZyBzaGExKG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKLXsKLSAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKLSAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0KLSAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9TSEExLCBhcmcsIGl0ZXJhdGlvbnMuLi4pOwotfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvbGl2aW5ncy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvbGl2aW5ncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjBmY2VlLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2xpdmluZ3MuYworKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vLyAqIGxpdmluZ19uYW1lLUJlaGFuZGx1bmcKLQotI2RlZmluZSBjbGVhbl9sb2cocykKLS8vI2RlZmluZSBjbGVhbl9sb2cocykgbG9nX2ZpbGUoIkNMRUFOX1NJTSIsY3RpbWUodGltZSgpKVs0Li4xOF0rIjogIisocykpOwotCi1wcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpdmluZ19uYW1lX20sIG5hbWVfbGl2aW5nX20sIG5ldGRlYWQ7Ci0KLXByaXZhdGUgdm9pZCBJbml0TGl2aW5nRGF0YShtaXhlZCB3aXppbmZvKSB7Ci0gIC8vIGxpdmluZ19uYW1lIGlzdCBlaW4gUG9pbnRlciBkZXIgYXVjaCBpbiBkZXIgZXh0cmFfd2l6aW5mbyBnZWhhbHRlbiAKLSAgLy8gd2lyZCwgc28ga2FubiBkaWUgc2ltdWxfZWZ1biBuZXUgZ2VsYWRlbiB3ZXJkZW4sIG9obmUgZGFzcyBkaWVzZXMKLSAgLy8gTWFwcGluZyB2ZXJsb3JlbiBnZWh0Ci0gIGlmICghbWFwcGluZ3AobGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdKSkKLSAgICBsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0gPSBtX2FsbG9jYXRlKDAsIDEpOwotCi0gIC8vIEdsZWljaGVzIGdpbHQgZnVlciBkYXMgTWFwcGluZyBOYW1lLUxpdmluZwotICBpZiAoIW1hcHBpbmdwKG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSkpCi0gICAgbmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddID0gbV9hbGxvY2F0ZSgwLCAxKTsKLQotICAvLyBOZXR6dG90ZSBzaW5kIGViZW5mYWxscyBpbiBkZXIgZXh0cmFfd2l6aW5mbwotICBpZiAoIW1hcHBpbmdwKG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSkpCi0gICAgbmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdID0gKFtdKTsKLX0KLQotcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGdldHV1aWQoIG9iamVjdCBvYiApCi17Ci0gICAgbWl4ZWQgKnJldDsKLQotICAgIGlmICggIW9iamVjdHAob2IpICkKLSAgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOwotCi0gICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgKQotICAgICAgIHJldHVybiBnZXR1aWQob2IpOwotCi0gICAgcmV0ID0gKG1peGVkKW1hc3RlcigpLT5nZXRfdXNlcmluZm8oIGdldHVpZChvYikgKTsKLQotICAgIGlmICggIXBvaW50ZXJwKHJldCkgfHwgc2l6ZW9mKHJldCkgPCA1ICkKLSAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKLQotICAgIC8vIFVzZXJuYW1lICsgIl8iICsgQ3JlYXRpb25EYXRlCi0gICAgcmV0dXJuIHJldFswXSArICJfIiArIHJldFs1XTsKLX0KLQotdm9pZCBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lLCBvYmplY3Qgb2JqKQotewotICBzdHJpbmcgb2xkOwotICBtaXhlZCBhOwotICBpbnQgaTsKLQotICBpZiAocHJldmlvdXNfb2JqZWN0KCk9PW9iaiB8fCBwcmV2aW91c19vYmplY3QoKT09dGhpc19vYmplY3QoKSB8fAotICAgICAgcHJldmlvdXNfb2JqZWN0KCk9PW1hc3RlcigpKQotICB7Ci0gICAgaWYoIWxpdm5hbWUgfHwgIXN0cmluZ3AobGl2bmFtZSkpIHsKLSAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0gICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCIlTzogaWxsZWdhbCBsaXZpbmcgbmFtZTogJU9cbiIsIG9iaiwgbGl2bmFtZSkpOwotICAgIH0KLSAgICBpZiAob2xkID0gbGl2aW5nX25hbWVfbVtvYmpdKSB7Ci0gICAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21bb2xkXSkpIHsKLSAgICAgICBhW21lbWJlcihhLCBvYmopXSA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIG9sZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGxpdmluZ19uYW1lX21bb2JqXSA9IGxpdm5hbWU7Ci0gICAgaWYgKGEgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSB7Ci0gICAgICBpZiAoIXBvaW50ZXJwKGEpKSB7Ci0gICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9ICh7YSwgb2JqfSk7Ci0gICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgLyogVHJ5IHRvIHJlYWxsb2NhdGUgZW50cnkgZnJvbSBkZXN0cnVjdGVkIG9iamVjdCAqLwotICAgICAgaWYgKChpID0gbWVtYmVyKGEsIDApKSA+PSAwKSB7Ci0gICAgICAgYVtpXSA9IG9iajsKLSAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gYSArICh7b2JqfSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBvYmo7Ci0gIH0KLX0KLQotdm9pZCBzZXRfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUpCi17Ci0gIHNldF9vYmplY3RfbGl2aW5nX25hbWUobGl2bmFtZSxwcmV2aW91c19vYmplY3QoKSk7Ci19Ci0KLXZvaWQgcmVtb3ZlX2xpdmluZ19uYW1lKCkKLXsKLSAgc3RyaW5nIGxpdm5hbWU7Ci0KLSAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKLSAgICByZXR1cm47Ci0gIGlmIChsaXZuYW1lPWxpdmluZ19uYW1lX21bcHJldmlvdXNfb2JqZWN0KCldKQotICB7Ci0gICAgbV9kZWxldGUobGl2aW5nX25hbWVfbSxwcmV2aW91c19vYmplY3QoKSk7Ci0gICAgaWYgKG9iamVjdHAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCi0gICAgewotICAgICAgaWYgKG5hbWVfbGl2aW5nX21bbGl2bmFtZV09PXByZXZpb3VzX29iamVjdCgpKQotICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwb2ludGVycChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKLSAgICB7Ci0gICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdLT0oe3ByZXZpb3VzX29iamVjdCgpfSk7Ci0gICAgICBpZiAoIXNpemVvZihuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKLSAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOwotICAgIH0KLSAgfQotfQotCi12b2lkIF9zZXRfbmV0ZGVhZCgpCi17Ci0gIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKLSAgICBuZXRkZWFkW2dldHVpZChwcmV2aW91c19vYmplY3QoKSldPXByZXZpb3VzX29iamVjdCgpOwotfQotCi12b2lkIF9yZW1vdmVfbmV0ZGVhZCgpCi17Ci0gIG1fZGVsZXRlKG5ldGRlYWQsZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7Ci19Ci0KLW9iamVjdCBmaW5kX25ldGRlYWQoc3RyaW5nIHV1aWQpCi17Ci0gIGludCBpOwotICBzdHJpbmcgdWlkOwotICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgotICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7Ci0gIGlmICghaXNfdXVpZCkKLSAgICB1aWQgPSB1dWlkOwotIAotICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKG5ldGRlYWRbdWlkXSkgIT0gdXVpZCkKLSAgICAgIHJldHVybiAwOwotCi0gIHJldHVybiBuZXRkZWFkW3VpZF07Ci19Ci0KLXN0cmluZyAqZHVtcF9uZXRkZWFkKCkKLXsKLSAgcmV0dXJuIG1faW5kaWNlcyhuZXRkZWFkKTsKLX0KLQotb2JqZWN0IGZpbmRfbGl2aW5nKHN0cmluZyBsaXZuYW1lKSB7Ci0gIG1peGVkICphLCByOwotICBpbnQgaTsKLQotICBpZiAocG9pbnRlcnAociA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKSB7Ci0gICAgaWYgKG1lbWJlcihyLDApPj0wKQotICAgICAgci09KHswfSk7Ci0gICAgaWYgKCFzaXplb2YocikpewotICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKLSAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX2xpdmluZyBsb2VzY2h0ICVzXG4iLGxpdm5hbWUpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoICFsaXZpbmcociA9IChhID0gcilbMF0pKSB7Ci0gICAgICBmb3IgKGkgPSBzaXplb2YoYSk7IC0taTspIHsKLSAgICAgICBpZiAobGl2aW5nKGFbPGldKSkgewotICAgICAgICAgciA9IGFbPGldOwotICAgICAgICAgYVs8aV0gPSBhWzBdOwotICAgICAgICAgcmV0dXJuIGFbMF0gPSByOwotICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLSAgcmV0dXJuIGxpdmluZyhyKSAmJiByOwotfQotCi1vYmplY3QgKmZpbmRfbGl2aW5ncyhzdHJpbmcgbGl2bmFtZSkKLXsKLSAgbWl4ZWQgcjsKLQotICBpZiAocG9pbnRlcnAocj1uYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKLSAgICByLT0oezB9KTsKLSAgZWxzZQotICAgIGlmIChvYmplY3RwKHIpKQotICAgICAgcj0oe3J9KTsKLSAgaWYgKCFwb2ludGVycChyKXx8IXNpemVvZihyKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHI7Ci19Ci0KLW9iamVjdCBmaW5kX3BsYXllcihzdHJpbmcgdXVpZCkgewotICBvYmplY3QgKm9ianM7Ci0gIG1peGVkIHJlczsKLSAgaW50IGk7Ci0gIHN0cmluZyB1aWQ7Ci0KLSAgaWYgKCFzdHJpbmdwKHV1aWQpKQotICAgIHJldHVybiAwOwotICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgotICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7Ci0gIGlmICghaXNfdXVpZCkKLSAgICB1aWQgPSB1dWlkOwotCi0gIGlmIChwb2ludGVycChyZXMgPSBuYW1lX2xpdmluZ19tW3VpZF0pKSB7Ci0gICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIGdnZi4gZW50ZmVybmVuCi0gICAgaWYgKG1lbWJlcihyZXMsMCk+PTApIHsKLSAgICAgIHJlcy09KHswfSk7Ci0gICAgICBuYW1lX2xpdmluZ19tW3VpZF0gPSByZXM7Ci0gICAgfQotICAgIC8vIGdnZi4gTmFtZW4gb2huZSBPYmpla3RlIGVudGZlcm5lbi4KLSAgICBpZiAoIXNpemVvZihyZXMpKXsKLSAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sdWlkKTsKLSAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX3BsYXllciBsb2VzY2h0ICVzXG4iLHVpZCkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIG9ianMgPSByZXM7Ci0gICAgcmVzID0gb2Jqc1swXTsKLSAgICAvLyBXZW5uIGRhcyAwLiBFbGVtZW50IGRlciBTcGllbGVyIGlzdCwgc2luZCB3aXIgZmVydGlnLiBBbnNvbnN0ZW4gc3VjaGVuCi0gICAgLy8gd2lyIGRlbiBTcGllbGVyIHVuZCBzY2hpZWJlbiBpaG4gYW4gZGllIDAuIFN0ZWxsZSBpbSBBcnJheS4KLSAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpIHsKLSAgICAgIGZvciAoaSA9IHNpemVvZihvYmpzKTsgLS1pOykgewotICAgICAgIGlmIChvYmpzWzxpXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9ianNbPGldKSkgewotICAgICAgICAgcmVzID0gb2Jqc1s8aV07Ci0gICAgICAgICBvYmpzWzxpXSA9IG9ianNbMF07Ci0gICAgICAgICBvYmpzWzBdID0gcmVzOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgICAgfQotICAgICAgcmVzID0gKG9iamVjdHAocmVzKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpID8gcmVzIDogMDsKLSAgICB9Ci0gICAgLy8gZWxzZTogaW4gcmVzIHN0ZWh0IGRlciBTcGllbGVyIHNjaG9uLgotICB9Ci0gIGVsc2UgaWYgKG9iamVjdHAocmVzKSkgLy8gciBpc3QgbmVuIEVpbnplbG9iamVrdAotICAgIHJlcyA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSA/IHJlcyA6IDA7Ci0KLSAgLy8gcmVzIGlzdCBqZXR6dCBnZ2YuIGRlciBTcGllbGVyLiBBYmVyIHdlbm4gZGVyIG5lIGFuZGVyZSBhbHMgZGllIGdlc3VjaHRlCi0gIC8vIFVVSUQgaGF0LCBpc3QgZGFzIEVyZ2VibmlzIHRyb3R6ZGVtIDAuCi0gIGlmIChpc191dWlkICYmIGdldHV1aWQocmVzKSE9dXVpZCkKLSAgICAgIHJldHVybiAwOwotCi0gIC8vIGVuZGxpY2ggZ2VmdW5kZW4KLSAgcmV0dXJuIHJlczsKLX0KLQotcHJpdmF0ZSBpbnQgY2hlY2tfbWF0Y2goIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHkgKQotewotICAgIG1peGVkIG1hdGNoOwotCi0gICAgaWYgKCAhKG1hdGNoID0gbmFtZV9saXZpbmdfbVtzdHJdKSApCi0gICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoICFwb2ludGVycChtYXRjaCkgKQotICAgICAgIG1hdGNoID0gKHsgbWF0Y2ggfSk7Ci0KLSAgICBtYXRjaCAtPSAoezB9KTsKLQotICAgIGlmICggc2l6ZW9mKG1hdGNoKSApewotICAgICAgIGlmICggcGxheWVyc19vbmx5ICkKLSAgICAgICAgICAgcmV0dXJuIHNpemVvZihmaWx0ZXIoIG1hdGNoLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUvKicqLyApKQotICAgICAgICAgICAgICA+IDA7Ci0gICAgICAgZWxzZQotICAgICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBtX2RlbGV0ZSggbmFtZV9saXZpbmdfbSwgc3RyICk7Ci0gICAgY2xlYW5fbG9nKCBzcHJpbnRmKCJjaGVja19tYXRjaCBsb2VzY2h0ICVzXG4iLCBzdHIpICk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vVE9ETzo6IHN0cmluZ3xzdHJpbmcqIGV4Y2x1ZGUKLXZhcmFyZ3MgbWl4ZWQgbWF0Y2hfbGl2aW5nKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5LCBtaXhlZCBleGNsdWRlICkKLXsKLSAgICBpbnQgaSwgczsKLSAgICBtaXhlZCBtYXRjaCwgKnVzZXI7Ci0KLSAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICkKLSAgICAgICByZXR1cm4gMDsKLQotICAgIGlmICggIXBvaW50ZXJwKGV4Y2x1ZGUpICkKLSAgICAgICBleGNsdWRlID0gKHsgZXhjbHVkZSB9KTsKLQotICAgIGlmICggbWVtYmVyKGV4Y2x1ZGUsIHN0cikgPCAwICYmIGNoZWNrX21hdGNoKHN0ciwgcGxheWVyc19vbmx5KSApCi0gICAgICAgcmV0dXJuIHN0cjsKLQotICAgIHVzZXIgPSBtX2luZGljZXMobmFtZV9saXZpbmdfbSk7Ci0gICAgcyA9IHNpemVvZihzdHIpOwotICAgIG1hdGNoID0gMDsKLQotICAgIGZvciAoIGkgPSBzaXplb2YodXNlcik7IGktLTsgKQotICAgICAgIGlmICggc3RyID09IHVzZXJbaV1bMC4ucy0xXSAmJiBtZW1iZXIoIGV4Y2x1ZGUsIHVzZXJbaV0gKSA8IDAgKQotICAgICAgICAgICBpZiAoIG1hdGNoICkKLSAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGlmICggY2hlY2tfbWF0Y2godXNlcltpXSwgcGxheWVyc19vbmx5KSApCi0gICAgICAgICAgICAgICAgICBtYXRjaCA9IHVzZXJbaV07Ci0KLSAgICBpZiAoICFtYXRjaCApCi0gICAgICAgcmV0dXJuIC0yOwotCi0gICAgcmV0dXJuIG1hdGNoOwotfQotCi1taXhlZCAqZHVtcF9saXZpbmdzKCkKLXsKLSAgcmV0dXJuIHNvcnRfYXJyYXkobV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLCMnPik7Ci19Ci0KLS8vICogcmVnZWxtYWVzc2lnIExpc3RlbiB2b24gQmFsbGFzdCBiZWZyZWllbgotcHJpdmF0ZSB2b2lkIGNsZWFuX25hbWVfbGl2aW5nX20oc3RyaW5nICprZXlzLCBpbnQgbGVmdCwgaW50IG51bSkKLXsKLSAgaW50IGksIGo7Ci0gIG1peGVkIGE7Ci0KLSAgd2hpbGUgKGxlZnQgJiYgbnVtLS0pCi0gIHsKLSAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21ba2V5c1stLWxlZnRdXSkgJiYgbWVtYmVyKGEsIDApPj0wKQotICAgIHsKLSAgICAgIGEtPSh7MH0pOwotICAgICAgbmFtZV9saXZpbmdfbVtrZXlzW2xlZnRdXSA9IGE7Ci0gICAgfQotICAgIGlmICghYSB8fCAocG9pbnRlcnAoYSkgJiYgIXNpemVvZihhKSkpCi0gICAgewotICAgICAgY2xlYW5fbG9nKCJUb2FzdGluZyAiK2tleXNbbGVmdF0rIlxuIik7Ci0gICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBrZXlzW2xlZnRdKTsKLSAgICB9IGVsc2UgY2xlYW5fbG9nKHNwcmludGYoIktFRVBJTkcgJXMgKCVPKVxuIixrZXlzW2xlZnRdLHBvaW50ZXJwKGEpP3NpemVvZihhKTphKSk7Ci0gIH0KLSAgaWYgKGxlZnQpCi0gICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLCAxLCBrZXlzLCBsZWZ0LCA4MCk7Ci0gIGVsc2UKLSAgICBjbGVhbl9sb2coIkNsZWFuIHByb2Nlc3MgZmluaXNoZWRcbiIpOwotfQotCi1wcml2YXRlIHZvaWQgY2xlYW5fbmV0ZGVhZCgpIHsKLSAgaW50IGk7Ci0gIHN0cmluZyAqczsKLSAgb2JqZWN0IG9iOwotCi0gIHM9bV9pbmRpY2VzKG5ldGRlYWQpOwotICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pCi0gICAgaWYgKCFvYmplY3RwKG9iPW5ldGRlYWRbc1tpXV0pIHx8IGludGVyYWN0aXZlKG9iKSkKLSAgICAgIG1fZGVsZXRlKG5ldGRlYWQsc1tpXSk7Ci19Ci0KLXByaXZhdGUgdm9pZCBDbGVhbkxpdmluZ0RhdGEoKSB7Ci0gIGlmIChmaW5kX2NhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSkgPCAwKSB7Ci0gICAgY2xlYW5fbG9nKCJTdGFydGluZyBjbGVhbiBwcm9jZXNzXG4iKTsKLSAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sCi0gICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgIG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGl2aW5nX20pLAotICAgICAgICAgICAgICAgICA4MAotICAgICAgICAgICAgICAgICApOwotICB9Ci0gIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmV0ZGVhZCwyKTsKLX0KLQotI3VuZGVmIGNsZWFuX2xvZwotCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3YzAwOS4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBvYmplY3RfaW5mbygpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmIF9fRUZVTl9ERUZJTkVEX18oZHJpdmVyX2luZm8pIC8qIE5ld2VyIHZlcnNpb24gaXMgdGhlcmUgKi8KLQotI2luY2x1ZGUgPG9iamVjdGluZm8uaD4KLSNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgotCi1taXhlZCBvYmplY3RfaW5mbyhvYmplY3Qgb2IsIGludCB3aGF0LCB2YXJhcmdzIGludCogaW5kZXgpCi17Ci0gICAgbWl4ZWQgKiByZXN1bHQ7Ci0KLSAgICBpZiAoc2l6ZW9mKGluZGV4KSA+IDEpCi0gICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gb2JqZWN0X2luZm9cbiIpOwotCi0gICAgc3dpdGNoKHdoYXQpCi0gICAgewotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3Igb2JqZWN0X2luZm8oKS5cbiIsIHdoYXQpKTsKLQotICAgICAgICBjYXNlIE9JTkZPX0JBU0lDOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSUJfTUFYKTsKLQotICAgICAgICAgICAgcmVzdWx0W09JQl9IRUFSVF9CRUFUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX0lTX1dJWkFSRF0gICAgICAgICA9IDA7ICAgLyogTm90IHN1cHBvcnRlZCBhbnltb3JlLiAqLwotICAgICAgICAgICAgcmVzdWx0W09JQl9FTkFCTEVfQ09NTUFORFNdICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX0NMT05FXSAgICAgICAgICAgICA9IGVmdW46OmNsb25lcChvYik7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX0RFU1RSVUNURURdICAgICAgICA9IDA7ICAgLyogTm90IHBvc3NpYmxlIGFueW1vcmUuICovCi0gICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBQRURdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfT05DRV9JTlRFUkFDVElWRV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9SRVNFVF9TVEFURV0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9XSUxMX0NMRUFOX1VQXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX0xBTUJEQV9SRUZFUkVOQ0VEXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQU1CREFfUkVGRVJFTkNFRCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX1NIQURPV10gICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVikgJiYgMTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVQTEFDRURdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9SRVNFVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX1RJTUVfT0ZfUkVGXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVGXSAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSUJfR0lHQVRJQ0tTXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX1RJQ0tTXSAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUyk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBfTlVNXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX1BST0dfU1dBUFBFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NXQVBQRUQpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9WQVJfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVkFSX1NXQVBQRUQpOwotICAgICAgICAgICAgcmVzdWx0W09JQl9OQU1FXSAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfbmFtZShvYik7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX0xPQURfTkFNRV0gICAgICAgICA9IGVmdW46OmxvYWRfbmFtZShvYik7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX1BSRVZfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7Ci0gICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQ0xFQU5VUF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX0NMRUFOVVBfVElNRSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT0lORk9fUE9TSVRJT046Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JUF9NQVgpOwotCi0gICAgICAgICAgICByZXN1bHRbT0lQX05FWFRdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSVBfUFJFVl0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOwotICAgICAgICAgICAgcmVzdWx0W09JUF9QT1NdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUE9TKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBPSU5GT19NRU1PUlk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JTV9NQVgpOwotCi0gICAgICAgICAgICByZXN1bHRbT0lNX1JFRl0gICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fTkFNRV0gICAgICAgICAgICAgICA9IGVmdW46OnByb2dyYW1fbmFtZShvYik7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX1BST0dfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0ZVTkNUSU9OU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9GVU5DVElPTlNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUyk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX05VTV9WQVJJQUJMRVNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfVkFSSUFCTEVTXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fU1RSSU5HU10gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfREFUQV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX1RPVEFMXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkhFUklURURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfSU5IRVJJVEVEXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9TSVpFXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX0RBVEFfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfREFUQV9TSVpFXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9OT19JTkhFUklUXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0lOSEVSSVQpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9OT19DTE9ORV0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0NMT05FKTsKLSAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fU0hBRE9XXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19TSEFET1cpOwotICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5DTFVERVNdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkNMVURFRCk7Ci0gICAgICAgICAgICByZXN1bHRbT0lNX1NIQVJFX1ZBUklBQkxFU10gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBUkVfVkFSSUFCTEVTKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNpemVvZihpbmRleCkpCi0gICAgewotICAgICAgICBpbnQgaWR4ID0gaW5kZXhbMF07Ci0gICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKLSAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIG9iamVjdF9pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKLSAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDZkY2QuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2VkaXRpbmcoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfZWRpdGluZykKLQotI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KLQotaW50fG9iamVjdCBxdWVyeV9lZGl0aW5nKG9iamVjdCBvYikKLXsKLSAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9FRElUSU5HKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTMyYWUuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lkbGUoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaWRsZSkKLQotI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KLQotaW50IHF1ZXJ5X2lkbGUob2JqZWN0IG9iKQotewotICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JRExFKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOGMzMTEuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lucHV0X3BlbmRpbmcoKS4KLSAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgotICovCi0KLSNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaW5wdXRfcGVuZGluZykKLQotI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KLQotb2JqZWN0IHF1ZXJ5X2lucHV0X3BlbmRpbmcob2JqZWN0IG9iKQotewotICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lOUFVUX1BFTkRJTkcpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3NGVhMC4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIHF1ZXJ5X2lwX25hbWUoKSBhbmQKLSAqIHF1ZXJ5X2lwX251bWJlcigpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pcF9uYW1lKQotCi0jaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgotCi1wcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9uYW1lKG9iamVjdCBwbGF5ZXIpCi17Ci0gICAgb2JqZWN0IG9iID0gcGxheWVyOwotICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOwotCi0gICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7Ci0gICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05BTUUpOwotfQotCi1wcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9udW1iZXIob2JqZWN0IHBsYXllcikKLXsKLSAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7Ci0gICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7Ci0KLSAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKLSAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTlVNQkVSKTsKLX0KLQotLy8gKiBIZXJrdW5mdHMtRXJtaXR0bHVuZwotc3RyaW5nIHF1ZXJ5X2lwX251bWJlcihvYmplY3Qgb2IpCi17Ci0gIG9iPSBvYiB8fCB0aGlzX3BsYXllcigpOwotICBpZiAoIW9iamVjdHAob2IpIHx8ICFpbnRlcmFjdGl2ZShvYikpIHJldHVybiAwOwotICBpZihvYi0+cXVlcnlfcmVhbGlwKCkgJiYgKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCkhPSIiKQotICB7Ci0gICAgcmV0dXJuIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpOwotICB9Ci0gIHJldHVybiBfcXVlcnlfaXBfbnVtYmVyKG9iKTsKLX0KLQotc3RyaW5nIHF1ZXJ5X2lwX25hbWUobWl4ZWQgb2IpCi17Ci0gIGlmICggIW9iIHx8IG9iamVjdHAob2IpICkKLSAgICAgIG9iPV9xdWVyeV9pcF9udW1iZXIob2IpOwotICByZXR1cm4gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+aG9zdChvYik7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2JmMzkwLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xpbWl0cygpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9saW1pdHMpCi0KLSNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgotCi12YXJhcmdzIGludCogcXVlcnlfbGltaXRzKGludCBkZWYpCi17Ci0gICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKGRlZiA/IERDX0RFRkFVTFRfUlVOVElNRV9MSU1JVFMgOiBESV9DVVJSRU5UX1JVTlRJTUVfTElNSVRTKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjM2ZjBlLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9sb2FkX2F2ZXJhZ2UpCi0KLSNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgotCi1zdHJpbmcgcXVlcnlfbG9hZF9hdmVyYWdlKCkKLXsKLSAgICByZXR1cm4gZWZ1bjo6c3ByaW50ZigiJS4yZiBjbWRzL3MsICUuMmYgY29tcCBsaW5lcy9zIiwKLSAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0NPTU1BTkRTKSwKLSAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX0xJTkVTKSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjAwOWQuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9tdWRfcG9ydCgpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9tdWRfcG9ydCkKLQotI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KLSNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgotCi1pbnQgcXVlcnlfbXVkX3BvcnQodmFyYXJncyBpbnQqfG9iamVjdCogYXJncykKLXsKLSAgICBpZighc2l6ZW9mKGFyZ3MpICYmIGVmdW46OnRoaXNfcGxheWVyKCkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCi0gICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHRoaXNfcGxheWVyKCksIElJX01VRF9QT1JUKTsKLQotICAgIGlmKHNpemVvZihhcmdzKSA+IDEpCi0gICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gcXVlcnlfbXVkX3BvcnRcbiIpOwotCi0gICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGVmdW46Om9iamVjdHAoYXJnc1swXSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUoYXJnc1swXSkpCi0gICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKGFyZ3NbMF0sIElJX01VRF9QT1JUKTsKLQotICAgIGlmKHNpemVvZihhcmdzKSAmJiBpbnRwKGFyZ3NbMF0pKQotICAgIHsKLSAgICAgICAgaW50KiBwb3J0cyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUyk7Ci0gICAgICAgIGlmKGFyZ3NbMF0gPCAtMSB8fCBhcmdzWzBdID49IHNpemVvZihwb3J0cykpCi0gICAgICAgICAgICByYWlzZV9lcnJvcihlZnVuOjpzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbXVkX3BvcnQoKTogdmFsdWUgJWQgb3V0IG9mIHJhbmdlLlxuIiwgYXJnc1swXSkpOwotICAgICAgICBlbHNlIGlmKGFyZ3NbMF0gPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHBvcnRzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHBvcnRzW2FyZ3NbMF1dOwotICAgIH0KLQotICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpWzBdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3ODI5Zi4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSgpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9vbmNlX2ludGVyYWN0aXZlKQotCi0jaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KLQotaW50IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqZWN0IG9iKQotewotICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTY5YzAuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zbm9vcCgpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotCi0jaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgotCi1wcml2YXRlIG9iamVjdCBfcXVlcnlfc25vb3Aob2JqZWN0IG9iKQotewotICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgb2JqZWN0IHByZXYgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKLSAgICBlZnVuOjpzZXRfdGhpc19vYmplY3QocHJldik7Ci0jaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3Nub29wKQotICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9TTk9PUF9ORVhUKTsKLSNlbHNlCi0gICAgcmV0dXJuIGVmdW46OnF1ZXJ5X3Nub29wKG9iKTsKLSNlbmRpZgotfQotCi1ub21hc2sgb2JqZWN0IHF1ZXJ5X3Nub29wKG9iamVjdCB3aG8pIHsKLSAgb2JqZWN0IHNub29wZXI7Ci0KLSAgc25vb3Blcj1fcXVlcnlfc25vb3Aod2hvKTsKLSAgaWYgKCFzbm9vcGVyKSByZXR1cm4gMDsKLSAgaWYgKHF1ZXJ5X3dpel9ncnAoc25vb3Blcik+cXVlcnlfd2l6X2dycChnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAmJgotICAgICAgSVNfQVJDSChzbm9vcGVyKSkgcmV0dXJuIDA7Ci0gIHJldHVybiBzbm9vcGVyOwotfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOTk1ZWIuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfaGVhcnRfYmVhdCgpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfaGVhcnRfYmVhdCkKLQotI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KLQotaW50IHNldF9oZWFydF9iZWF0KGludCBmbGFnKQotewotICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOwotICAgIGludCBoYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKLQotICAgIGlmICghZmxhZyA9PSAhaGIpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDFjY2RiLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKiBUaGVzZSBhcmUgdGhlIHNwZWNpYWwgY29tbWFuZHMgZnJvbSB0aGUgZHJpdmVyIHRoYXQgYXJlIGFjdGl2YXRlZCB3aXRoCi0gKiBzZXRfaXNfd2l6YXJkKCkuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbGF5ZXIgb2JqZWN0LgotICogQWxzbyBzZXRfaXNfd2l6YXJkKCkgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGxheWVyIG9iamVjdCwKLSAqIG5vdCBhcyBhbiAoc2ltdWwtKWVmdW4uCi0gKi8KLQotI2luY2x1ZGUgPGNvbW1hbmRzLmg+Ci0jaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KLQotLyogaXNfd2l6YXJkOgotICogIDE6IGhhcyBhY3Rpb25zLAotICogIDA6IG5ldmVyIGhhZCBhY3Rpb25zLAotICogLTE6IGhhZCBhY3Rpb25zIG9uY2UuCi0gKi8KLXByaXZhdGUgbm9zYXZlIGludCBpc193aXphcmQ7Ci0KLXByaXZhdGUgaW50IGRyaXZlcl9tYWxsb2Moc3RyaW5nIHN0cikKLXsKLSAgICBpZihpc193aXphcmQgPD0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZighc2l6ZW9mKHN0cikpCi0gICAgewotICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0MpKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYoc3RyID09ICJleHRzdGF0cyIpCi0gICAgewotICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQpKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXByaXZhdGUgaW50IGRyaXZlcl9kdW1wYWxsb2JqKHN0cmluZyBzdHIpCi17Ci0gICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgd3JpdGUoIkR1bXBpbmcgdG8gL09CSl9EVU1QIC4uLiAiKTsKLSAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTKTsKLSAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTX0RFU1RSVUNURUQpOwotICAgIHdyaXRlKCJkb25lXG4iKTsKLSAgICByZXR1cm4gMTsKLX0KLQotcHJpdmF0ZSBpbnQgZHJpdmVyX29wY2R1bXAoc3RyaW5nIHN0cikKLXsKLSAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PUENPREVTKTsKLSAgICByZXR1cm4gMTsKLX0KLQotcHJpdmF0ZSBpbnQgZHJpdmVyX3N0YXR1cyhzdHJpbmcgc3RyKQotewotICAgIGludCBvcHQ7Ci0gICAgaWYoaXNfd2l6YXJkIDw9IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgc3dpdGNoKHN0ciB8fCAiIikKLSAgICB7Ci0gICAgICAgIGNhc2UgIiI6Ci0gICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICJ0YWJsZXMiOgotICAgICAgICBjYXNlICIgdGFibGVzIjoKLSAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgInN3YXAiOgotICAgICAgICBjYXNlICIgc3dhcCI6Ci0gICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAibWFsbG9jIjoKLSAgICAgICAgY2FzZSAiIG1hbGxvYyI6Ci0gICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgotICAgICAgICBjYXNlICIgbWFsbG9jIGV4dHN0YXRzIjoKLSAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhvcHQpKTsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IHNldF9pc193aXphcmQodmFyYXJncyA8b2JqZWN0fGludD4qIGFyZ3MpCi17Ci0gICAgaW50IG9sZHZhbCA9IGlzX3dpemFyZDsKLQotICAgIGlmKCFzaXplb2YoYXJncykpCi0gICAgICAgIHJhaXNlX2Vycm9yKCJUb28gZmV3IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKLSAgICBpZihzaXplb2YoYXJncykgPiAyKQotICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOwotICAgIGlmKCFvYmplY3RwKGFyZ3NbMF0pKQotICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAxIHRvIHNldF9pc193aXphcmQoKVxuIik7Ci0gICAgaWYoYXJnc1swXSAhPSB0aGlzX29iamVjdCgpKQotICAgICAgICByYWlzZV9lcnJvcigiT25seSBzZXRfaXNfd2l6YXJkIGZvciB0aGUgY3VycmVudCBvYmplY3Qgc3VwcG9ydGVkXG4iKTsKLSAgICBpZih0aGlzX3BsYXllcigpICE9IHRoaXNfb2JqZWN0KCkpCi0gICAgICAgIHJhaXNlX2Vycm9yKCJUaGUgY3VycmVudCBvYmplY3QgbXVzdCBiZSB0aGlzX3BsYXllcigpIGZvciBzZXRfaXNfd2l6YXJkKClcbiIpOwotICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQotICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAyIHRvIHNldF9pc193aXphcmQoKVxuIik7Ci0KLSAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhYXJnc1sxXSkKLSAgICB7Ci0gICAgICAgIGlmKGlzX3dpemFyZCA+IDApCi0gICAgICAgICAgICBpc193aXphcmQgPSAtMTsKLSAgICB9Ci0gICAgZWxzZSBpZihzaXplb2YoYXJncykgPT0gMiAmJiBhcmdzWzFdPDApCi0gICAgewotICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIWlzX3dpemFyZCkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9tYWxsb2MsICJtYWxsb2MiKTsKLSAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfZHVtcGFsbG9iaiwgImR1bXBhbGxvYmoiKTsKLSAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfb3BjZHVtcCwgIm9wY2R1bXAiKTsKLSAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfc3RhdHVzLCAic3RhdHVzIiwgQUFfTk9TUEFDRSk7Ci0gICAgICAgIH0KLSAgICAgICAgaXNfd2l6YXJkID0gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb2xkdmFsID4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1OTY5Mi4uMDAwMDAwMAotLS0gYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X3Byb21wdCgpLgotICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCi0gKi8KLQotI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfcHJvbXB0KQotCi0jaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgotCi12YXJhcmdzIHN0cmluZ3xjbG9zdXJlIHNldF9wcm9tcHQoc3RyaW5nfGNsb3N1cmV8aW50IHByb21wdCwgb2JqZWN0IG9iKQotewotICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOwotCi0gICAgbWl4ZWQgb2xkcHJvbXB0ID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUNfUFJPTVBUKTsKLQotICAgIGlmKCFpbnRwKHByb21wdCkpCi0gICAgICAgIGVmdW46OmNvbmZpZ3VyZV9pbnRlcmFjdGl2ZShvYiwgSUNfUFJPTVBULCBwcm9tcHQpOwotCi0gICAgcmV0dXJuIG9sZHByb21wdDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaGFkb3cuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NoYWRvdy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA4YzczLi4wMDAwMDAwCi0tLSBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NoYWRvdy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3NoYWRvd2luZygpCi0gKiBhbmQgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gc2hhZG93KCkuCi0gKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KLSAqLwotCi0jaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3NoYWRvd2luZykKLQotI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+Ci0KLW9iamVjdCBxdWVyeV9zaGFkb3dpbmcob2JqZWN0IG9iKQotewotICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpOwotfQotCi1wcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCi17Ci0gICAgaWYoZmxhZykKLSAgICB7Ci0gICAgICAgIG9iamVjdCBzaGFkb3dlciA9IGVmdW46OnByZXZpb3VzX29iamVjdCgxKTsKLSAgICAgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHNoYWRvd2VyKTsKLQotICAgICAgICBpZiAoZWZ1bjo6c2hhZG93KG9iKSkKLSAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhzaGFkb3dlciwgT0lfU0hBRE9XX1BSRVYpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19ORVhUKTsKLX0KLSNlbHNlCi1wcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCi17Ci0gIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOwotICByZXR1cm4gZWZ1bjo6c2hhZG93KG9iLCBmbGFnKTsKLX0KLSNlbmRpZgotCi0KLXB1YmxpYyBvYmplY3Qgc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCi17Ci0gIG9iamVjdCByZXMgPSBmdW5jYWxsKCMnX3NoYWRvdyxvYiwgZmxhZyk7Ci0gIGlmIChmbGFnKQotICAgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotcHJpdmF0ZSB2b2lkIF91bnNoYWRvdygpIHsKLSAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7Ci0gIGVmdW46OnVuc2hhZG93KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHVuc2hhZG93KCkgewotICBmdW5jYWxsKCMnX3Vuc2hhZG93KTsKLSAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+VW5yZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7Ci19CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjg3ODkuLjAwMDAwMDAKLS0tIGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5NSArMCwwIEBACi0vLyBNb3JnZW5HcmF1ZW4gTVVEbGliCi0vLwotLy8gc2ltdWxfZWZ1bi5jIC0tIHNpbXVsIGVmdW4ncwotLy8KLS8vICRJZDogc2ltdWxfZWZ1bi5jIDc0MDggMjAxMC0wMi0wNiAwMDoyNzoyNVogWmVzc3RyYSAkCi0jcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKLSNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93LG5vX2luaGVyaXQKLSNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCi0jcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAotCi0vLyBBYnNvbHV0ZSBQZmFkZSBlcmZvcmRlcmxpY2ggLSB6dW0gWmVpdHB1bmt0LCB3byBkZXIgTWFzdGVyIGdlbGFkZW4KLS8vIHdpcmQsIHNpbmQgbm9jaCBrZWluZSBJbmNsdWRlLVBmYWRlIGRhIC4uLgotCi0jZGVmaW5lIFNOT09QTE9HRklMRSAiU05PT1AiCi0jZGVmaW5lIEFTTk9PUExPR0ZJTEUgIkFSQ0gvU05PT1AiCi0KLSNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgotI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCi0jaW5jbHVkZSAiL3N5cy9zbm9vcGluZy5oIgotI2luY2x1ZGUgIi9zeXMvbGFuZ3VhZ2UuaCIKLSNpbmNsdWRlICIvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICIvc3lzL3dpemxpc3QuaCIKLSNpbmNsdWRlICIvc3lzL2VycS5oIgotI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKLSNpbmNsdWRlICIvc3lzL2RhZW1vbi5oIgotI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKLSNpbmNsdWRlICIvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgiCi0jaW5jbHVkZSAiL3N5cy9jb250YWluZXIuaCIKLSNpbmNsdWRlICIvc3lzL2RlZmluZXMuaCIKLSNpbmNsdWRlICIvc3lzL3RlbG5ldC5oIgotI2luY2x1ZGUgIi9zeXMvb2JqZWN0aW5mby5oIgotI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKLSNpbmNsdWRlICIvc3lzL3N0cmluZ3MuaCIKLSNpbmNsdWRlICIvc3lzL3RpbWUuaCIKLSNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCi0jaW5jbHVkZSAiL3N5cy9ub3RpZnlfZmFpbC5oIgotI2luY2x1ZGUgIi9zeXMvdGxzLmgiCi0jaW5jbHVkZSAiL3N5cy9pbnB1dF90by5oIgotI2luY2x1ZGUgIi9zeXMvb2JqZWN0X2luZm8uaCIKLQotLyogZnVuY3Rpb24gcHJvdG90eXBlcwotICovCi1zdHJpbmcgZHRpbWUoaW50IHdhbm4pOwotdmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKTsKLWludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKTsKLW5vbWFzayB2YXJhcmdzIGludCBzbm9vcChvYmplY3QgbWUsIG9iamVjdCB5b3UpOwotdmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSk7Ci1pbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopOwotcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpOwotbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKTsKLW5vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKTsKLXB1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpOwotbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSk7Ci12YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKTsKLQotCi0vL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAotI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCi12YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pOwotI2VuZGlmCi0jaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCi12YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKTsKLSNlbmRpZgotI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKLWludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpOwotI2VuZGlmCi0KLS8vIEluY2x1ZGUgdGhlIGRpZmZlcmVudCBzdWIgJ21vZHVsZXMnIG9mIHRoZSBzaW11bF9lZnVuCi0jaW5jbHVkZSBfX0RJUl9fImRlYnVnX2luZm8uYyIKLSNpbmNsdWRlIF9fRElSX18iZW5hYmxlX2NvbW1hbmRzLmMiCi0jaW5jbHVkZSBfX0RJUl9fImhhc2guYyIKLSNpbmNsdWRlIF9fRElSX18ib2JqZWN0X2luZm8uYyIKLSNpbmNsdWRlIF9fRElSX18icXVlcnlfZWRpdGluZy5jIgotI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pZGxlLmMiCi0jaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lucHV0X3BlbmRpbmcuYyIKLSNpbmNsdWRlIF9fRElSX18icXVlcnlfaXBfbmFtZS5jIgotI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9saW1pdHMuYyIKLSNpbmNsdWRlIF9fRElSX18icXVlcnlfbG9hZF9hdmVyYWdlLmMiCi0jaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X211ZF9wb3J0LmMiCi0jaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyIKLSNpbmNsdWRlIF9fRElSX18icXVlcnlfc25vb3AuYyIKLSNpbmNsdWRlIF9fRElSX18ic2V0X2hlYXJ0X2JlYXQuYyIKLSNpZiBfX0JPT1RfVElNRV9fIDwgMTQ1NjI2MTg1OQotI2luY2x1ZGUgX19ESVJfXyJzZXRfcHJvbXB0LmMiCi0jZW5kaWYKLSNpbmNsdWRlIF9fRElSX18ic2hhZG93LmMiCi0jaW5jbHVkZSBfX0RJUl9fImxpdmluZ3MuYyIKLSNpbmNsdWRlIF9fRElSX18iY29tbS5jIgotCi0jZGVmaW5lIFRPICAgICAgICBlZnVuOjp0aGlzX29iamVjdCgpCi0jZGVmaW5lIFRJICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKLSNkZWZpbmUgVFAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKLSNkZWZpbmUgUE8gICAgICAgIGVmdW46OnByZXZpb3VzX29iamVjdCgwKQotI2RlZmluZSBMRVZFTCh4KSBxdWVyeV93aXpfbGV2ZWwoeCkKLSNkZWZpbmUgTkFNRSh4KSAgY2FwaXRhbGl6ZShnZXR1aWQoeCkpCi0KLSNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIFwKLSAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSx4KQotCi1taXhlZCBkdGltZV9jYWNoZSA9ICh7LTEsIiJ9KTsKLQotI2lmZGVmIElPU1RBVFMKLXN0cnVjdCBpb3N0YXRfcyB7Ci0gIHN0cmluZyBvbmFtZTsKLSAgaW50IHRpbWU7Ci0gIGludCBzaXplOwotfTsKLW1peGVkIHNhdmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwgMCkgfSk7Ci1taXhlZCByZXN0b3Jlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsMCkgfSk7Ci0vL21peGVkIHdyaXRlZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKLS8vbWl4ZWQgcmVhZGZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7Ci0vL21peGVkIGxvZ19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKLQotbWl4ZWQgX19faW9zdGF0cyhpbnQgdHlwZSkgewotICBzd2l0Y2godHlwZSkgewotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiBzYXZlb19zdGF0OwotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiByZXN0b3Jlb19zdGF0OwotLyogICAgY2FzZSAzOgotICAgICAgcmV0dXJuIHdyaXRlZmlsZV9zdGF0OwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiByZWFkZmlsZV9zdGF0OwotICAgIGNhc2UgNToKLSAgICAgIHJldHVybiBsb2dfc3RhdDsKLSAgICAgICovCi0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGllIHNpbXVsX2VmdW4gZW50c29yZ2VuIGtvZW5uZW4uCi1zdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgewotICAgIGlmKCAoY2FsbGVyIT10aGlzX29iamVjdCgpICYmICFBUkNIX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKLSAgICAgIHJldHVybiAiRHUgZGFyZnN0IGRhcyBzaW11bF9lZnVuIE9iamVrdCBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXB1YmxpYyBub21hc2sgdm9pZCByZW1vdmVfaW50ZXJhY3RpdmUoIG9iamVjdCBvYiApCi17Ci0gICAgaWYgKCBvYmplY3RwKG9iKSAmJiBwcmV2aW91c19vYmplY3QoKQotICAgICAgICAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10gIT0gIi9zZWN1cmUvIgotICAgICAgICAmJiAoKHByZXZpb3VzX29iamVjdCgpICE9IG9iCi0gICAgICAgICAgICAgJiYgKG9iICE9IHRoaXNfcGxheWVyKCkgfHwgb2IgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKSkKLSAgICAgICAgICAgIHx8IChwcmV2aW91c19vYmplY3QoKSA9PSBvYgotICAgICAgICAgICAgICAgJiYgKHRoaXNfcGxheWVyKCkgJiYgdGhpc19wbGF5ZXIoKSAhPSBvYgotICAgICAgICAgICAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgIT0gb2IpKSApICkKLQotICAgICAgIGxvZ19maWxlKCAiUExBWUVSREVTVCIsCi0gICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlTyBhdXNnZWxvZ2d0IHZvbiBQTyAlTywgVEkgJU8sIFRQICVPXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2IsIHByZXZpb3VzX29iamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpICkgKTsKLQotICAgIGVmdW46OnJlbW92ZV9pbnRlcmFjdGl2ZShvYik7Ci19Ci0KLQotdm9pZCBfX191cGRtYXN0ZXIoKQotewotICAgIG9iamVjdCBvYjsKLQotICAgIC8vc29sbHRlIG5pY2h0IGplZGVyIGR1ZXJmZW4uCi0gICAgaWYgKHByb2Nlc3NfY2FsbCgpIHx8ICFBUkNIX1NFQ1VSSVRZKQotICAgICAgcmFpc2VfZXJyb3IoIklsbGVnYWwgdXNlIG9mIF9fX3VwZG1hc3RlcigpISIpOwotCi0gICAgd3JpdGUoIlJlbW92aW5nIG9sZCBtYXN0ZXIgLi4uICIpOwotICAgIGZvcmVhY2goc3RyaW5nIGZpbGU6IAotICAgICAgICBnZXRfZGlyKCIvc2VjdXJlL21hc3Rlci8qLmMiLEdFVERJUl9OQU1FU3xHRVRESVJfVU5TT1JURUR8R0VURElSX1BBVEgpKSB7Ci0gICAgICBpZiAob2IgPSBmaW5kX29iamVjdChmaWxlKSkKLSAgICAgICBlZnVuOjpkZXN0cnVjdChvYik7Ci0gICAgfQotICAgIGVmdW46OmRlc3RydWN0KGVmdW46OmZpbmRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpKTsKLSAgICB3cml0ZSgiZG9uZS5cbkxvYWRpbmcgYWdhaW4gLi4uICIpOwotICAgIGxvYWRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpOwotCi0gICAgd3JpdGUoImRvbmUuXG4iKTsKLX0KLQotdmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSkgewotICBtaXhlZCByZXQ7Ci0KLSAgaWYocmV0ID0gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+Y291bnRyeShudW0gfHwgaXApKSB7Ci0gICAgcmV0dXJuIHJldDsKLSAgfSBlbHNlIHJldHVybiAiPz8/IjsKLX0KLQotCi0vLyAqIFNub29wZW4gdW5kIHdhcyBkYXp1Z2Vob2VydAotc3RhdGljIG9iamVjdCBmaW5kX3Nub29wZWQob2JqZWN0IHdobykKLXsKLSAgb2JqZWN0ICp1OwotICBpbnQgaTsKLQotICBmb3IgKGk9c2l6ZW9mKHU9dXNlcnMoKSktMTtpPj0wO2ktLSkKLSAgICBpZiAod2hvPT1lZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHVbaV0sIElJX1NOT09QX05FWFQpKQotICAgICAgcmV0dXJuIHVbaV07Ci0gIHJldHVybiAwOwotfQotCi1wcml2YXRlIHN0cmluZyBMY3V0KHN0cmluZyBzdHIpIHsKLSAgcmV0dXJuIHN0cls1Li4xMV0rc3RyWzE4Li5dOwotfQotCi1ub21hc2sgdmFyYXJncyBpbnQgc25vb3AoIG9iamVjdCBtZSwgb2JqZWN0IHlvdSApCi17Ci0gICAgaW50IHJldDsKLSAgICBvYmplY3Qgc25vb3BlcjAsIHNub29wZXIsIHNub29wZXIyLCBzbm9vcGVyMzsKLQotICAgIGlmKCAhb2JqZWN0cChtZSkgfHwgbWUgPT0geW91IHx8ICFQTyApCi0gICAgICAgcmV0dXJuIDA7Ci0KLSAgICBzbm9vcGVyMCA9IGZpbmRfc25vb3BlZChtZSk7Ci0KLSAgICAgaWYoeW91KXsKLSAgICAgICAgaWYgKCBQTyAhPSBtZSAmJiBxdWVyeV93aXpfZ3JwKG1lKSA+PSBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpZiAoIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgotICAgICAgICAgICAgICEoeW91LT5RdWVyeUFsbG93U25vb3AobWUpKSApCi0gICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpIHx8IElTX0FSQ0goeW91KSApCi0gICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpZiAoIChzbm9vcGVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpKSAmJgotICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoc25vb3BlcikgPj0gcXVlcnlfd2l6X2dycChtZSkgKXsKLSAgICAgICAgICAgIGlmICggKGludClzbm9vcGVyLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApCi0gICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICIlcyBzbm9vcGVkIGpldHp0ICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLT5uYW1lKFdFUiksIHlvdS0+bmFtZShXRVIpICkgKTsKLQotICAgICAgICAgICAgc25vb3BlcjIgPSBtZTsKLQotICAgICAgICAgICAgd2hpbGUgKCBzbm9vcGVyMyA9IGludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICl7Ci0gICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3BlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyB3aXJkIHNlaW5lcnNlaXRzIHZvbiAlcyBnZXNub29wZWQuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzbm9vcGVyMi0+bmFtZShXRVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMy0+bmFtZShXRU0pICkgKTsKLSAgICAgICAgICAgICAgIHNub29wZXIyID0gc25vb3BlcjM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVmdW46OnNub29wKCBzbm9vcGVyLCBzbm9vcGVyMiApOwotCi0gICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICE9IHNub29wZXIgKQotICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBrYW5uc3QgJXMgbmljaHQgc25vb3Blbi5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IHNub29wc3QgamV0enQgJXMuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7Ci0gICAgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkoc25vb3BlcikgKXsKLSAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCIlczogJU8gJU8gJU9cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoc25vb3BlcjApCi0gICAgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKLQotICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgLT4gJXMgKCVPKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDAwMDAgKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAoc25vb3BlcikKLSAgICAgICAgICAgICAgIGlmICggIW1lLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApewotICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiVzIHdpcmQgYmVyZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLiBCZW51dHplIGRhcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcImZcIi1GbGFnLCB3ZW5uIGR1IGRlbm5vY2ggc25vb3BlbiB3aWxsc3QuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UtPm5hbWUoV0VSKSwgc25vb3Blci0+bmFtZShXRU0pICk7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gZWZ1bjo6c25vb3AoIG1lLCB5b3UgKTsKLQotICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICYmIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSl7Ci0gICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCi0gICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKLQotICAgICAgICAgICAgaWYgKHNub29wZXIwKQotICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOwotCi0gICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsIHNwcmludGYoICIlcyAtPiAlcyAoJU8pLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoeW91KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCh5b3UpICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlewotICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUgKXsKLSAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCByZXQgJiYgcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCi0gICAgICAgICAgICAgIUlTX0RFUFVUWShtZSkgKQotICAgICAgICAgICAgdGVsbF9vYmplY3QoIHlvdSwgIioqKiAiICsgTkFNRShtZSkgKyAiIHNub29wdCBEaWNoIVxuIiApOwotCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgIH0KLSAgICAgZWxzZSB7Ci0gICAgICAgIGlmICggKG1lID09IFBPIHx8Ci0gICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID4gcXVlcnlfd2l6X2dycChtZSkgfHwKLSAgICAgICAgICAgICAgKHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID09IHF1ZXJ5X3dpel9ncnAobWUpICYmCi0gICAgICAgICAgICAgIGVmdW46OmludGVyYWN0aXZlX2luZm8oUE8sIElJX1NOT09QX05FWFQpID09IG1lKSkgJiYgc25vb3BlcjAgKXsKLSAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgKXsKLSAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCi0gICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKLQotICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCi0gICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGVmdW46OnNub29wKG1lKTsKLSAgICAgICAgfQotICAgICB9Ci0gICAgIHJldHVybiAwOwotfQotCi0KLQotLy8gKiBFbXVsYXRpb24gZGVzICdhbHRlbicgZXhwbG9kZSBkdXJjaCBkYXMgbmV1ZQotc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKSB7Ci0gIGludCBzLCB0OwotICBzdHJpbmcgKnN0cnM7Ci0KLSAgaWYgKCFzdHJpbmdwKHN0cikpIHsKLSAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0gICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAotICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMSB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCi0gICAgICAgICAiJS4zME9cbiIsc3RyKSk7Ci0gIH0KLSAgaWYgKCFzdHJpbmdwKGRlbCkpIHsKLSAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0gICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAotICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMiB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCi0gICAgICAgICAiJS4zME9cbiIsZGVsKSk7Ci0gIH0KLSAgaWYoZGVsID09ICIiKQotICAgIHJldHVybiAoe3N0cn0pOwotICBzdHJzPWVmdW46OmV4cGxvZGUoc3RyLCBkZWwpOwotICB0PXNpemVvZihzdHJzKS0xOwotICB3aGlsZShzPD10ICYmIHN0cnNbcysrXSA9PSAiIik7cy0tOwotICB3aGlsZSh0Pj0wICYmIHN0cnNbdC0tXSA9PSAiIik7dCsrOwotICBpZihzPD10KQotICAgIHJldHVybiBzdHJzW3MuLnRdOwotICByZXR1cm4gKHt9KTsKLX0KLQotaW50IGZpbGVfdGltZShzdHJpbmcgcGF0aCkgewotICBtaXhlZCAqdjsKLQotICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICBpZiAoc2l6ZW9mKHY9Z2V0X2RpcihwYXRoLEdFVERJUl9EQVRFUykpKSByZXR1cm4gdlswXTsKLSAgcmV0dXJuKDApOyAvL3NvbnN0Ci19Ci0KLS8vICogQmVpIDUwayBHcm9lc3NlIExvZy1GaWxlIHJvdGllcmVuCi12YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspIHsKLSAgbWl4ZWQgKnN0OwotCi0gIGZpbGU9Ii9sb2cvIitmaWxlOwotICBmaWxlPWltcGxvZGUoKGVmdW46OmV4cGxvZGUoZmlsZSwiLyIpLSh7Ii4uIn0pKSwiLyIpOwotLy8gIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSxzcHJpbnRmKCJMT0cgRklMRTogJU8gLT4gJU9cbiIscHJldmlvdXNfb2JqZWN0KCksZmlsZSkpOwotICBpZiAoIWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjYWxsX290aGVyLFBPKSwic2VjdXJlL21hc3RlciIsLy8nKQotICAgICAgICAgICAgICAidmFsaWRfd3JpdGUiLGZpbGUsZ2V0ZXVpZChQTyksImxvZ19maWxlIixQTykpCi0gICAgICByZXR1cm4gMDsKLSAgaWYgKCBzaXplX3RvX2JyZWFrID49IDAgJiAoCi0gICAgICBzaXplb2Yoc3QgPSBnZXRfZGlyKGZpbGUsMikgKSAmJiBzdFswXSA+PSAoc2l6ZV90b19icmVha3xNQVhfTE9HX1NJWkUpKSkKLSAgICAgIGNhdGNoKHJlbmFtZShmaWxlLCBmaWxlICsgIi5vbGQiKTtwdWJsaXNoKTsgLyogTm8gcGFuaWMgaWYgZmFpbHVyZSAqLwotICByZXR1cm4od3JpdGVfZmlsZShmaWxlLHR4dCkpOwotfQotCi0vLyAqIE1hZ2llci1MZXZlbCBhYmZyYWdlbgotaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpIHsKLSAgcmV0dXJuIChpbnQpIi9zZWN1cmUvbWFzdGVyIi0+cXVlcnlfd2l6X2xldmVsKHBsYXllcik7Ci19Ci0KLSNpZmRlZiBfX0FMSVNUU19fCi0vLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBrZXkpCi1taXhlZCAqcmVtb3ZlX2FsaXN0KG1peGVkIGtleSxtaXhlZCAqYWxpc3QpCi17Ci0gIGludCBpLGo7Ci0KLSAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkpCi0gICAgcmV0dXJuIGFsaXN0OwotICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKLSAgewotICAgIGlmICgoaT1hc3NvYyhrZXksYWxpc3QpKTwwKQotICAgICAgcmV0dXJuIGFsaXN0OwotICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKLSAgfQotICBpID0gYXNzb2Moa2V5LGFsaXN0WzBdKTsKLSAgaWYgKChpPWFzc29jKGtleSxhbGlzdFswXSkpPDApCi0gICAgcmV0dXJuIGFsaXN0OwotICBhbGlzdD1hbGlzdFswLi5dOwotICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQotICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOwotICByZXR1cm4gYWxpc3Q7Ci19Ci0KLS8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IHBvcykKLW1peGVkICpleGNsdWRlX2FsaXN0KGludCBpLG1peGVkICphbGlzdCkKLXsKLSAgaW50IGo7Ci0gIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpIHx8IGk8MCkKLSAgICByZXR1cm4gYWxpc3Q7Ci0gIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQotICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKLSAgYWxpc3Q9YWxpc3RbMC4uXTsgLyogQ3JlYXRlIFBIWVNJQ0FMIGNvcHkgb2YgYWxpc3QgKi8KLSAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKLSAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKLSAgcmV0dXJuIGFsaXN0OyAvKiBvcmRlcl9hbGlzdCBpcyBOT1QgbmVjZXNzYXJ5IC0gc2VlIC9kb2MvTFBDL2FsaXN0ICovCi19Ci0jZW5kaWYgLy8gX19BTElTVFNfXwotCi0vLyAqIEdlcm1hbiB2ZXJzaW9uIG9mIGN0aW1lKCkKLSNkZWZpbmUgVEFHRSAoeyJTb24iLCJNb24iLCJEaWUiLCJNaXQiLCJEb24iLCJGcmUiLCJTYW0ifSkKLSNkZWZpbmUgTU9OQVRFICh7IkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsXAotICAgICAgICAgICAgICAgICAiU2VwIiwiT2t0IiwiTm92IiwiRGV6In0pCi1zdHJpbmcgZHRpbWUoaW50IHdhbm4pIHsKLSAgCi0gIGlmICh3YW5uID09IGR0aW1lX2NhY2hlWzBdKQotICAgIHJldHVybihkdGltZV9jYWNoZVsxXSk7Ci0KLSAgaW50ICpsdCA9IGxvY2FsdGltZSh3YW5uKTsKLSAgcmV0dXJuIHNwcmludGYoIiVzLCAlMmQuICVzICVkLCAlMDJkOiUwMmQ6JTAyZCIsCi0gICAgICBUQUdFW2x0W1RNX1dEQVldXSwgbHRbVE1fTURBWV0sIE1PTkFURVtsdFtUTV9NT05dXSwgCi0gICAgICBsdFtUTV9ZRUFSXSxsdFtUTV9IT1VSXSwgbHRbVE1fTUlOXSwgbHRbVE1fU0VDXSk7Ci19Ci0KLS8vIHdlbm4gc3RyZnRpbWUgaW0gRHJpdmVyIG5pY2h0IGV4aXN0aWVydCwgaXN0IGRpZXMgaGllciBlaW4gQWxpYXMgYXVmIGR0aW1lKCksCi0vLyB6d2FyIHN0aW1tdCBkYXMgRm9ybWF0IGRhbm4gbmljaHQsIGFiZXIgZGllIE11ZGxpYiBidWdndCBuaWNodCB1bmQgc2NocmVpYnQKLS8vIGVpbiBvcmRlbnRsaWNoZXMgRGF0dW0vVWhyemVpdC4KLSNpZiAhX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKLXZhcmFyZ3Mgc3RyaW5nIHN0cmZ0aW1lKG1peGVkIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKSB7Ci0gIGlmIChpbnRwKGNsb2NrKSAmJiBjbG9jayA+PSAwKQotICAgIHJldHVybiBkdGltZShjbG9jayk7Ci0gIGVsc2UgaWYgKGludHAoZm10KSAmJiBmbXQgPj0gMCkKLSAgICByZXR1cm4gZHRpbWUoZm10KTsKLSAgCi0gIHJldHVybiBkdGltZSh0aW1lKCkpOwotfQotI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCi0KLS8vICogU2h1dGRvd24gbWl0IHp1c2FldHpsaWNoZW0gbG9nZ2luZwotbm9tYXNrIGludCBzaHV0ZG93bihzdHJpbmcgcmVhc29uKQotewotICBzdHJpbmcgbmFtZTsKLSAgc3RyaW5nIG9ibmFtZTsKLSAgc3RyaW5nIG91dHB1dDsKLQotICBpZiAoIXJlYXNvbikKLSAgICByZXR1cm4gMDsKLSAgaWYgKCAhQVJDSF9TRUNVUklUWSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpIT1ST09USUQgJiYKLSAgICAgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkhPSIvb2JqL3NodXQiICkKLSAgewotICAgIHdyaXRlKCJZb3UgaGF2ZSBubyBwZXJtaXNzaW9uIHRvIHNodXQgZG93biB0aGUgZ2FtZWRyaXZlciFcbiIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICgodGhpc19pbnRlcmFjdGl2ZSgpKSYmKG5hbWU9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKQotICB7Ci0gICAgbmFtZT1jYXBpdGFsaXplKG5hbWUpOwotICAgIGZpbHRlcih1c2VycygpLCMndGVsbF9vYmplY3QsLy8nCi0gICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUpKyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlciFcbiIpOwotICB9Ci0gIGVsc2UKLSAgICBuYW1lPSJBTk9OWU1PVVMiOwotICBpZiAocHJldmlvdXNfb2JqZWN0KCkpIG9ibmFtZT1jYXBpdGFsaXplKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOwotICBvdXRwdXQ9bmFtZTsKLSAgaWYgKG9ibmFtZSAmJiBuYW1lIT1vYm5hbWUpIG91dHB1dD1vdXRwdXQrIiAoIitvYm5hbWUrIikiOwotICBpZiAocHJldmlvdXNfb2JqZWN0KCkmJm9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKT09Ii9vYmovc2h1dCIpewotICAgIG91dHB1dCs9IiBmYWVocnQgZGFzIFNwaWVsIHZpYSBBcm1hZ2VkZG9uIGhlcnVudGVyLlxuIjsKLSAgICBvdXRwdXQ9ZHRpbWUodGltZSgpKSsiOiAiK291dHB1dDsKLSAgICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKLSAgICBlZnVuOjpzaHV0ZG93bigpOwotICAgIHJldHVybiAxOwotICB9Ci0gIG91dHB1dD1jdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0KyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlci5cbiI7Ci0gIG91dHB1dCs9IiAgICBHcnVuZDogIityZWFzb247Ci0gIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOwotICBlZnVuOjpzaHV0ZG93bigpOwotICByZXR1cm4gMTsKLX0KLQotLy8gKiBsb3dlcmNoYXIKLQotaW50IGxvd2VyY2hhcihpbnQgY2hhcikgewotICBpZiAoY2hhcjwnQScgfHwgY2hhcj4nWicpIHJldHVybiBjaGFyOwotICByZXR1cm4gY2hhciszMjsKLX0KLQotLy8gKiB1cHBlcnN0cmluZwotCi1zdHJpbmcgdXBwZXJzdHJpbmcoc3RyaW5nIHMpCi17Ci0jaWYgX19FRlVOX0RFRklORURfXyh1cHBlcl9jYXNlKQotICByZXR1cm4odXBwZXJfY2FzZShzKSk7Ci0jZWxzZQotICBpbnQgaTsKLSAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKLSAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSBzW2ldPSgoc1tpXTwnYSd8fHNbaV0+J3onKT9zW2ldOnNbaV0tMzIpOwotICByZXR1cm4gczsKLSNlbmRpZgotfQotCi0vLyAqIGxvd2Vyc3RyaW5nCi0KLXN0cmluZyBsb3dlcnN0cmluZyhzdHJpbmcgcykKLXsKLSAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKLSAgcmV0dXJuIGxvd2VyX2Nhc2Uocyk7Ci19Ci0KLQotLy8gKiBHRCB2ZXJzaW9uCi1zdHJpbmcgdmVyc2lvbigpCi17Ci0gIHJldHVybiBfX1ZFUlNJT05fXzsKLX0KLQotLy8gKiBicmVha19zdHJpbmcKLS8vIHN0cmV0Y2goKSAtLSBzdHJldGNoIGEgbGluZSB0byBmaWxsIGEgZ2l2ZW4gd2lkdGggCi1wcml2YXRlIHN0cmluZyBzdHJldGNoKHN0cmluZyBzLCBpbnQgd2lkdGgpIHsKLSAgaW50IGxlbj1zaXplb2Yocyk7Ci0gIGlmIChsZW49PXdpZHRoKSByZXR1cm4gczsKLQotICAvLyByZWluZSBMZWVyemVpbGVuLCBkaXJla3QgenVydWVja2dlYmVuCi0gIHN0cmluZyB0cmltbWVkPXRyaW0ocyxUUklNX0xFRlQsIiAiKTsKLSAgaWYgKHRyaW1tZWQ9PSIiKSByZXR1cm4gczsgCi0gIGludCBzdGFydF9zcGFjZXMgPSBsZW4gLSBzaXplb2YodHJpbW1lZCk7Ci0KLSAgc3RyaW5nKiB3b3JkcyA9IGV4cGxvZGUodHJpbW1lZCwgIiAiKTsKLSAgLy8gZGVyIGxldHp0ZSBrcmllZ3Qga2VpbmUgU3BhY2VzCi0gIGludCB3b3JkX2NvdW50PXNpemVvZih3b3JkcykgLSAxOwotICAvLyB3ZW5uIFplaWxlIG51ciBhdXMgZWluZW0gV29ydCwgd2lyZCBkYXMgV29ydCB6dXJ1ZWNrZ2VnZWJlbgotICBpZiAoIXdvcmRfY291bnQpCi0gICAgcmV0dXJuICIgIipzdGFydF9zcGFjZXMgKyB3b3Jkc1swXTsKLQotICBpbnQgc3BhY2VfY291bnQgPSB3aWR0aCAtIGxlbjsKLQotICBpbnQgc3BhY2VfcGVyX3dvcmQ9KHdvcmRfY291bnQrc3BhY2VfY291bnQpIC8gd29yZF9jb3VudDsKLSAgLy8gQW56LldvZXJ0ZXIgbWl0IFp1c2F0ei1TcGFjZQotICBpbnQgcmVzdD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgJSB3b3JkX2NvdW50OyAKLSAgLy8gUmVzdC1TcGFjZXMgVmVydGVpbGVuCi0gIGZvcmVhY2ggKGludCBwb3MgOiByZXN0KSB3b3Jkc1twb3NdKz0iICI7Ci0gIHJldHVybiAoIiAiKnN0YXJ0X3NwYWNlcykgKyBpbXBsb2RlKCB3b3JkcywgIiAiKnNwYWNlX3Blcl93b3JkICk7Ci19Ci0KLS8vIGF1cyBHZXNjaHdpbmRpZ2tlaXRzZ3J1ZW5kZW4gaGF0IGRlciBCbG9ja3NhdHogZnVlciBicmVha19zdHJpbmcgZWluZQotLy8gZWlnZW5lIEZ1bmt0aW9uIGJla29tbWVuOgotcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBibG9ja19zdHJpbmcoc3RyaW5nIHMsIGludCB3aWR0aCwgaW50IGZsYWdzKSB7Ci0gIC8vIHdlbm4gQlNfTEVBVkVfTVlfTEZTLCBhYmVyIGtlaW4gQlNfTk9fUEFSSU5ERU5ULCBkYW5uIHdlcmRlbiBaZWlsZW4gbWl0Ci0gIC8vIGVpbmVtIExlZXJ6ZWljaGVuIGJlZ29ubmVuLgotICAvLyBCVFc6IFdlbm4gIUJTX0xFQVZFX01ZX0xGUywgaGF0IGRlciBBdWZydWZlciBiZXJlaXRzIGFsbGUgXG4gZHVyY2ggIiAiCi0gIC8vIGVyc2V0enQuCi0gIGlmICggKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKQotICAgICAgJiYgIShmbGFncyAmIEJTX05PX1BBUklOREVOVCkpCi0gIHsKLSAgICAgIHMgPSAiICIrcmVncmVwbGFjZShzLCJcbiIsIlxuICIsMSk7Ci0gIH0KLQotICAvLyBzcHJpbnRmIGZ1ZWxsdCBkaWUgbGV0enRlIFplaWxlIGF1ZiBkaWUgRmVsZGJyZWl0ZSAoaGllciBhbHNvCi0gIC8vIFplaWxlbmJyZWl0ZSkgbWl0IEZ1ZWxsemVpY2hlbiBhdWYsIHdlbm4gc2llIE5JQ0hUIG1pdCBcbiB1bWdlYnJvY2hlbgotICAvLyBpc3QuIEVzIHdpcmQgYW4gZGllIGxldHp0ZSBaZWlsZSBhYmVyIGtlaW4gWmVpbGVudW1icnVjaCBhbmdlaGFlbmd0LgotICAvLyBFaWdlbnRsaWNoIGlzdCBkYXMgQXVmZnVlbGxlbiBkb29mLCBhYmVyIHZlcm11dGxpY2ggaXN0IGVzIHVubm9ldGlnLCBlcwotICAvLyB3aWVkZXIgcnVlY2tnYWVuZ2lnIHp1IG1hY2hlbi4KLSAgcyA9IHNwcmludGYoICIlLSo9cyIsIHdpZHRoLCBzKTsKLQotICBzdHJpbmcgKnRtcD1leHBsb2RlKHMsICJcbiIpOwotICAvLyBOdXIgd2VubiBzIG1laHJ6ZWlsaWcgaXN0LCBCbG9ja3NhdHogZHJhdXMgbWFjaGVuLiBEaWUgbGV0enRlIFplaWxlIHdpcmQKLSAgLy8gbmF0dWVybGljaCBuaWNodCBnZWRlaG50LiBTaWUgaXN0IGRhZnVlciBzY2hvbiB2b24gc3ByaW50ZigpIGF1ZmdlZnVlbGx0Ci0gIC8vIHdvcmRlbi4gQlRXOiBEaWUgbGV0enRlIFplaWxlIGVuZGV0IHUuVS4gbm9jaCBuaWNodCBtaXQgZWluZW0gXG4gKGJ6dy4KLSAgLy8gbnVyIGRhbm4sIHdlbm4gQlNfTEVBVkVfTVlfTEZTIHVuZCBkZXIgdWViZXJnZWJlbmUgVGV4dCBzY2hvbiBuZW4gXG4gYW0KLSAgLy8gRW5kZSBkZXIgbGV0enRlbiBaZWlsZSBoYXQpLCBkYXMgbWFjaHQgZGVyIEF1ZnJ1ZmVyLi4uCi0gIGlmIChzaXplb2YodG1wKSA+IDEpCi0gICAgcmV0dXJuIGltcGxvZGUoIG1hcCggdG1wWzAuLjwyXSwgIydzdHJldGNoLyonKi8sIHdpZHRoICksICJcbiIgKSAKLSAgICAgICsgIlxuIiArIHRtcFs8MV07Ci0KLSAgcmV0dXJuIHM7Ci19Ci0KLXB1YmxpYyB2YXJhcmdzIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHMsIGludCB3LCBtaXhlZCBpbmRlbnQsIGludCBmbGFncykKLXsKLSAgICBpZiAoICFzIHx8IHMgPT0gIiIgKSByZXR1cm4gIiI7Ci0KLSAgICBpZiAoICF3ICkgdz03ODsKLQotICAgIGlmKCBpbnRwKGluZGVudCkgKQotICAgICAgIGluZGVudCA9IGluZGVudCA/ICIgIippbmRlbnQgOiAiIjsKLQotICAgIGludCBpbmRlbnRsZW49c3RyaW5ncChpbmRlbnQpID8gc2l6ZW9mKGluZGVudCkgOiAwOwotCi0gICAgaWYgKGluZGVudGxlbj53KSB7Ci0gICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiYnJlYWtfc3RyaW5nOiBpbmRlbnQgbG9uZ2VyICVkIHRoYW4gd2lkdGggJWRcbiIsCi0gICAgICAgICAgICAgICAgICBpbmRlbnRsZW4sdykpOwotICAgICAgLy8gdz0oKGluZGVudGxlbi93KSsxKSp3OwotICAgIH0KLQotICAgIGlmICghKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSkgCi0gICAgICBzPXJlZ3JlcGxhY2UoIHMsICJcbiIsICIgIiwgMSApOwotCi0gICAgaWYgKCBmbGFncyAmIEJTX1NJTkdMRV9TUEFDRSApCi0gICAgICAgcyA9IHJlZ3JlcGxhY2UoIHMsICIoXnxcbnwgKSAgKiIsICJcXDEiLCAxICk7Ci0gCi0gICAgc3RyaW5nIHByZWZpeD0iIjsKLSAgICBpZiAoaW5kZW50bGVuICYmIGZsYWdzICYgQlNfUFJFUEVORF9JTkRFTlQpIHsKLSAgICAgIGlmIChpbmRlbnRsZW4rc2l6ZW9mKHMpID4gdyB8fCAKLSAgICAgICAgIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykgJiYgc3Ryc3RyKHMsIlxuIik+LTEpIHsKLSAgICAgICBwcmVmaXg9aW5kZW50KyJcbiI7Ci0gICAgICAgaW5kZW50PShmbGFncyAmIEJTX05PX1BBUklOREVOVCkgPyAiIiA6ICIgIjsKLSAgICAgICBpbmRlbnRsZW49c2l6ZW9mKGluZGVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBmbGFncyAmIEJTX0JMT0NLICkgewotICAgICAgLyoKLSAgICAgICAgICAgcyA9IGltcGxvZGUoIG1hcCggZXhwbG9kZSggcywgIlxuIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnYmxvY2tfc3RyaW5nLCB3LCBpbmRlbnRsZW4sIGZsYWdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAiIiApOwotICAgICAgKi8KLSAgICAgIHMgPSBibG9ja19zdHJpbmcoIHMgLCB3IC0gaW5kZW50bGVuLCBmbGFncyApOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHMgPSBzcHJpbnRmKCIlLTEuKj1zIix3LWluZGVudGxlbixzKTsKLSAgICB9Ci0gICAgaWYgKCBzWzwxXSAhPSAnXG4nICkgcyArPSAiXG4iOwotCi0gICAgaWYgKCAhaW5kZW50bGVuICkgcmV0dXJuIHByZWZpeCArIHM7Ci0gICAgCi0gICAgc3RyaW5nIGluZGVudDIgPSAoIGZsYWdzICYgQlNfSU5ERU5UX09OQ0UgKSA/ICgiICIqaW5kZW50bGVuKSA6aW5kZW50OwotICAgICAgCi0gICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIAotICAgICAgcmVncmVwbGFjZSggc1swLi48Ml0sICJcbiIsICJcbiIraW5kZW50MiwgMSApICsgIlxuIjsKLSAgICAgIC8qCi0gICAgICAgc3RyaW5nICpidWY7Ci0KLSAgICAgICBidWYgPSBleHBsb2RlKCBzLCAiXG4iICk7Ci0gICAgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIGltcGxvZGUoIGJ1ZlswLi48Ml0sICJcbiIraW5kZW50MiApICsgYnVmWzwxXSArICJcbiI7Ci0gICAgICAqLwotfQotCi0vLyAqIEVsZW1lbnRlIGF1cyBtYXBwaW5nIGxvZXNjaGVuIC0gbWFwcGluZyB2b3JoZXIga29waWVyZW4KLQotbWFwcGluZyBtX2NvcHlfZGVsZXRlKG1hcHBpbmcgbSwgbWl4ZWQga2V5KSB7Ci0gIHJldHVybiBtX2RlbGV0ZShjb3B5KG0pLCBrZXkpOwotfQotCi0vLyAqIHRpbWVzCi1pbnQgbGFzdF9yZWJvb3RfdGltZSgpCi17Ci0gIHJldHVybiBfX0JPT1RfVElNRV9fOwotfQotCi1pbnQgZmlyc3RfYm9vdF90aW1lKCkKLXsKLSAgcmV0dXJuIDcwMTUxNzYwMDsKLX0KLQotaW50IGV4aXN0X2RheXMoKQotewotICByZXR1cm4gKCgodGltZSgpLWZpcnN0X2Jvb3RfdGltZSgpKS84NjQwKSs1KS8xMDsKLX0KLQotLy8gKiB1cHRpbWUgOikKLXN0cmluZyB1cHRpbWUoKQotewotICBpbnQgdDsKLSAgaW50IHRtcDsKLSAgc3RyaW5nIHM7Ci0KLSAgdD10aW1lKCktX19CT09UX1RJTUVfXzsKLSAgcz0iIjsKLSAgaWYgKHQ+PTg2NDAwKQotICAgIHMrPXNwcmludGYoIiVkIFRhZyVzLCAiLHRtcD10Lzg2NDAwLCh0bXA9PTE/IiI6ImUiKSk7Ci0gIGlmICh0Pj0zNjAwKQotICAgIHMrPXNwcmludGYoIiVkIFN0dW5kZSVzLCAiLHRtcD0odD10JTg2NDAwKS8zNjAwLCh0bXA9PTE/IiI6Im4iKSk7Ci0gIGlmICh0PjYwKQotICAgIHMrPXNwcmludGYoIiVkIE1pbnV0ZSVzIHVuZCAiLHRtcD0odD10JTM2MDApLzYwLCh0bXA9PTE/IiI6Im4iKSk7Ci0gIHJldHVybiBzK3NwcmludGYoIiVkIFNla3VuZGUlcyIsdD10JTYwLCh0PT0xPyIiOiJuIikpOwotfQotCi0vLyAqIFdhcyB0dW4gYmVpICdkYW5nbGluZycgbGZ1bi1jbG9zdXJlcyA/Ci12b2lkIGRhbmdsaW5nX2xmdW5fY2xvc3VyZSgpIHsKLSAgcmFpc2VfZXJyb3IoImRhbmdsaW5nIGxmdW4gY2xvc3VyZVxuIik7Ci19Ci0KLS8vICogU3BlcnJlbiBhdXNzZXIgZnVlciBtYXN0ZXIvc2ltdWxfZWZ1bgotCi0jaWYgX19FRlVOX0RFRklORURfXyhzZXRfZW52aXJvbm1lbnQpCi1ub21hc2sgdm9pZCBzZXRfZW52aXJvbm1lbnQob2JqZWN0IG8xLCBvYmplY3QgbzIpIHsKLSAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKLX0KLSNlbmRpZgotCi1ub21hc2sgdm9pZCBzZXRfdGhpc19wbGF5ZXIob2JqZWN0IHBsKSB7Ci0gIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Ci19Ci0KLSNpZiBfX0VGVU5fREVGSU5FRF9fKGV4cG9ydF91aWQpCi1ub21hc2sgdm9pZCBleHBvcnRfdWlkKG9iamVjdCBvYikgewotICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOwotfQotI2VuZGlmCi0KLS8vICogSmV0enQgYXVjaCBjbG9zdXJlcwotaW50IHByb2Nlc3NfZmxhZzsKLQotcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCkKLXsKLSAgaWYgKHByb2Nlc3NfZmxhZz4wKQotICAgIHJldHVybiBwcm9jZXNzX2ZsYWc7Ci0gIGVsc2UgcmV0dXJuKDApOwotfQotCi1wcml2YXRlIG5vbWFzayBzdHJpbmcgX3Byb2Nlc3Nfc3RyaW5nKHN0cmluZyBzdHIsb2JqZWN0IHBvKSB7Ci0gICAgICAgICAgICAgIHNldF90aGlzX29iamVjdChwbyk7Ci0gICAgICAgICAgICAgIHJldHVybihlZnVuOjpwcm9jZXNzX3N0cmluZyhzdHIpKTsKLX0KLQotbm9tYXNrIHN0cmluZyBwcm9jZXNzX3N0cmluZyggbWl4ZWQgc3RyICkKLXsKLSAgc3RyaW5nIHRtcCwgZXJyOwotICBpbnQgZmxhZzsgCi0KLSAgaWYgKCBjbG9zdXJlcChzdHIpICkgewotICAgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOwotICAgICAgcmV0dXJuIGZ1bmNhbGwoc3RyKTsKLSAgfQotICBlbHNlIGlmIChzdHI9PTApCi0gICAgICByZXR1cm4oKHN0cmluZylzdHIpOwotICBlbHNlIGlmICggIXN0cmluZ3Aoc3RyKSApIHsKLSAgICAgIHJldHVybiB0b19zdHJpbmcoc3RyKTsKLSAgfQotCi0gIGlmICggIShmbGFnID0gcHJvY2Vzc19mbGFnID4gdGltZSgpIC0gNjApKSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcHJvY2Vzc19mbGFnPXRpbWUoKTsKLQotICBlcnIgPSBjYXRjaCh0bXAgPSBmdW5jYWxsKCMnX3Byb2Nlc3Nfc3RyaW5nLHN0cixwcmV2aW91c19vYmplY3QoKSk7IHB1Ymxpc2gpOwotCi0gIGlmICggIWZsYWcgKQotICAgIHByb2Nlc3NfZmxhZz0wOwotCi0gIGlmIChlcnIpIHsKLSAgICAvLyBWZXJhcmJlaXR1bmcgYWJicmVjaGVuCi0gICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLSAgICByYWlzZV9lcnJvcihlcnIpOwotICB9Ci0gIHJldHVybiB0bXA7Ci19Ci0KLS8vICdta2RpciAtcCcgLSBlcnpldWd0IGVpbmUga29tcGxldHRlIEhpZXJhcmNoaWUgdm9uIFZlcnplaWNobmlzc2VuLgotLy8gd2VubiBkYXMgVmVyemVpY2huaXMgYW5nZWxlZ3Qgd3VyZGUgb2RlciBzY2hvbiBleGlzdGllcnQsIHdpcmQgMQotLy8genVydWVja2dlbGllZmVydCwgc29uc3QgMC4KLS8vIFdpcmZ0IGVpbmVuIEZlaGxlciwgd2VubiBkYXMgYW5nZWJlbmUgVmVyemVpY2huaXMgbmljaHQgYWJzb2x1dCBpc3QhCi1wdWJsaWMgaW50IG1rZGlycChzdHJpbmcgZGlyKSB7Ci0gIC8vIHdlbm4gZXMgbnVyIGtlaW5lbiBmdWVocmVuZGVuIC8gZ2lidCwgaXN0IGRhcyBlaW4gRmVobGVyLgotICBpZiAoc3Ryc3RyKGRpciwgIi8iKSAhPSAwKQotICAgIHJhaXNlX2Vycm9yKCJta2RpcnAoKTogUGZhZCBpc3QgbmljaHQgYWJzb2x1dGUuXG4iKTsKLSAgLy8gY3V0IG9mZiB0cmFpbGluZyAvLi4uCi0gIGlmIChkaXJbPDFdPT0nLycpCi0gICAgICBkaXIgPSBkaXJbMC4uPDJdOwotCi0gIGludCBmc3RhdCA9IGZpbGVfc2l6ZShkaXIpOwotICAvLyB3ZW5uIGVzIHNjaG9uIGV4aXN0aWVydCwgdHVuIHdpciBlaW5mYWNoIHNvLCBhbHMgaGFldHRlbiB3aXIgZXMgYW5nZWxlZ3QuCi0gIGlmIChmc3RhdCA9PSBGU0laRV9ESVIpCi0gICAgcmV0dXJuIDE7Ci0gIC8vIHdlbm4gc2Nob24gbmUgRGF0ZWkgZXhpc3RpZXJ0LCBnZWh0IGVzIG5pY2h0LgotICBpZiAoZnN0YXQgIT0gRlNJWkVfTk9GSUxFKQotICAgIHJldHVybiAwOwotICAvLyB3ZW5uIGVzIG51ciBlaW5lbiAvIGdpYnQgKGRlbiBmdWVocmVuZGVuKSwgZGFubiBpc3QgZXMgZWluCi0gIC8vIHRvcGxldmVsLXZlcnplaWNobmlzLCB3YXMgZGlyZWt0IGFuZ2VsZWd0IHdpcmQuCi0gIGlmIChzdHJyc3RyKGRpciwiLyIpPT0wKSB7Ci0gICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOwotICB9Ci0KLSAgLy8gbWtkaXIoKSBuaWNodCBkaXJla3QgcnVmZW4sIHNvbmRlcm4gdm9yaGVyIGFscyBjbG9zdXJlIGFucyBhdWZydWZlbmRlCi0gIC8vIE9iamVrdCBiaW5kZW4uIFNvbnN0IGxhZXVmdCBkaWUgUmVjaHRlcHJ1ZWZ1bmcgaW4gdmFsaWRfd3JpdGUoKSBpbSBNYXN0ZXIKLSAgLy8gdW50ZXIgZGVyIEFubmFobWUsIGRhc3MgZGllIHNpbXVsX2VmdW4uYyBtaXQgaWhyZXIgcm9vdCBpZCB3YXMgd2lsbC4KLQotICAvLyBqZXR6dCByZWt1cnNpdiBkaWUgVmVyemVpY2huaXNoaWVyYXJjaGllIGFubGVnZW4uIFdlbm4gZGFzIGVyZm9sZ3JlaWNoCi0gIC8vIGlzdCwgZGFubiBrb2VubmVuIHdpciBqZXR6dCBtaXQgbWtkaXIgZGFzIHRpZWZzdGUgVmVyemVpY2huaXMgYW5sZWdlbgotICBpZiAobWtkaXJwKGRpclswLi5zdHJyc3RyKGRpciwiLyIpLTFdKSA9PSAxKQotICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKLX0KLQotCi0vLyAqIFByb3BlcnRpZXMgZ2dmcy4gbWl0c3BlaWNoZXJuCi1taXhlZCBzYXZlX29iamVjdChtaXhlZCBuYW1lKQotewotICBtYXBwaW5nIHByb3BlcnRpZXM7Ci0gIG1hcHBpbmcgc2F2ZTsKLSAgbWl4ZWQgaW5kZXgsIHJlczsKLSAgaW50IGk7Ci0KLSAgLy8gbnVyIFN0cmluZ3MgdW5kIDAgenVsYXNzZW4KLSAgaWYgKCghc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpKSAmJiAKLSAgICAgICghaW50cChuYW1lKSB8fCBuYW1lIT0wKSkgewotICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKLSAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCi0gICAgICAgICAiT25seSBub24tZW1wdHkgc3RyaW5ncyBhbmQgMCBtYXkgYmUgdXNlZCBhcyBmaWxlbmFtZSBpbiAiCi0gICAgICAgICAic2VmdW46OnNhdmVfb2JqZWN0KCkhIEFyZ3VtZW50IHdhcyAlT1xuIixuYW1lKSk7Ci0gIH0KLQotICBzYXZlID0gbV9hbGxvY2F0ZSgwLCAyKTsKLSAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKLQotICBpZihtYXBwaW5ncChwcm9wZXJ0aWVzKSkKLSAgewotICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXBwaW5nIHByb3BlcnRpZXMgd2l0aG91dCBTQVZFIGZsYWchCi0gICAgaW5kZXggPSBtX2luZGljZXMocHJvcGVydGllcyk7Ci0gICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7aS0tKQotICAgIHsKLSAgICAgIGlmKHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJiBTQVZFKQotICAgICAgewotICAgICAgIHNhdmVbaW5kZXhbaV1dID0gcHJvcGVydGllc1tpbmRleFtpXV07Ci0gICAgICAgc2F2ZVtpbmRleFtpXSwgRl9NT0RFXSA9Ci0gICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmCi0gICAgICAgICAgICAgICAgICAgICh+KFNFVE1OT1RGT1VORHxRVUVSWU1OT1RGT1VORHxRVUVSWUNBQ0hFRHxTRVRDQUNIRUQpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZWxzZSBzYXZlID0gKFtdKTsKLQotICAvLyBzYXZlIG9iamVjdCEKLSAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKHNhdmUpOwotICAvLyBmb3JtYXQ6IHdpZSBkZWZpbmllcnQgaW4gY29uZmlnLmgKLSAgaWYgKHN0cmluZ3AobmFtZSkpCi0gICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUsCi0gICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7Ci0gIGVsc2UKLSAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwKLSAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKLSAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOwotCi0jaWZkZWYgSU9TVEFUUwotICAvLyBTdGF0cy4uLgotICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKLSAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7Ci0gIHN0YXQtPnRpbWUgPSB0aW1lKCk7Ci0gIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAotICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKLSAgaWYgKHN0cmluZ3AobmFtZSkpCi0gICAgICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKLSAgZWxzZQotICAgICAgc3RhdC0+c2l6ZW9mKHJlcyk7Ci0gIC8vZGVidWdfbWVzc2FnZSgic2F2ZW86ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKLSAgc2F2ZW9fc3RhdFsxXVtzYXZlb19zdGF0WzBdXSA9IHN0YXQ7Ci0gIHNhdmVvX3N0YXRbMF0gPSAoc2F2ZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHNhdmVvX3N0YXRbMV0pOwotICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvIDI6ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXM7Ci19Ci0KLS8vICogQXVjaCBQcm9wZXJ0aWVzIGxhZGVuCi1pbnQgcmVzdG9yZV9vYmplY3Qoc3RyaW5nIG5hbWUpCi17Ci0gIGludCByZXN1bHQ7Ci0gIG1peGVkIGluZGV4OwotICBtaXhlZCBzYXZlOwotICBtYXBwaW5nIHByb3BlcnRpZXM7Ci0gIGludCBpOwotICBjbG9zdXJlIGNsOwotCi0gIC8vIGdldCBhY3R1YWwgcHJvcGVydHkgc2V0dGluZ3MgKGJ5IGNyZWF0ZSgpKQotICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOwotCi0vLyAgREVCVUcoc3ByaW50ZigiUkVTVE9SRSAlT1xuIixuYW1lKSk7Ci0gIC8vIHJlc3RvcmUgb2JqZWN0Ci0gIHJlc3VsdD1mdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6cmVzdG9yZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSk7Ci0gIC8vJykpCi0gIC8vX2dldF9zYXZlX2RhdGEgbGllZmVydCB0YXRzYWVjaGxpY2ggbWl4ZWQgenVydWVjaywgd2VubiBkYXMgYXVjaCBpbW1lciBlaW4gCi0gIC8vbWFwcGluZyBzZWluIHNvbGx0ZS4KLSAgc2F2ZSA9IChtaXhlZClwcmV2aW91c19vYmplY3QoKS0+X2dldF9zYXZlX2RhdGEoKTsKLSAgaWYobWFwcGluZ3Aoc2F2ZSkpCi0gIHsKLSAgICBpbmRleCA9IG1faW5kaWNlcyhzYXZlKTsKLSAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDsgaS0tKQotICAgIHsKLSAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV1dID0gc2F2ZVtpbmRleFtpXV07Ci0gICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdID0gc2F2ZVtpbmRleFtpXSwgRl9NT0RFXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ+KFNFVENBQ0hFRHxRVUVSWUNBQ0hFRCk7Ci0gICAgfQotICB9Ci0gIGVsc2UgcHJvcGVydGllcyA9IChbXSk7Ci0KLSAgLy8gcmVzdG9yZSBwcm9wZXJ0aWVzCi0gIGZ1bmNhbGwoCi0gICAgICAgICAgYmluZF9sYW1iZGEoCi0gICAgICAgICAgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSgoeydhcmd9KSwgLy8nfSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwoeyMndGhpc19vYmplY3R9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0UHJvcGVydGllcyIsJ2FyZ30pKSwvLycpCi0gICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkscHJvcGVydGllcyk7Ci0gIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKLQotI2lmZGVmIElPU1RBVFMKLSAgLy8gU3RhdHMuLi4KLSAgLy9kZWJ1Z19tZXNzYWdlKCJyZXN0b3JlbzogIityZXN0b3Jlb19zdGF0WzBdKyJcbiIpOwotICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKLSAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7Ci0gIHN0YXQtPnRpbWUgPSB0aW1lKCk7Ci0gIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAotICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKLSAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7Ci0gIHJlc3RvcmVvX3N0YXRbMV1bcmVzdG9yZW9fc3RhdFswXV0gPSBzdGF0OwotCi0gIHJlc3RvcmVvX3N0YXRbMF0gPSAocmVzdG9yZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHJlc3RvcmVvX3N0YXRbMV0pOwotI2VuZGlmCi0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gKiBIQiBlaW5lcyBPYmpla3RlcyBlaW4vYXVzc2NoYWx0ZW4KLWludCBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2JqZWN0IG9iLCBpbnQgZmxhZykKLXsKLSAgaWYgKG9iamVjdHAob2IpKQotICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y29uZmlndXJlX29iamVjdCxvYiksIG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKLX0KLQotLy8gKiBNYWdpZXJsZXZlbGdydXBwZW4gZXJtaXR0ZWxuCi1pbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopCi17Ci0gIGludCBsZXY7Ci0KLSAgbGV2PXF1ZXJ5X3dpel9sZXZlbCh3aXopOwotICBpZiAobGV2PFNFRVJfTFZMKSByZXR1cm4gMDsKLSAgaWYgKGxldj49R09EX0xWTCkgcmV0dXJuIGxldjsKLSAgaWYgKGxldj49QVJDSF9MVkwpIHJldHVybiBBUkNIX0dSUDsKLSAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gRUxERVJfR1JQOwotICBpZiAobGV2Pj1MT1JEX0xWTCkgcmV0dXJuIExPUkRfR1JQOwotICBpZiAobGV2Pj1TUEVDSUFMX0xWTCkgcmV0dXJuIFNQRUNJQUxfR1JQOwotICBpZiAobGV2Pj1ET01BSU5NRU1CRVJfTFZMKSByZXR1cm4gRE9NQUlOTUVNQkVSX0dSUDsKLSAgaWYgKGxldj49V0laQVJEX0xWTCkgcmV0dXJuIFdJWkFSRF9HUlA7Ci0gIGlmIChsZXY+PUxFQVJORVJfTFZMKSByZXR1cm4gTEVBUk5FUl9HUlA7Ci0gIHJldHVybiBTRUVSX0dSUDsKLX0KLQotbWl4ZWQgKndpemxpc3RfaW5mbygpCi17Ci0gIGlmIChBUkNIX1NFQ1VSSVRZIHx8ICFleHRlcm5fY2FsbCgpKQotICAgICAgICAgICAgcmV0dXJuIGVmdW46Ondpemxpc3RfaW5mbygpOwotICByZXR1cm4gMDsKLX0KLQotLy8gKiB3aXpsaXN0IGF1c2dlYmVuCi12YXJhcmdzIHZvaWQgd2l6bGlzdChzdHJpbmcgbmFtZSwgaW50IHNvcnRrZXkgKSB7Ci0KLSAgaWYgKCFuYW1lKQotICB7Ci0gICAgaWYgKHRoaXNfcGxheWVyKCkpCi0gICAgICBuYW1lID0gZ2V0dWlkKHRoaXNfcGxheWVyKCkpOwotICAgIGlmICghbmFtZSkKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFNjaGx1ZXNzZWwgZGFyZiBudXIgaW4gZWluZW0gZ3VlbHRpZ2VuIEJlcmVpY2ggc2VpbgotICBpZiAoc29ydGtleTxXTF9OQU1FIHx8IHNvcnRrZXk+PVdMX1NJWkUpIHNvcnRrZXk9V0xfQ09TVDsKLQotICBtaXhlZCoqIHdsID0gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7Ci0gIC8vIG5hY2ggPHNvcnRrZXk+IHNvcnRpZXJlbgotICB3bCA9IHNvcnRfYXJyYXkod2wsIGZ1bmN0aW9uIGludCAobWl4ZWQgYSwgbWl4ZWQgYikKLSAgICAgIHtyZXR1cm4gYVtzb3J0a2V5XSA8IGJbc29ydGtleV07IH0gKTsKLQotICAvLyBTdW1tZSB1ZWJlciBhbGxlIEtvbW1hbmRvcyBlcm1pdHRlbG4uCi0gIGludCB0b3RhbF9jbWQsIGk7Ci0gIGludCBwb3M9LTE7Ci0gIGZvcmVhY2gobWl4ZWQgZW50cnkgOiB3bCkKLSAgewotICAgIHRvdGFsX2NtZCArPSBlbnRyeVtXTF9DT01NQU5EU107Ci0gICAgaWYgKGVudHJ5W1dMX05BTUVdID09IG5hbWUpCi0gICAgICBwb3MgPSBpOwotICAgICsraTsKLSAgfQotCi0gIGlmIChwb3MgPCAwICYmIG5hbWUgIT0gIkFMTCIgJiYgbmFtZSAhPSAiVE9QMTAwIikKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5hbWUgPT0gIlRPUDEwMCIpCi0gIHsKLSAgICBpZiAoc2l6ZW9mKHdsKSA+IDEwMCkKLSAgICAgIHdsID0gd2xbMC4uMTAwXTsKLSAgICBlbHNlCi0gICAgICB3bCA9IHdsOwotICB9Ci0gIC8vIHVtIG5hbWUgaGVydW0gc2NobmVpZGVuCi0gIGVsc2UgaWYgKG5hbWUgIT0gIkFMTCIpCi0gIHsKLSAgICBpZiAoc2l6ZW9mKHdsKSA8PSAyMSkKLSAgICAgIHdsID0gd2w7Ci0gICAgZWxzZSBpZiAocG9zICsgMTAgPCBzaXplb2Yod2wpICYmIHBvcyAtIDEwID4gMCkKLSAgICAgIHdsID0gd2xbcG9zLTEwLi5wb3MrMTBdOwotICAgIGVsc2UgaWYgKHBvcyA8PTIxKQotICAgICAgd2wgPSB3bFswLi4yMF07Ci0gICAgZWxzZSBpZiAocG9zID49IHNpemVvZih3bCkgLSAyMSkKLSAgICAgIHdsID0gd2xbPDIxLi5dOwotICAgIGVsc2UKLSAgICAgIHdsID0gd2w7Ci0gIH0KLQotICB3cml0ZSgiXG5XaXphcmQgdG9wIHNjb3JlIGxpc3RcblxuIik7Ci0gIGlmICh0b3RhbF9jbWQgPT0gMCkKLSAgICB0b3RhbF9jbWQgPSAxOwotICBwcmludGYoIiUtMjBzICUtNnMgJS0zcyAlLTE3cyAlLTZzICUtNnMgJS02c1xuIiwKLSAgICAgICAgICJFVUlEIiwgImNtZHMiLCAiJSIsICJDb3N0cyIsICJIQiIsICJBcnJheXMiLCJNYXBwLiIpOwotICBmb3JlYWNoKG1peGVkIGU6IHdsKQotICB7Ci0gICAgcHJpbnRmKCIlLToyMHMgJTo2ZCAlOjJkJSUgWyU6NmRrLCU6NmRHXSAlOjZkICU6NmQgJTo2ZFxuIiwKLSAgICAgICAgICBlW1dMX05BTUVdLCBlW1dMX0NPTU1BTkRTXSwgZVtXTF9DT01NQU5EU10gKiAxMDAgLyB0b3RhbF9jbWQsCi0gICAgICAgICAgZVtXTF9DT1NUXSAvIDEwMDAsIGVbV0xfVE9UQUxfR0lHQUNPU1RdLAotICAgICAgICAgIGVbV0xfSEVBUlRfQkVBVFNdLCBlW1dMX0FSUkFZX1RPVEFMXSwgZVtXTF9NQVBQSU5HX1RPVEFMXQotICAgICAgICAgICk7Ci0gIH0KLSAgcHJpbnRmKCJcblRvdGFsICAgICAgICAgJTdkICAgICAgICAgKCVkKVxuXG4iLCB0b3RhbF9jbWQsIHNpemVvZih3bCkpOwotfQotCi0KLS8vIEFiIGhpZXIgZm9sZ2VuIEhpbGZzZnVua3Rpb25lbiBmdWVyIGNhbGxfb3V0KCkgYnp3LiBmdWVyIGRlcmVuIEJlZ3Jlbnp1bmcKLQotLy8gZXJtaXR0ZWx0IGRhcyBPYmpla3QgZGVzIENhbGxvdXRzLgotcHJpdmF0ZSBvYmplY3QgX2NhbGxfb3V0X29iaiggbWl4ZWQgY2FsbF9vdXQgKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXJwKGNhbGxfb3V0KSA/IGNhbGxfb3V0WzBdIDogMDsKLX0KLQotcHJpdmF0ZSB2b2lkIF9zYW1lX29iamVjdCggb2JqZWN0IG9iLCBtYXBwaW5nIG0gKSB7Ci0gIC8vIGlzdCBuaWNodCBzbyBibG9lZCwgd2llIGVzIGF1c3NpZWh0LCBzLiBuYWNoZm9sZ2VkZSBWZXJ3ZW5kdW5nIHZvbiBtCi0gIGlmICggbVtvYl0gKQotICAgIG1bb2JdICs9ICh7IG9iIH0pOwotICBlbHNlCi0gICAgbVtvYl0gPSAoeyBvYiB9KTsgCi19Ci0KLS8vIGFsbGUgT2JqZWt0ZSBpbSBNYXBwaW5nIG0genVzYW1tZW5mYXNzZW4sIGRpZSBkZW4gZ2xlaWNoZW4gTG9hZG5hbWUgKE5hbWUgZGVyCi0vLyBCbHVlcHJpbnQpIGhhYmVuLCBhbHNvIGFsbGUgQ2xvbmVzIGRlciBCUCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbi4KLS8vIE9iamVrdGUgd2VyZGVuIGF1Y2ggbWVocmZhY2ggZXJmYXNzdCwgamUgbmFjaCBBbnphaGwgaWhyZXIgQ2FsbG91dHMuCi1wcml2YXRlIHZvaWQgX3NhbWVfcGF0aCggb2JqZWN0IGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSApIHsKLSAgc3RyaW5nIHBhdGg7Ci0gIGlmICghb2JqZWN0cChrZXkpIHx8ICFwb2ludGVycChvYnMpKSByZXR1cm47Ci0KLSAgcGF0aCA9IGxvYWRfbmFtZShrZXkpOwotCi0gIGlmICggbVtwYXRoXSApCi0gICAgbVtwYXRoXSArPSBvYnM7Ci0gIGVsc2UKLSAgICBtW3BhdGhdID0gb2JzOwotfQotCi0vLyBrZXkga2FubiBvYmplY3Qgb2RlciBzdHJpbmcgc2Vpbi4KLXByaXZhdGUgaW50IF90b29fbWFueSggbWl4ZWQga2V5LCBtYXBwaW5nIG0sIGludCBpICkgewotICAgIHJldHVybiBzaXplb2YobVtrZXldKSA+PSBpOwotfQotCi0vLyBhbGxlIE9iamVrdGUgaW4gb2JzIHplcnN0b2VyZW4gdW5kIEZlaGxlcm1lbGR1bmcgYXVzZ2ViZW4uIEFDSFRVTkc6IERpZQotLy8gT2JqZWt0ZSB3ZXJkZW4gaWRSIHp1IGVpbmVyIEJQIGdlaG9lcmVuLCBtdWVzc2VuIGFiZXIgbmljaHQhIEluIGRlbSBGYWxsCi0vLyB3aXJkIGF1ZiBkZXIgRWJlbmUgYWJlciBudXIgZWluIE9iamVrdCBpbiBkZXIgRmVobGVybWVsZHVuZyBlcndhZWhudC4KLXByaXZhdGUgdm9pZCBfZGVzdHJveSggbWl4ZWQga2V5LCBvYmplY3QgKm9icywgc3RyaW5nIHRleHQsIGludCB1aWQgKSB7Ci0gICAgaWYgKCFwb2ludGVycChvYnMpKSByZXR1cm47Ci0gICAgLy8gQXJyYXkgbWl0IHVuaXF1ZSBFaW50cmFlZ2UgZXJ6ZXVnZW4uCi0gICAgb2JzID0gbV9pbmRpY2VzKCBta21hcHBpbmcob2JzKSApOwotICAgIC8vIEZlaGxlcm1lbGR1bmcgYXVmIGRlciBFYmVuZSBhdXNnZWJlbiwgaW0gY2F0Y2goKSBtaXQgcHVibGlzaCwgZGFtaXQgZXMKLSAgICAvLyBhdWYgZGVyIEViZW5lIGRpcmVrdCBzY3JvbGx0LCBkZXIgYmFja3RyYWNlIHZlcmZ1ZWdiYXIgaXN0IChpbQotICAgIC8vIGdlZ2Vuc2F0eiB6dXIgTG9lc3VuZyBtaXR0ZWxzIENhbGxvdXQpLCBkaWUgQXVzZnVlaHJ1bmcgYWJlciB3ZWl0ZXIKLSAgICAvLyBsYWV1ZnQuCi0gICAgY2F0Y2goIGVmdW46OnJhaXNlX2Vycm9yKCAgICAgICAgICAgCi0gICAgICAgICBzcHJpbnRmKCB0ZXh0LCAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgdWlkID8gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGtleSkgOiBrZXksICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICBzaXplb2Yob2JzKSwgb2JqZWN0X25hbWUob2JzWzwxXSkgKSApO3B1Ymxpc2gpOwotICAgIC8vIFVuZCB3ZWcgbWl0IGRlbSBLcmFtLi4uCi0gICAgZmlsdGVyKCBvYnMsICMnZWZ1bjo6ZGVzdHJ1Y3QvKicqLyApOwotfQotCi0vLyBBbGxlIE9iamVrdCBlaW5lciBVSUQgaW0gTWFwcGluZyBtIG1pdCBVSUQgYWxzIEtFeXMgenVzYW1tZW5mYXNzZW4uIE9iamVrdAotLy8gc2luZCBkYWJlaSBuaWNodCB1bmlxdWUuCi1wcml2YXRlIHZvaWQgX3NhbWVfdWlkKCBzdHJpbmcga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtLCBjbG9zdXJlIGNmICkgewotICBzdHJpbmcgdWlkOwotCi0gIGlmICggIXBvaW50ZXJwKG9icykgfHwgIXNpemVvZihvYnMpICkKLSAgICByZXR1cm47Ci0KLSAgdWlkID0gZnVuY2FsbCggY2YsIGtleSApOwotCi0gIGlmICggbVt1aWRdICkKLSAgICBtW3VpZF0gKz0gb2JzOyAvLyBvYnMgaXN0IG5lbiBBcnJheQotICBlbHNlCi0gICAgbVt1aWRdID0gb2JzOwotfQotCi1ub21hc2sgdmFyYXJncyB2b2lkIGNhbGxfb3V0KCB2YXJhcmdzIG1peGVkICphcmdzICkKLXsKLSAgICBtaXhlZCB0bXAsICpjYWxsX291dHM7Ci0KLSAgICAvLyBCZWkgPjYwMCBDYWxsb3V0cyBhbGxlIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgMzAgQ2FsbG91dHMgbGF1ZmVuCi0gICAgLy8gaGFiZW4uCi0gICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gNjAwCi0gICAgICAgICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IFJPT1RJRCApCi0gICAgewotICAgICAgIC8vIExvZyBlcnpldWdlbi4uLgotICAgICAgCi0gICAgICAgLy8gT2JqZWt0ZSBhbGxlciBDYWxsb3V0cyBlcm1pdHRlbG4KLSAgICAgICBjYWxsX291dHMgPSBtYXAoIGVmdW46OmNhbGxfb3V0X2luZm8oKSwgIydfY2FsbF9vdXRfb2JqICk7Ci0gICAgICAgbWFwcGluZyBvYmplY3RtYXAgPSAoW10pOwotICAgICAgIGZpbHRlciggY2FsbF9vdXRzLCAjJ19zYW1lX29iamVjdCwgJm9iamVjdG1hcCApOwotICAgICAgIC8vIE1hc3RlciBuaWNodCBncmlsbGVuLi4uCi0gICAgICAgZWZ1bjo6bV9kZWxldGUoIG9iamVjdG1hcCwgbWFzdGVyKDEpICk7Ci0gICAgICAgLy8gYWxsZSBPYmpla3RlIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCi0gICAgICAgbWFwcGluZyByZXMgPSBmaWx0ZXJfaW5kaWNlcyggb2JqZWN0bWFwLCAjJ190b29fbWFueSwgb2JqZWN0bWFwLCAyOSApOwotICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIEtleSB1bmQgQXJyYXkgbWl0Ci0gICAgICAgLy8gT2JqZWt0ZW4gdWViZXJnZWJlbiAoaW4gZGllc2VtIEZhbGwgc2luZCBLZXlzIHVuZCBBcnJheSBtaXQKLSAgICAgICAvLyBPYmpla3RlbiBqZXdlaWxzIGRhcyBnbGVpY2hlIE9iamVrdCkuCi0gICAgICAgaWYgKCBzaXplb2YocmVzKSApICAgICAgIAotICAgICAgICAgICB3YWxrX21hcHBpbmcocmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgc2luZ2xlICIgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICJvYmplY3QgWyVPXS4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7Ci0KLSAgICAgICAvLyBCZWkgKGF1Y2ggbmFjaCBkZW0gZXJzdGVuIEF1ZnJhZXVtZW4gbm9jaCkgPjgwMCBDYWxsb3V0cyBhbGxlCi0gICAgICAgLy8gT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyA1MCBDYWxsb3V0cyBsYXVmZW4gaGFiZW4gLSB1bmQKLSAgICAgICAvLyBkaWVzbWFsIHphZWhsZW4gQ2xvbmVzIG5pY2h0IGVpZ2Vuc3RhZW5kaWchIEQuaC4gZXMgd2VyZGVuIGFsbGUKLSAgICAgICAvLyBDbG9uZXMgZWluZXIgQlAgZ2VraWxsdCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbiwgZmFsbHMgYWxsZQotICAgICAgIC8vIGRpZXNlIE9iamVrdGUgX3p1c2FtbWVuXyBtZWhyIGFscyA1MCBDYWxsb3V0cyBoYWJlbiEKLSAgICAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA4MDAgKSB7Ci0gICAgICAgICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSB2b24gZGVyIGxldHp0ZW4gQWt0aW9uIHNpbmQgaW4gb2JqZWN0bWFwIG5pY2h0Ci0gICAgICAgICAgIC8vIG1laHIgZHJpbiwgZGEgc2llIGRvcnQgYWxzIEtleXMgdmVyd2VuZGV0IHd1cmRlbi4KLSAgICAgICAgICAgbWFwcGluZyBwYXRobWFwPShbXSk7Ci0gICAgICAgICAgIC8vIGFsbGUgT2JqZWt0IGVpbmVyIEJQIGluIHJlcyBzb3J0aWVyZW4sIEJQLU5hbWUgYWxzIEtleSwgQXJyYXlzCi0gICAgICAgICAgIC8vIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCi0gICAgICAgICAgIHdhbGtfbWFwcGluZyggb2JqZWN0bWFwLCAjJ19zYW1lX3BhdGgsICZwYXRobWFwKTsKLSAgICAgICAgICAgLy8gYWxsZSBCUHMgKHVuZCBpaHJlIE9iamVrdGUpIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCi0gICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBwYXRobWFwLCAjJ190b29fbWFueS8qJyovLCBwYXRobWFwLCA1MCApOwotICAgICAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBkaWUgQ2xvbmVzCi0gICAgICAgICAgIC8vIHVlYmVyZ2ViZW4sIGRpZSBDYWxsb3V0cyBoYWJlbi4KLSAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCi0gICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LyonKi8sICJDQUxMX09VVCBvdmVyZmxvdyBieSBmaWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKLQotICAgICAgICAgICAvLyBXZW5uIGJlaWRlIEF1ZnJhZXVtYXJiZWl0ZW4gbmljaHRzIGdlYnJhY2h0IGhhYmVuIHVuZCBpbW1lcgotICAgICAgICAgICAvLyBub2NoID4xMDAwIENhbGxvdXRzIGxhdWZlbiwgd2VyZGVuIGRpZXNtYWwgYWxsZSBDYWxsb3V0cwotICAgICAgICAgICAvLyBlaW5lciBVSUQgenVzYW1tZW5nZXphZWhsdC4KLSAgICAgICAgICAgLy8gQWxsZSBPYmpla3RlIGVpbmVyIFVJRCwgZGllIGVzIGluIFN1bW1lIGFsbGVyIGlocmVyIE9iamVrdCBtaXQKLSAgICAgICAgICAgLy8gQ2FsbG91dHMgYXVmIG1laHIgYWxzIDEwMCBDYWxsb3V0cyBicmluZ3QsIHdlcmRlbiBnZXJvZXN0ZXQuCi0gICAgICAgICAgIGlmIChlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gMTAwMCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBkYXMgbmFjaCBCUC1OYW1lbiB2b3JnZWZpbHRlcnRlIE1hcHBpbmcgamV0enQgbmFjaCBVSURzCi0gICAgICAgICAgICAgIC8vIHp1c2FtbWVuc29ydGllcmVuLiBaZXJzdG9lcnRlIENsb25lcyBmaWx0ZXIgX3NhbWVfdWlkKCkKLSAgICAgICAgICAgICAgLy8gcmF1cy4KLSAgICAgICAgICAgICAgbWFwcGluZyB1aWRtYXA9KFtdKTsKLSAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBwYXRobWFwLCAjJ19zYW1lX3VpZCwgJnVpZG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mdW5jdGlvbiggImNyZWF0b3JfZmlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3NlY3VyZS9tYXN0ZXIiICkgKTsKLSAgICAgICAgICAgICAgLy8gSW4gcmVzIG51biBVSURzIGFscyBLZXlzIHVuZCBBcnJheXMgdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KLSAgICAgICAgICAgICAgLy8gRGllIHJhdXNmaWx0ZXJuLCBkaWUgbWVociBhbHMgMTAwIE9iamVrdGUgKG5vbi11bmlxdWUsIGQuaC4KLSAgICAgICAgICAgICAgLy8gMTAwIENhbGxvdXRzISkgaGFiZW4uCi0gICAgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCB1aWRtYXAsICMnX3Rvb19tYW55LCB1aWRtYXAsIDEwMCApOwotICAgICAgICAgICAgICAvLyB1bmQgZXJuZXV0IHVlYmVyIGRpZSBLZXlzIGxhdWZlbiB1bmQgamV3ZWlscyBkaWUgQXJyYXlzIG1pdAotICAgICAgICAgICAgICAvLyBkZW4gT2JqZWt0ZW4genVyIFplcnN0b2VydW5nIGFuIF9kZXN0cm95KCkuLi4KLSAgICAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCi0gICAgICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVSUQgJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLQotICAgIC8vIEZhbGxzIGRhcyBhdWZydWZlbmRlIE9iamVrdCB6ZXJzdG9lcnQgd3VyZGUgYmVpbSBBdWZyYWV1bWVuCi0gICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgKQotICAgICAgIHJldHVybjsKLQotICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKLSAgICBhcHBseSggIydlZnVuOjpjYWxsX291dCwgYXJncyApOwotICAgIHJldHVybjsKLX0KLQotbWl4ZWQgY2FsbF9vdXRfaW5mbygpIHsKLSAgCi0gIG9iamVjdCBwbyA9IHByZXZpb3VzX29iamVjdCgpOwotICBtaXhlZCBjb2kgPSBlZnVuOjpjYWxsX291dF9pbmZvKCk7Ci0KLSAgLy8gdW5nZWZpbHRlcnRlbiBPdXRwdXQgbnVyIGZ1ZXIgYmVzdGltbXRlIE9iamVrdGUsIE9iamVrdGUgaW4gL3N0ZCBvZGVyCi0gIC8vIC9vYmogaGFiZW4gZGllIEJhY2tib25lSUQuCi0gIGlmIChxdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKHBvKSkgPj0gQVJDSF9MVkwKLSAgICAgICB8fCAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUobG9hZF9uYW1lKHBvKSkgPT0gQkFDS0JPTkVJRCApIHsKLSAgICAgIHJldHVybiBjb2k7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgICByZXR1cm4gZmlsdGVyKGNvaSwgZnVuY3Rpb24gbWl4ZWQgKG1peGVkIGFycikgewotICAgICAgICAgICAgICBpZiAocG9pbnRlcnAoYXJyKSAmJiBhcnJbMF09PXBvKQotICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDsgfSk7Ci0gIH0KLX0KLQotLy8gKiBadSBlaW5lciBjbG9zdXJlIGRhcyBPYmpla3QsIGFuIGRhcyBzaWUgZ2VidW5kZW4gaXN0LCBzdWNoZW4KLW1peGVkIHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KGNsb3N1cmUgYykgewotICByZXR1cm4KLSAgICBDTE9TVVJFX0lTX1VOQk9VTkRfTEFNQkRBKGdldF90eXBlX2luZm8oYywgMSkpID8KLSAgICAgIDAgOgotICAodG9fb2JqZWN0KGMpIHx8IC0xKTsKLX0KLQotLy8gKiBXaXIgd29sbGVuIG51ciBFSU4gQXJndW1lbnQgLi4uIGF1c3NlcmRlbSBjaGVja3MgZnVlciBkZW4gTmV0enRvdGVucmF1bQotdmFyYXJncyB2b2lkIG1vdmVfb2JqZWN0KG1peGVkIHdoYXQsIG1peGVkIHdoZXJlKQotewotICBvYmplY3QgcG8sdG1wOwotCi0gIHBvPXByZXZpb3VzX29iamVjdCgpOwotICBpZiAoIXdoZXJlKQotICB7Ci0gICAgd2hlcmU9d2hhdDsKLSAgICB3aGF0PXBvOwotICB9Ci0gIGlmICgoKHN0cmluZ3Aod2hlcmUpICYmIHdoZXJlPT1ORVRERUFEX1JPT00gKSB8fAotICAgICAgIChvYmplY3RwKHdoZXJlKSAmJiB3aGVyZT09ZmluZF9vYmplY3QoTkVUREVBRF9ST09NKSkpICYmCi0gICAgICAgb2JqZWN0cCh3aGF0KSAmJiBvYmplY3RfbmFtZSh3aGF0KSE9Ii9vYmovc3BlcnJlciIpCi0gIHsKLSAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2hhdCkpCi0gICAgewotICAgICAgd2hhdC0+cmVtb3ZlKCk7Ci0gICAgICBpZiAod2hhdCkgZGVzdHJ1Y3Qod2hhdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChsaXZpbmcod2hhdCkgfHwgaW50ZXJhY3RpdmUod2hhdCkpCi0gICAgewotICAgICAgbG9nX2ZpbGUoIk5ERUFEMiIsc3ByaW50ZigiVFJZRUQgVE8gTU9WRSBUTyBORVRERUFEOiAlT1xuIix3aGF0KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHNldF9vYmplY3RfaGVhcnRfYmVhdCh3aGF0LDApOwotICB9Ci0gIHRtcD13aGF0OwotICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCi0gICAgICAvLyBKYS4gTWFuIHJ1ZnQgZGllIF9zZXRfeHh4KCktRnVua3Rpb25lbiBlaWdlbnRsaWNoIG5pY2h0IGRpcmVrdCBhdWYuCi0gICAgICAvLyBBYmVyIGRhcyBMaWNodHN5c3RlbSBpc3Qgc2Nob24gKnNvKiByZWNoZW5pbnRlbnNpdiB1bmQgZ2VyYWRlIGRlcgotICAgICAgLy8gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFLUNhY2hlIHdpcmQgKnNvKiBvZnQgYmVub2V0aWd0LCBkYXNzIGVzIG1pcgotICAgICAgLy8gZGEgdW0gamVkZXMgYmlzc2NoZW4gUmVjaGVuemVpdCBnZWh0LgotICAgICAgLy8gRGVyIFp3ZWNrIGhlaWxpZ3QgamEgYmVrYW5udGxpY2ggZGllIE1pdHRlbC4gOy0pCi0gICAgICAvLwotICAgICAgLy8gVGlhbWFrCi0gICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKLSAgZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1vdmVfb2JqZWN0LHBvKSx3aGF0LHdoZXJlKTsKLSAgaWYgKHRtcD13aGF0KQotICAgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKLSAgICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7Ci19Ci0KLQotdm9pZCBzdGFydF9zaW11bF9lZnVuKCkgewotICBtaXhlZCAqaW5mbzsKLQotICAvLyBGYWxscyBub2NoIG5pY2h0IGdldGFuLCBleHRyYV93aXppbmZvIGluaXRpYWxpc2llcmVuCi0gIGlmICggIXBvaW50ZXJwKGluZm8gPSBnZXRfZXh0cmFfd2l6aW5mbygwKSkgKQotICAgIHNldF9leHRyYV93aXppbmZvKDAsIGluZm8gPSBhbGxvY2F0ZShCQUNLQk9ORV9XSVpJTkZPX1NJWkUpKTsKLQotICBJbml0TGl2aW5nRGF0YShpbmZvKTsKLQotICBzZXRfbmV4dF9yZXNldCgxMCk7IC8vIGRpcmVrdCBtYWwgYXVmcmFldW1lbgotfQotCi1wcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLSAgc2V0X25leHRfcmVzZXQoNzIwMCk7Ci0gIENsZWFuTGl2aW5nRGF0YSgpOwotfQotCi0jaWYgIV9fRUZVTl9ERUZJTkVEX18oYWJzb2x1dGVfaGJfY291bnQpCi1pbnQgYWJzb2x1dGVfaGJfY291bnQoKSB7Ci0gIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7Ci19Ci0jZW5kaWYKLQotdm9pZCBfX3NldF9lbnZpcm9ubWVudChvYmplY3Qgb2IsIG1peGVkIHRhcmdldCkKLXsKLSAgc3RyaW5nIHBhdGg7Ci0gIG9iamVjdCBvYmo7Ci0KLSAgaWYgKCFvYmplY3RwKG9iKSkKLSAgICByZXR1cm47Ci0gIGlmICghSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgfHwgIUFSQ0hfU0VDVVJJVFkgKQotICAgIHJldHVybjsKLSAgaWYgKG9iamVjdHAodGFyZ2V0KSkKLSAgewotICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYix0YXJnZXQpOwotICAgIHJldHVybjsKLSAgfQotICBwYXRoPShzdHJpbmcpTUFTVEVSLT5fZ2V0X3BhdGgodGFyZ2V0LHRoaXNfaW50ZXJhY3RpdmUoKSk7Ci0gIGlmIChzdHJpbmdwKHBhdGgpICYmIGZpbGVfc2l6ZShwYXRoKyIuYyIpPj0wICYmCi0gICAgICAhY2F0Y2gobG9hZF9vYmplY3QocGF0aCk7cHVibGlzaCkgKQotICB7Ci0gICAgb2JqPWZpbmRfb2JqZWN0KHBhdGgpOwotICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYixvYmopOwotICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIF9kdW1wX3dpemxpc3Qoc3RyaW5nIGZpbGUsIGludCBzb3J0YnkpIHsKLSAgaW50IGk7Ci0gIG1peGVkICphOwotCi0gIGlmICghTE9SRF9TRUNVUklUWSkKLSAgICByZXR1cm47Ci0gIGlmICghbWFzdGVyKCktPnZhbGlkX3dyaXRlKGZpbGUsZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiKSkKLSAgewotICAgIHdyaXRlKCJOTyBXUklURSBQRVJNSVNTSU9OXG4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYSA9IHdpemxpc3RfaW5mbygpOwotICBhID0gc29ydF9hcnJheShhLCBsYW1iZGEoICh7J2EsJ2J9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc8LAotICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYSxzb3J0Ynl9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Isc29ydGJ5fSkKLSAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwotICBybShmaWxlKTsKLSAgZm9yIChpPXNpemVvZihhKS0xO2k+PTA7aS0tKQotICAgIHdyaXRlX2ZpbGUoZmlsZSxzcHJpbnRmKCIlLTExczogZXZhbD0lLThkIGNtZHM9JS02ZCBIQnM9JS01ZCBhcnJheT0lLTVkIG1hcHBpbmc9JS03ZFxuIiwKLSAgICAgIGFbaV1bV0xfTkFNRV0sYVtpXVtXTF9UT1RBTF9DT1NUXSxhW2ldW1dMX0NPTU1BTkRTXSxhW2ldW1dMX0hFQVJUX0JFQVRTXSwKLSAgICAgIGFbaV1bV0xfQVJSQVlfVE9UQUxdLGFbaV1bV0xfQ0FMTF9PVVRdKSk7Ci19Ci0KLXB1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKSB7Ci0KLSAgaWYoIW9iamVjdHAob2IpKQotICAgIG9iPXByZXZpb3VzX29iamVjdCgpOwotICAvLyBXZW5uIGVpbiBPYmpla3QgZ2VzdWNodCB3aXJkOiBBbGxlIEVudnMgZGllc2VzIE9iamVrdHMgZXJtaXR0ZWxuIHVuZAotICAvLyBzY2hhdWVuLCBvYiBpbiBkaWVzZW4gb2Igdm9ya29tbXQuIERhbm4gaXN0IHdoYXQgaW4gb2IgZW50aGFsdGVuLgotICBpZihvYmplY3RwKHdoYXQpKSB7Ci0gICAgb2JqZWN0ICplbnZzPWFsbF9lbnZpcm9ubWVudCh3aGF0KTsKLSAgICAvLyB3ZW5uIG9iIGtlaW4gRW52aXJvbm1lbnQgaGF0LCBpc3QgZXMgb2ZmZW5zaWNodGxpY2ggbmljaHQgaW4gd2hhdAotICAgIC8vIGVudGhhbHRlbi4KLSAgICBpZiAoIXBvaW50ZXJwKGVudnMpKSByZXR1cm4gMDsKLSAgICBpZiAobWVtYmVyKGVudnMsIG9iKSAhPSAtMSkgcmV0dXJuIHdoYXQ7Ci0gIH0KLSAgLy8gc29uc3Qgd2lyZHMgdGV1cmVyLCB1ZWJlciBhbGxlIE9iamVrdGUgaW0gKGRlZXApIEludiBsYXVmZW4gdW5kIHBlciBpZCgpCi0gIC8vIHRlc3Rlbi4gRGFiZWkgbXVzcyBhYmVyIGRpZSBnZXd1ZW5zY2h0ZSBOci4gKCJmbGFzY2hlIDMiKSBhYmdlc2Nobml0dGVuCi0gIC8vIHdlcmRlbiB1bmQgc2VsYmVyIGdlemFlaGx0IHdlcmRlbiwgd2VsY2hlIGRhcyBlbnRzcHJlY2hlbmRlIE9iamVrdCBpc3QuCi0gIGVsc2UgaWYgKHN0cmluZ3Aod2hhdCkpIHsKLSAgICAgIGludCBjbnQ7Ci0gICAgICBzdHJpbmcgbmV3d2hhdDsKLSAgICAgIGlmKHNzY2FuZih3aGF0LCIlcyAlZCIsbmV3d2hhdCxjbnQpIT0yKQotICAgICAgIGNudD0xOwotICAgICAgZWxzZQotICAgICAgIHdoYXQ9bmV3d2hhdDsKLSAgICAgIGZvcmVhY2gob2JqZWN0IGludm9iOiBkZWVwX2ludmVudG9yeShvYikpIHsKLSAgICAgICBpZiAoaW52b2ItPmlkKHdoYXQpICYmICEtLWNudCkKLSAgICAgICAgICAgcmV0dXJuIGludm9iOwotICAgICAgfQotICB9Ci0gIGVsc2UgewotICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0gICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgMSB0byBkZWVwX3ByZXNlbnQoKS4gIgotICAgICAgICAgIkV4cGVjdGVkIFwib2JqZWN0XCIgb3IgXCJzdHJpbmdcIiwgZ290ICUuNTBPLlxuIiwKLSAgICAgICAgIHdoYXQpKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotbWFwcGluZyBkdW1wX2lwX21hcHBpbmcoKQotewotICByZXR1cm4gMDsKLX0KLQotbm9tYXNrIHZvaWQgc3dhcChvYmplY3Qgb2JqKQotewotICB3cml0ZSgiWW91ciBhcmUgbm90IGFsbG93ZWQgdG8gc3dhcCBvYmplY3RzIGJ5IGhhbmQhXG4iKTsKLSAgcmV0dXJuOwotfQotCi1ub21hc2sgdmFyYXJncyB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbihzdHJpbmcgc3RyKQotewotICBpZihwcmV2aW91c19vYmplY3QoKT09MCB8fCAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgCi0gICAgICB8fCAhQVJDSF9TRUNVUklUWSkKLSAgewotICAgIHdyaXRlKCJDYWxsIEdDIG5vdyBhbmQgdGhlIG11ZCB3aWxsIGNyYXNoIGluIDUtNiBob3Vycy4gRE9OVCBETyBJVCFcbiIpOwotICAgIHJldHVybjsKLSAgfQotICBlbHNlIGlmIChzdHJpbmdwKHN0cikpCi0gIHsKLSAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKHN0cik7Ci0gIH0KLSAgZWxzZSAKLSAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKCk7Ci19Ci0KLXZhcmFyZ3Mgdm9pZCBub3RpZnlfZmFpbChtaXhlZCBuZiwgaW50IHByaW8pIHsKLSAgb2JqZWN0IHBvLG9sZG87Ci0gIGludCBvbGRwcmlvOwotICAKLSAgaWYgKCFQTCB8fCAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKLSAgaWYgKCFzdHJpbmdwKG5mKSAmJiAhY2xvc3VyZXAobmYpKSB7Ci0gICAgICBzZXRfdGhpc19vYmplY3QocG8pOwotICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKLSAgICAgICAgICJPbmx5IHN0cmluZ3MgYW5kIGNsb3N1cmVzIGFsbG93ZWQgZm9yIG5vdGlmeV9mYWlsISAiCi0gICAgICAgICAiQXJndW1lbnQgd2FzOiAlLjUwTy4uLlxuIixuZikpOwotICB9Ci0KLSAgLy8gZmFsbHMgZWluIE9iamVrdCBiZXJlaXRzIG5lbiBub3RpZnlfZmFpbCgpIHNldHp0ZSwgUHJpb3JpdGFldGVuIGFic2NoYWV0emVuCi0gIC8vIHVuZCB2ZXJnbGVpY2hlbi4KLSAgaWYgKG9iamVjdHAob2xkbz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgcG8hPW9sZG8pIHsKLSAgICBpZiAoIXByaW8pIHsgICAgICAgCi0gICAgICAvL1ByaW9yaXRhZXQgZGllc2VzIG5vdGlmeV9mYWlsKCkgJ2Fic2NoYWV0emVuJwotICAgICAgaWYgKHBvPT1QTCkgLy8gU3BpZWxlci1pbnRlcm5lIChzb3VsLWNtZHMpCi0gICAgICAgIHByaW89TkZfTkxfT1dOOwotICAgICAgZWxzZSBpZiAobGl2aW5nKHBvKSkKLSAgICAgICAgcHJpbz1ORl9OTF9MSVZJTkc7Ci0gICAgICBlbHNlIGlmICgoaW50KXBvLT5Jc1Jvb20oKSkKLSAgICAgICAgcHJpbz1ORl9OTF9ST09NOwotICAgICAgZWxzZQotICAgICAgICBwcmlvPU5GX05MX1RISU5HOwotICAgIH0KLSAgICAvL1ByaW9yaXRhZXQgZGVzIGFsdGVuIFNldHplcnMgYWJzY2hhZXR6ZW4KLSAgICBpZiAob2xkbz09UEwpCi0gICAgICBvbGRwcmlvPU5GX05MX09XTjsKLSAgICBlbHNlIGlmIChsaXZpbmcob2xkbykpCi0gICAgICBvbGRwcmlvPU5GX05MX0xJVklORzsKLSAgICBlbHNlIGlmICgoaW50KW9sZG8tPklzUm9vbSgpKQotICAgICAgb2xkcHJpbz1ORl9OTF9ST09NOwotICAgIGVsc2UKLSAgICAgIG9sZHByaW89TkZfTkxfVEhJTkc7Ci0gIH0KLSAgZWxzZSAvLyB3ZW5uIGVzIG5vY2gga2VpbiBOb3RpZnlfZmFpbCBnaWJ0OgotICAgIG9sZHByaW89TkZfTkxfTk9ORTsKLQotICAvL3ZlcmdsZWljaGVuIHVuZCBnZ2YuIHNldHplbgotICBpZiAocHJpbyA+PSBvbGRwcmlvKSB7IAotICAgIHNldF90aGlzX29iamVjdChwbyk7Ci0gICAgZWZ1bjo6bm90aWZ5X2ZhaWwobmYpOwotICB9Ci0KLSAgcmV0dXJuOwotfQotCi12b2lkIF9ub3RpZnlfZmFpbChzdHJpbmcgc3RyKQotewotICAvL3F1ZXJ5X25vdGlmeV9mYWlsKCkgYmVudXR6ZW4sIHVtIGRhcyBPYmpla3QKLSAgLy9kZXMgbGV0enRlbiBub3RpZnlfZmFpbCgpIHp1IGVybWl0dGVsbgotICBvYmplY3QgbzsKLSAgaWYgKChvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBvIT1wcmV2aW91c19vYmplY3QoKSkKLSAgICByZXR1cm47Ci0gIC8vbm9jaCBrZWluIG5vdGlmeV9mYWlsKCkgZnVlciBkaWVzZXMgS29tbWFuZG8gZ2VzZXR6dCwgYXVmIGdlaHRzLgotICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICBlZnVuOjpub3RpZnlfZmFpbChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0cmluZyB0aW1lMnN0cmluZyggc3RyaW5nIGZvcm1hdCwgaW50IHplaXQgKQotewotICBpbnQgaSxjaCxtYXh1bml0LGR1bW15OwotICBzdHJpbmcgKnBhcnRzLCBmbXQ7Ci0KLSAgaW50IHNlY3MgPSB6ZWl0OwotICBpbnQgbWlucyA9ICh6ZWl0LzYwKTsKLSAgaW50IGhvdXJzID0gKHplaXQvMzYwMCk7Ci0gIGludCBkYXlzID0gKHplaXQvODY0MDApOwotICBpbnQgd2Vla3MgPSAgKHplaXQvNjA0ODAwKTsKLSAgaW50IG1vbnRocyA9ICh6ZWl0LzI0MTkyMDApOwotICBpbnQgYWJiciA9IDA7Ci0KLSAgcGFydHMgPSByZWdleHBsb2RlKCBmb3JtYXQsICJcKCVcKC18XClbMC05XSpbbndkaG1zeE5XREhNU1hdXCl8XCglJVwpIiApOwotCi0gIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQotICB7Ci0gICAgY2ggPSBwYXJ0c1tpXVs8MV07Ci0gICAgc3dpdGNoKCBwYXJ0c1tpXVs8MV0gKQotICAgIHsKLSAgICBjYXNlICd4JzogY2FzZSAnWCc6Ci0gICAgICAgYWJiciA9IHNzY2FuZiggcGFydHNbaV0sICIlJSVkIiwgZHVtbXkgKSAmJiBkdW1teT09MDsKLSAgICAgICAvLyBOTyBicmVhayAhCi0gICAgY2FzZSAnbic6IGNhc2UgJ04nOgotICAgICAgIG1heHVuaXQgfD0gMzE7Ci0gICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndyc6IGNhc2UgJ1cnOgotICAgICAgIG1heHVuaXQgfD0gMTU7Ci0gICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6IGNhc2UgJ0QnOgotICAgICAgIG1heHVuaXQgfD0gNzsKLSAgICAgICBicmVhazsKLSAgICBjYXNlICdoJzogY2FzZSAnSCc6Ci0gICAgICAgbWF4dW5pdCB8PSAzOwotICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKLSAgICAgICBtYXh1bml0IHw9IDE7Ci0gICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmKCBtYXh1bml0ICYgMTYgKSB3ZWVrcyAlPSA0OwotICBpZiggbWF4dW5pdCAmIDggKSBkYXlzICU9IDc7Ci0gIGlmKCBtYXh1bml0ICYgNCApIGhvdXJzICU9IDI0OwotICBpZiggbWF4dW5pdCAmIDIgKSBtaW5zICU9IDYwOwotICBpZiggbWF4dW5pdCApIHNlY3MgJT0gNjA7Ci0KLSAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCi0gIHsKLSAgICBmbXQgPSBwYXJ0c1tpXVswLi48Ml07Ci0gICAgY2ggPSBwYXJ0c1tpXVs8MV07Ci0gICAgaWYoIGNoPT0neCcgKQotICAgIHsKLSAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nbic7Ci0gICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J3cnOwotICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J2QnOwotICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdoJzsgCi0gICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdtJzsKLSAgICAgIGVsc2UgY2ggPSAncyc7Ci0gICAgfQotICAgIGVsc2UgaWYoIGNoPT0nWCcgKQotICAgIHsKLSAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nTic7Ci0gICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J1cnOwotICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J0QnOwotICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdIJzsgCi0gICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdNJzsKLSAgICAgIGVsc2UgY2ggPSAnUyc7Ci0gICAgfQotICAgIAotICAgIHN3aXRjaCggY2ggKQotICAgIHsKLSAgICAgIGNhc2UgJ24nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1vbnRocyApOyBicmVhazsKLSAgICAgIGNhc2UgJ3cnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHdlZWtzICk7IGJyZWFrOwotICAgICAgY2FzZSAnZCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgZGF5cyApOyBicmVhazsKLSAgICAgIGNhc2UgJ2gnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGhvdXJzICk7IGJyZWFrOwotICAgICAgY2FzZSAnbSc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbWlucyApOyBicmVhazsKLSAgICAgIGNhc2UgJ3MnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHNlY3MgKTsgYnJlYWs7Ci0gICAgICBjYXNlICdOJzoKLSAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJNIjsKLSAgICAgICBlbHNlIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1vbnRocz09MSkgPyAiTW9uYXQiIDogIk1vbmF0ZSIgKTsKLSAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1cnOgotICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInciOyBlbHNlCi0gICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAod2Vla3M9PTEpID8gIldvY2hlIiA6ICJXb2NoZW4iICk7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdEJzoKLSAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJkIjsgZWxzZQotICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGRheXM9PTEpID8gIlRhZyIgOiAiVGFnZSIgKTsKLSAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ0gnOgotICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImgiOyBlbHNlCi0gICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoaG91cnM9PTEpID8gIlN0dW5kZSIgOiAiU3R1bmRlbiIgKTsKLSAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ00nOgotICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIm0iOyBlbHNlCi0gICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobWlucz09MSkgPyAiTWludXRlIiA6ICJNaW51dGVuIiApOwotICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUyc6Ci0gICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAicyI7IGVsc2UKLSAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChzZWNzPT0xKSA/ICJTZWt1bmRlIiA6ICJTZWt1bmRlbiIgKTsKLSAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyUnOgotICAgICAgIHBhcnRzW2ldID0gIiUiOwotICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW1wbG9kZSggcGFydHMsICIiICk7Ci19Ci0KLW5vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpCi17Ci0gIHN0cmluZyBlcnI7Ci0gIG9iamVjdCBvYjsKLSAgbWl4ZWQgbTsKLSAgLy9oYXQgbmVuIFNjaGVyemtla3MgZGllIEJsdWVwcmludCBiZXdlZ3Q/Ci0gIGlmICgob2I9ZmluZF9vYmplY3QoIi9zZWN1cmUvbG9naW4iKSkgJiYgZW52aXJvbm1lbnQob2IpKQotICAgICAgY2F0Y2goZGVzdHJ1Y3Qob2IpO3B1Ymxpc2gpOwotICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgic2VjdXJlL2xvZ2luIik7cHVibGlzaCk7Ci0gIGlmIChlcnIpCi0gIHsKLSAgICB3cml0ZSgiRmVobGVyIGJlaW0gTGFkZW4gdm9uIC9zZWN1cmUvbG9naW4uY1xuIitlcnIrIlxuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG9iamVjdHAobT0obWl4ZWQpb2ItPm5ld19sb2dvbihuYW1lKSkpIG5ldGRlYWRbbmFtZV09bTsKLSAgcmV0dXJuIG07Ci19Ci0KLW5vbWFzayBpbnQgc2VjdXJlX2xldmVsKCkKLXsKLSAgaW50ICpsZXZlbDsKLSAgLy9rZXR0ZSBkZXIgQ2FsbGVyIGR1cmNobGF1ZmVuLCBkZW4gbmllZHJpZ3N0ZW4gTGV2ZWwgaW4gZGVyIEtldHRlCi0gIC8venVydWVja2dlYmVuLiBaZXJzdG9lcnRlIE9iamVrdGUgKFNlbGJzdHplcnN0b2VyZXIpIGZ1ZWhyZW4genVyIFJ1ZWNrZ2FiZQotICAvL3ZvbiAwLgotICAvL2NhbGxlcl9zdGFjaygxKSBmdWVndCBkZW0gUnVlY2tnYWJlYXJyYXkgdGhpc19pbnRlcmFjdGl2ZSgpIGhpbnp1IGJ6dy4gMCwKLSAgLy93ZW5uIGVzIGtlaW5lbiBJbnRlcmFjdGl2ZSBnaWJ0LiBEaWUgMCBmdWVocnQgZGFubiB3aWUgYmVpIHplcnN0b2VydGVuCi0gIC8vT2JqZWt0ZW4genVyIFJ1ZWNrZ2FiZSB2b24gMCwgd2FzIGdld3VlbnNjaHQgaXN0LCBkYSBlcyBoaWVyIGVpbmVuCi0gIC8vSU50ZXJhY3RpdmUgZ2ViZW4gbXVzcy4KLSAgbGV2ZWw9bWFwKGNhbGxlcl9zdGFjaygxKSxmdW5jdGlvbiBpbnQgKG9iamVjdCBjYWxsZXIpCi0gICAgICB7aWYgKG9iamVjdHAoY2FsbGVyKSkKLSAgICAgICByZXR1cm4ocXVlcnlfd2l6X2xldmVsKGdldGV1aWQoY2FsbGVyKSkpOwotICAgICAgIHJldHVybigwKTsgLy8ga2VpbiBPYmpla3QgZGEsIDAuCi0gICAgICB9ICk7Ci0gIHJldHVybihtaW4obGV2ZWwpKTsgLy9kZW4ga2xlaW5zdGVuIFdlcnQgaW0gQXJyYXkgenVydWVja2dlYmVuIChnZ2YuIDApCi19Ci0KLW5vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKQotewotICBzdHJpbmcgZXVpZDsKLQotICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSkgLy8gRXMgbXVzcyBlaW5lbiBpbnRlcmFjdGl2ZSBnZWJlbgotICAgICByZXR1cm4gMDsKLSAgZXVpZD1nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7Ci0gIC8vIHVlYmVyIGFsbGUgQ2FsbGVyIGl0ZXJpZXJlbi4gV2VubiBlaW5lcyBkYXZvbiBlaW5lIGFuZGVyZSBldWlkIGhhdCBhbHMKLSAgLy8gZGVyIEludGVyYWN0aXZlIHVuZCBkaWVzZSBuaWNodCBkaWUgUk9PVElEIGlzdCwgd2lyZCAwIHp1cnVlY2tnZWJlbi4KLSAgLy8gRWJlbnNvLCBmYWxscyBlaW4gU2VsYnN0emVyc3RvZXJlciBpcmdlbmR3byBpbiBkZXIgS2V0dGUgaXN0LgotICBmb3JlYWNoKG9iamVjdCBjYWxsZXI6IGNhbGxlcl9zdGFjaygpKSB7Ci0gICAgICBpZiAoIW9iamVjdHAoY2FsbGVyKSB8fAotICAgICAgIChnZXRldWlkKGNhbGxlcikhPWV1aWQgJiYgZ2V0ZXVpZChjYWxsZXIpIT1ST09USUQpKQotICAgICAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGV1aWQ7IC8vICdzaWNoZXJlJyBldWlkIHp1cnVlY2tnZWJlbgotfQotCi0vLyBJTlBVVF9QUk9NUFQgdW5kIG5lbiBMZWVycHJvbXB0IGhpbnp1ZnVlZ2VuLCB3ZW5uIGtlaW5zIHVlYmVyZ2ViZW4gd2lyZC4KLS8vIERhcyBzb2xsIGRhenUgZGllbmVuLCBkYXNzIGFsbGUgZ2dmLiBlaW4gRU9SIGFtIFByb21wdGVuZGUga3JpZWdlbi4uLgotLy8jaWYgX19CT09UX1RJTUVfXyA8IDEzNjAwMTcyMTMKLXZhcmFyZ3Mgdm9pZCBpbnB1dF90byggbWl4ZWQgZnVuLCBpbnQgZmxhZ3MsIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQotewotICAgIG1peGVkICphcnI7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoICF0aGlzX3BsYXllcigpIHx8ICFwcmV2aW91c19vYmplY3QoKSApCi0gICAgICAgcmV0dXJuOwotCi0gICAgLy8gVE9ETzogaW5wdXRfdG8oLi4uLElOUFVUX1BST01QVCwgIiIsIC4uLiksIHdlbm4ga2VpbiBJTlBVVF9QUk9NUFQKLSAgICAvLyB2b3Jrb21tdC4uLgotICAgIGlmICggZmxhZ3MmSU5QVVRfUFJPTVBUICkgeyAgICAKLSAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncyB9KSArIGFyZ3M7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvLyBnZ2YuIGVpbiBJTlBVVF9QUk9NUFQgaGluenVmdWVnZW4gdW5kIG5lbiBMZWVyc3RyaW5nIGFscyBQcm9tcHQuCi0gICAgICAgIGZsYWdzIHw9IElOUFVUX1BST01QVDsKLSAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncywgIiIgfSkgKyBhcmdzOwotICAgIH0KLQotICAgIC8vIEFycmF5cyBnZWdlbiBmbGF0dGVuIHF1b3Rlbi4KLSAgICBmb3IgKCBpID0gc2l6ZW9mKGFycikgLSAxOyBpID4gMTsgaS0tICkKLSAgICAgICBpZiAoIHBvaW50ZXJwKGFycltpXSkgKQotICAgICAgICAgICBhcnJbaV0gPSBxdW90ZShhcnJbaV0pOwotCi0gICAgYXBwbHkoIGJpbmRfbGFtYmRhKCB1bmJvdW5kX2xhbWJkYSggKHt9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAjJ2VmdW46OmlucHV0X3RvLyonKi8gfSkgKyBhcnIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkgKSApOwotfQotLy8jZW5kaWYKLQotbm9tYXNrIGludCBzZXRfbGlnaHQoaW50IGkpCi0vLyBlcmhvZWh0IGRhcyBMaWNodGxldmVsIGVpbmVzIE9iamVrdHMgdW0gaQotLy8gcmVzdWx0OiBkYXMgTGljaHRsZXZlbCBpbm5lcmhhbGIgZGVzIE9iamVrdHMKLXsKLSAgICBvYmplY3Qgb2IsICppbnY7Ci0gICAgaW50IGxhbGwsIGxpZ2h0LCBkYXJrLCB0bXA7Ci0KLSAgICBpZiAoIShvYj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOyAvLyBvaG5lIGRhcyBnZWh0cyBuaWNodC4KLQotICAgIC8vIGF1cyBrb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4ga2FubiBtYW4gYXVjaCBkZW4gTGljaHRsZXZlbCBub2NoIHNldHplbgotICAgIGlmIChpIT0wKSBvYi0+U2V0UHJvcChQX0xJR0hULCBvYi0+UXVlcnlQcm9wKFBfTElHSFQpK2kpOwotCi0gICAgLy8gTGljaHRiZXJlY2hudW5nIGZpbmRldCBlaWdlbnRsaWNoIGluIGRlciBNdWRsaWIgc3RhdHQuCi0gICAgcmV0dXJuIChpbnQpb2ItPlF1ZXJ5UHJvcChQX0lOVF9MSUdIVCk7Ci19Ci0KLQotcHVibGljIHN0cmluZyBpc28yYXNjaWkoIHN0cmluZyBzdHIgKQotewotICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKQotICAgICAgIHJldHVybiAiIjsKLQotICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIuQiLCAiYWUiLCAxICk7Ci0gICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi9iIsICJvZSIsIDEgKTsKLSAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL8IiwgInVlIiwgMSApOwotICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIsQiLCAiQWUiLCAxICk7Ci0gICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi1iIsICJPZSIsIDEgKTsKLSAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLcIiwgIlVlIiwgMSApOwotICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIt8iLCAic3MiLCAxICk7Ci0gICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAiW14gLX5dIiwgIj8iLCAxICk7Ci0KLSAgICByZXR1cm4gc3RyOwotfQotCi0KLXB1YmxpYyB2YXJhcmdzIHN0cmluZyBDb3VudFVwKCBzdHJpbmcgKnMsIHN0cmluZyBzZXAsIHN0cmluZyBsYXN0c2VwICkKLXsKLSAgICBzdHJpbmcgcmV0OwotCi0gICAgaWYgKCAhcG9pbnRlcnAocykgKQotICAgICAgIHJldHVybiAiIjsKLSAgICAKLSAgICBpZiAoIXNlcCkgc2VwID0gIiwgIjsKLSAgICBpZiAoIWxhc3RzZXApIGxhc3RzZXAgPSAiIHVuZCAiOwotCi0gICAgc3dpdGNoIChzaXplb2YocykpICB7Ci0gICAgICAgY2FzZSAwOiByZXQ9IiI7IGJyZWFrOwotICAgICAgIGNhc2UgMTogcmV0PXNbMF07IGJyZWFrOwotICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHJldCA9IGltcGxvZGUoc1swLi48Ml0sIHNlcCk7Ci0gICAgICAgICAgICAgIHJldCArPSBsYXN0c2VwICsgc1s8MV07Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLW5vbWFzayB2YXJhcmdzIGludCBxdWVyeV9uZXh0X3Jlc2V0KG9iamVjdCBvYikgewotCi0gICAgLy8gVHlwcHJ1ZWZ1bmc6IGV0d2FzIGFuZGVyZXMgYWxzIE9iamVrdGUgb2RlciAwIHNvbGxlbiBGZWhsZXIgc2Vpbi4KLSAgICBpZiAob2IgJiYgIW9iamVjdHAob2IpKQotICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X25leHRfcmVzZXQoKTogZ290ICUuMjBPLCAiCi0gICAgICAgICAgICJleHBlY3RlZCBvYmplY3QuXG4iLG9iKSk7Ci0KLSAgICAvLyBEZWZhdWx0b2JqZWt0IFBPLCB3ZW5uIDAgdWViZXJnZWJlbi4KLSAgICBpZiAoICFvYmplY3RwKG9iKSApCi0gICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOwotCi0gICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOwotfQotCi0KLSNpZiAhX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCi0jZGVmaW5lIE1BWExFTiA1MDAwMAotbm9tYXNrIGludCBjb3B5X2ZpbGUoc3RyaW5nIHNvdXJjZSwgc3RyaW5nIGRlc3QpCi17Ci0KLSAgaW50IHB0cjsKLSAgc3RyaW5nIGJ5dGVzOwotCi0gIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0gIGlmICghc2l6ZW9mKHNvdXJjZSl8fCFzaXplb2YoZGVzdCl8fHNvdXJjZT09ZGVzdHx8KGZpbGVfc2l6ZShzb3VyY2UpPT0tMSl8fAotICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8Ci0gICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwicmVhZF9maWxlIixwcmV2aW91c19vYmplY3QoKSkpfHwKLSAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAotICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAotICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSkpCi0gICAgcmV0dXJuIDE7Ci0gIHN3aXRjaCAoZmlsZV9zaXplKGRlc3QpKQotICB7Ci0gIGNhc2UgLTE6Ci0gICAgYnJlYWs7Ci0gIGNhc2UgLTI6Ci0gICAgaWYgKGRlc3RbPDFdIT0nLycpIGRlc3QrPSIvIjsKLSAgICBkZXN0Kz1lZnVuOjpleHBsb2RlKHNvdXJjZSwiLyIpWzwxXTsKLSAgICBpZiAoZmlsZV9zaXplKGRlc3QpPT0tMikgcmV0dXJuIDE7Ci0gICAgaWYgKGZpbGVfc2l6ZShkZXN0KSE9LTEpIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGlmICghcm0oZGVzdCkpIHJldHVybiAxOwotICAgIGJyZWFrOwotICB9Ci0gIGRvCi0gIHsKLSAgICBieXRlcyA9IHJlYWRfYnl0ZXMoc291cmNlLCBwdHIsIE1BWExFTik7IHB0ciArPSBNQVhMRU47Ci0gICAgaWYgKCFieXRlcykgYnl0ZXM9IiI7Ci0gICAgd3JpdGVfZmlsZShkZXN0LCBieXRlcyk7Ci0gIH0KLSAgd2hpbGUoc2l6ZW9mKGJ5dGVzKSA9PSBNQVhMRU4pOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKLQotCi0vLyAjIyMgRXJzYXR6YXVmbG9lc3VuZyBpbiBTdHJpbmdzICMjIwotdmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2FwcykgewotICBpbnQgaTsKLSAgc3RyaW5nICpwYXJ0czsKLQotICBwYXJ0cyA9IHJlZ2V4cGxvZGUoc3RyLCAiQFdFW0EtU1VdKlswLTldIik7Ci0gIGkgPSBzaXplb2YocGFydHMpOwotCi0gIGlmIChpPjEpIHsKLSAgICBpbnQgaiwgdDsKLSAgICBjbG9zdXJlICpuYW1lX2NsczsKLQotICAgIHQgPSBqID0gc2l6ZW9mKG9icyk7Ci0KLSAgICBuYW1lX2NscyAgPSAgYWxsb2NhdGUoaik7Ci0gICAgd2hpbGUgKGotLSkKLSAgICAgIGlmIChvYmplY3RwKG9ic1tqXSkpCi0gICAgICAgIG5hbWVfY2xzW2pdID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgb2JzW2pdKTsKLSAgICAgIGVsc2UgaWYgKHN0cmluZ3Aob2JzW2pdKSkKLSAgICAgICAgbmFtZV9jbHNbal0gPSBvYnNbal07Ci0KLSAgICB3aGlsZSAoKGktPSAyKT4wKSB7Ci0gICAgICBpbnQgb2JfbnI7Ci0gICAgICAvLyB6dSBlcnNldHplbmRlcyBUb2tlbiBpbiBGYWxsIHVuZCBPYmpla3RpbmRleCBhdWZzcGFsdGVuCi0gICAgICBvYl9uciA9IHBhcnRzW2ldWzwxXS0nMSc7Ci0gICAgICBpZiAob2JfbnI8MCB8fCBvYl9ucj49dCkgewotICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJyZXBsYWNlX3BlcnNvbmFsOiB1c2luZyB3cm9uZyBvYmplY3QgaW5kZXggJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIG9iX25yKSk7Ci0gICAgICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGNhc3VzIGthbm4gbWFuIHNjaG9uIGhpZXIgZW50c2NoZWlkZW4KLSAgICAgIGludCBjYXN1czsKLSAgICAgIHN0cmluZyBwYXJ0ID0gcGFydHNbaV07Ci0gICAgICBzd2l0Y2ggKHBhcnRbM10pIHsKLSAgICAgICAgY2FzZSAnUic6IGNhc3VzID0gV0VSOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAnUyc6IGNhc3VzID0gV0VTU0VOOyBicmVhazsKLSAgICAgICAgY2FzZSAnTSc6IGNhc3VzID0gV0VNOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAnTic6IGNhc3VzID0gV0VOOyAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogIGNvbnRpbnVlOyAvLyBwYXNzdCBzY2hvbiBqZXR6dCBuaWNodCBpbiBkYXMgSGF1cHRtdXN0ZXIKLSAgICAgIH0KLQotICAgICAgLy8gdW5kIGpldHp0IGRpZSBlaW56ZWxuZW4gS2V5d29yZHMgb2huZSBmdWVocmVuZGVzICJAV0UiLCBiZWVuZGVuZGUgSWQKLSAgICAgIG1peGVkIHRtcDsKLSAgICAgIHN3aXRjaCAocGFydFszLi48Ml0pIHsKLSAgICAgICAgY2FzZSAiUiI6IGNhc2UgIlNTRU4iOiBjYXNlICJNIjogY2FzZSAiTiI6ICAgICAgICAgICAgICAgLy8gTmFtZQotICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzLCAxKTsgIGJyZWFrOwotICAgICAgICBjYXNlICJSVSI6IGNhc2UgIlNTRU5VIjogY2FzZSAiTVUiOiBjYXNlICJOVSI6ICAgICAgICAgICAvLyB1bmJlc3RpbW10Ci0gICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMpOyAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlJRUCI6IGNhc2UgIlNTRU5RUCI6IGNhc2UgIk1RUCI6IGNhc2UgIk5RUCI6ICAgICAgIC8vIFByb25vdW4KLSAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKLSAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UHJvbm91bihjYXN1cyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlJRQSI6IGNhc2UgIlNTRU5RQSI6IGNhc2UgIk1RQSI6IGNhc2UgIk5RQSI6ICAgICAgIC8vIEFydGljbGUKLSAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKLSAgICAgICAgICAgIHRtcCA9IChzdHJpbmcpdG1wLT5RdWVyeUFydGljbGUoY2FzdXMsIDEsIDEpOwotICAgICAgICAgIGlmIChzdHJpbmdwKHRtcCkgJiYgISh0bXBbPDFdXicgJykpIAotICAgICAgICAgICAgdG1wID0gdG1wWzAuLjwyXTsgICAgICAgICAgICAgICAgLy8gRXh0cmEtU3BhY2Ugd2llZGVyIGxvZXNjaGVuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlJRUFBNUyI6IGNhc2UgIlNTRU5RUFBNUyI6IGNhc2UgIk1RUFBNUyI6IGNhc2UgIk5RUFBNUyI6Ci0gICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCi0gICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBTSU5HVUxBUik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIlJRUFBGUyI6IGNhc2UgIlNTRU5RUFBGUyI6IGNhc2UgIk1RUFBGUyI6IGNhc2UgIk5RUFBGUyI6Ci0gICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCi0gICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiUlFQUE5TIjogY2FzZSAiU1NFTlFQUE5TIjogY2FzZSAiTVFQUE5TIjogY2FzZSAiTlFQUE5TIjoKLSAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKLSAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgU0lOR1VMQVIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICJSUVBQTVAiOiBjYXNlICJTU0VOUVBQTVAiOiBjYXNlICJNUVBQTVAiOiBjYXNlICJOUVBQTVAiOgotICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQotICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgUExVUkFMKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiUlFQUEZQIjogY2FzZSAiU1NFTlFQUEZQIjogY2FzZSAiTVFQUEZQIjogY2FzZSAiTlFQUEZQIjoKLSAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKLSAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgUExVUkFMKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAiUlFQUE5QIjogY2FzZSAiU1NFTlFQUE5QIjogY2FzZSAiTVFQUE5QIjogY2FzZSAiTlFQUE5QIjoKLSAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKLSAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgUExVUkFMKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gd2VubiB0bXAgZWluIFN0cmluZyB3YXIsIHdlaXNlbiB3aXIgZXMgaGllciBwYXVzY2hhbCB6dQotICAgICAgaWYgKHN0cmluZ3AodG1wKSkKLSAgICAgICAgcGFydHNbaV0gPSB0bXA7Ci0KLSAgICAgIC8vIGF1ZiBXdW5zY2ggd2lyZCBuYWNoIFNhdHplbmRlbiBncm9zcyBnZXNjaHJpZWJlbgotICAgICAgaWYgKGNhcHMpCi0gICAgICAgIHN3aXRjaCAocGFydHNbaS0xXVs8Mi4uXSkgewotICAgICAgICAgIGNhc2UgIi4gIjogIGNhc2UgIiEgIjogIGNhc2UgIj8gIjoKLSAgICAgICAgICBjYXNlICIuIjogICBjYXNlICIhIjogICBjYXNlICI/IjoKLSAgICAgICAgICBjYXNlICIuXG4iOiBjYXNlICIhXG4iOiBjYXNlICI/XG4iOgotICAgICAgICAgIGNhc2UgIlwiICI6IGNhc2UgIlwiXG4iOgotICAgICAgICAgICAgcGFydHNbaV0gPSBjYXBpdGFsaXplKHBhcnRzW2ldKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7Ci0gIH0KLSAgcmV0dXJuIHN0cjsKLX0KLQotCi0vL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAotI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCi1kZXByZWNhdGVkIHZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0bykgewotCi0gIGlmKCFzdHJpbmdwKHN0cikpIHsKLSAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIGV4dHJhY3QoKTogJU8iLHN0cikpOwotICB9Ci0gIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7Ci0gICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCi0gICAgICByZXR1cm4oc3RyW2Zyb20gLi4gdG9dKTsKLSAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCi0gICAgICByZXR1cm4oc3RyW2Zyb20gLi4gPGFicyh0byldKTsKLSAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCi0gICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gdG9dKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKLSAgfQotICBlbHNlIGlmIChpbnRwKGZyb20pKSB7Ci0gICAgaWYgKGZyb20+PTApCi0gICAgICByZXR1cm4oc3RyW2Zyb20gLi4gXSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIF0pOwotICB9Ci0gIGVsc2UgewotICAgIHJldHVybihzdHIpOwotICB9Ci19Ci0jZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKLQotI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQotZGVwcmVjYXRlZCB2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKSB7Ci0KLSAgaWYoIXBvaW50ZXJwKGFycmF5KSkgewotICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7Ci0gICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gc2xpY2VfYXJyYXkoKTogJU8iLGFycmF5KSk7Ci0gIH0KLSAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKLSAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKLSAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIHRvXSk7Ci0gICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQotICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gPGFicyh0byldKTsKLSAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCi0gICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiB0b10pOwotICAgIGVsc2UKLSAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7Ci0gIH0KLSAgZWxzZSBpZiAoaW50cChmcm9tKSkgewotICAgIGlmIChmcm9tPj0wKQotICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gXSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gXSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgcmV0dXJuKGFycmF5KTsKLSAgfQotfQotI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQotCi0jaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQotZGVwcmVjYXRlZCBpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKSB7Ci0KLSAgaWYgKHBvaW50ZXJwKGFycmF5c3RyaW5nKSkgewotICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsaXRlbSkpOwotICB9Ci0gIGVsc2UgaWYgKHN0cmluZ3AoYXJyYXlzdHJpbmcpKSB7Ci0gICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyx0b19pbnQoaXRlbSkpKTsKLSAgfQotICBlbHNlIHsKLSAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwotICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIG1lbWJlcl9hcnJheSgpOiAlTyIsYXJyYXlzdHJpbmcpKTsKLSAgfQotfQotI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKLQotLy8gVGhlIGRpZ2l0IGF0IHRoZSBpJ3RoIHBvc2l0aW9uIGlzIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gJ2knLgotc3RyaW5nIGNvdW50X3RhYmxlID0KLSAgICAiMDExMjEyMjMxMjIzMjMzNDEyMjMyMzM0MjMzNDM0NDUxMjIzMjMzNDIzMzQzNDQ1MjMzNDM0NDUzNDQ1NDU1NiI7Ci1pbnQgYnJva2VuX2NvdW50X2JpdHMoIHN0cmluZyBzICkgewotICAgIGludCBpLCByZXM7Ci0gICAgaWYoICFzdHJpbmdwKHMpIHx8ICEoaT1zaXplb2YocykpICkgcmV0dXJuIDA7Ci0gICAgZm9yKCA7IGktLT4wOyApIHsKLSAgICAgICAgLy8gV2UgYXJlIGNvdW50aW5nIDYgYml0cyBhdCBhIHRpbWUgdXNpbmcgYSBwcmVjb21waWxlZCB0YWJsZS4KLSAgICAgICAgcmVzICs9IGNvdW50X3RhYmxlWyhzW2ldLScgJykmNjNdLScwJzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvdW50X2JpdHMpCi1pbnQgY291bnRfYml0cyggc3RyaW5nIHMgKSB7Ci0gICAgcmV0dXJuKGJyb2tlbl9jb3VudF9iaXRzKHMpKTsKLX0KLSNlbmRpZgotCi0KLS8vICogVGVpbGUgYXVzIGVpbmVtIEFycmF5IGVudGZlcm5lbiAqKiogT0JTT0xFVEUKLWRlcHJlY2F0ZWQgbWl4ZWQgKmV4Y2x1ZGVfYXJyYXkobWl4ZWQgKmFycixpbnQgZnJvbSxpbnQgdG8pCi17Ci0gIGlmICh0bzxmcm9tKQotICAgIHRvID0gZnJvbTsKLSAgcmV0dXJuIGFyclswLi5mcm9tLTFdK2Fyclt0bysxLi5dOwotfQotCg==