ZGlmZiAtLWdpdCBhL3NlY3VyZS9mdHBkLmMgYi9zZWN1cmUvZnRwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OWNmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZnRwZC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIGZ0cGQuYworKiogUnVtYXRhQG1nCisqKiAxMy42LjE5OTkKKyoqCisqKiBFcm1pdHRsdW5nIGRlciBadWdyaWZmc3JlY2h0ZSBhdXMgZGVuIFVzZXJkYXRlbi4KKyoqCisqKiBEaWVzZXMgT2JqZWt0IHdpcmQgdm9tIGZ0cGltcCBhdXMgYXVmZ2VydWZlbiwgZGVyIHdpZWRlcnVtIHZvbSBtYXN0ZXIKKyoqIGF1ZmdlcnVmZW4gd2lyZCwgdW0gZGllIFp1Z3JpZmZzcmVjaHRlIHp1IHBydWVmZW4uCisqKgorKiogRnVrdGlvbnN3ZWlzZToKKyoqICsgSW0gTWFzdGVyIHdpcmQgdm9tIFVOSVgtZnRwZCBhdXMgRnRwQWNjZXNzICgvc2VjdXJlL21hc3Rlci9uZXR3b3JrKQorKiogICBhdWZnZXJ1ZmVuLgorKiogKyBEaWVzZXMgcnVmdCBkYW5uLCBzb2JhbGQgZWluIFp1Z3JpZmYgZXJrYW5udCB3aXJkCisqKiAgIFF1ZXJ5UmVhZCwgUXVlcnlXcml0ZSBvZGVyIFF1ZXJ5RGlyIGF1Zi4KKyoqICsgRGllc2UgZnJhZ2VuIGRlbiBNYXN0ZXIsIG9iIGRlciBadWdyaWZmIGxlZ2FsIGlzdC4KKyoqICsgUXVlcnlEaXIgbGllZmVydCBhdWNoIGdsZWljaCBkYXMgRXJnZWJuaXMgbWl0LgorKioKKyoqIFVtIGZ0cC16dWdyaWZmZSD8YmVyd2FjaGVuIHp1IGv2bm5lbiwga2FubiBkZXIgZnRwZCBlaW5lIGxpc3RlIGRlcgorKiogdWViZXJ3YWNodGVuIHNwaWVsZXIgbGllZmVybiB1bmQgZGVyZW4gWnVncmlmZmUgYXVmIGRlbSBGVFAgS2FuYWwgYXVzZ2ViZW4uCisqKgorKiogYWRkKCBuYW1lLCB6ZWl0ICkgLSBGVFAgWnVncmlmZmUgZGVzIFNwaWVsZXJzICduYW1lJyB3ZXJkZW4gcHJvdG9rb2xsaWVydC4KKyoqICAgICAgICAgICAgICAgICAgICAgTmFjaCAnemVpdCcgd2lyZCBkaWVzZXIgWnVncmlmZiBhdXRvbWF0aXNjaCBiZWVuZGV0LgorKiogICAgICAgICAgICAgICAgICAgICBJc3QgJ3plaXQnIDw9IDAsIHdpciBhdWYgZXdpZyB1ZWJlcndhY2h0LiAKKyoqIHN1YiggbmFtZSApICAgICAgIC0gRlRQIFNub29wIGZ1ZXIgU3BpZWxlciAnbmFtZScgZGlyZWt0IGF1ZmhlYmVuLgorKiogbGlzdCgpICAgICAgICAgICAgLSBNYXBwaW5nIGRlciB1ZWJlcndhY2h0ZW4gU3BpZWxlciB6dXJ1ZWNrZ2ViZW4uCisqKgorKiogRklMRVM6CisqKiAgIC9zZWN1cmUvbWFzdGVyL25ldHdvcmsuYworKiogICAvc2VjdXJlL2Z0cGQuYworKiogICAvc3RkL3NoZWxscy9maWxlc3lzL2Z0cGltcC5jCisqKiAgIC9zZWN1cmUvQVJDSC9mdHBkLm8KKyoqICAgL3AvZGFlbW9uL2NoYW5uZWxkLmluaXQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisKKyNkZWZpbmUgRlRQRFNBVkUgIi9zZWN1cmUvQVJDSC9mdHBkIgorI2RlZmluZSBGVFBEX0NIICJGVFAiCisjZGVmaW5lIEJCTUFTVEVSICIvc2VjdXJlL2JibWFzdGVyIgorCittYXBwaW5nIG1vbml0b3JlZDsKKy8vIFp1IGplZGVtIFNwaWVsZXJuYW1lbiB3aXJkIHZlcm1lcmt0LCB3aWUgbGFuZ2UgZGllIFVlYmVyd2FjaHVuZyBkYXVlcm4gc29sbC4KKy8vIFphaGxlbiA8PSAwIGJlZGV1dGVuIGZ1ZXIgaW1tZXIuCisKK25vbWFzayB2b2lkIGNyZWF0ZSgpIHsKKyAgaWYoIGNsb25lcCh0aGlzX29iamVjdCgpKSApIHsKKyAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgIHJldHVybjsKKyAgfQorICBzZXRldWlkKCBnZXR1aWQoKSApOworICBpZiggIXJlc3RvcmVfb2JqZWN0KEZUUERTQVZFKSApCisgICAgbW9uaXRvcmVkID0gKFtdKTsKK30KKworbm9tYXNrIGludCBwbGF5ZXJfZXhpc3RzKCBzdHJpbmcgdXNlciApIHsKKyAgdXNlciA9IGxvd2VyX2Nhc2UodXNlcik7CisgIGlmKCAhc3RyaW5ncCggdXNlciApIHx8IHNpemVvZiggdXNlciApIDwgMSApIHJldHVybiAwOworICByZXR1cm4gZmlsZV9zaXplKCAiL3NhdmUvIit1c2VyWzAuLjBdKyIvIit1c2VyKyIubyIgKSA+IDA7Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBhZGQoIHN0cmluZyB1c2VyLCBpbnQgdGltZW91dCApIHsKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgcmV0dXJuIC0xOworICBpZiggIXBsYXllcl9leGlzdHModXNlcikgKSByZXR1cm4gLTI7CisgIG1vbml0b3JlZFt1c2VyXSA9IHRpbWVvdXQ7CisgIHNhdmVfb2JqZWN0KCBGVFBEU0FWRSApOworICByZXR1cm4gMDsKK30KKworbm9tYXNrIGludCBzdWIoIHN0cmluZyB1c2VyICkgeworICBpZiggIUFSQ0hfU0VDVVJJVFkgKSByZXR1cm4gLTE7CisgIGlmKCAhcGxheWVyX2V4aXN0cyh1c2VyKSApIHJldHVybiAtMjsKKyAgbW9uaXRvcmVkIC09IChbIHVzZXIgXSk7CisgIHNhdmVfb2JqZWN0KCBGVFBEU0FWRSApOworICByZXR1cm4gMDsKK30KKworbm9tYXNrIG1peGVkIGxpc3QoKSB7CisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHJldHVybiAtMTsKKyAgcmV0dXJuIGRlZXBfY29weShtb25pdG9yZWQpOworfQorCisjZGVmaW5lIE5FV0lNUCAieWVzIgorCitwcml2YXRlIG9iamVjdCBmaW5kRnRwSW1wRm9yKCBzdHJpbmcgdXNlciApIHsKKyNpZmRlZiBORVdJTVAKKyAgcmV0dXJuICIvc2VjdXJlL2ltcGZldGNoIi0+aW1wRm9yKCBsb3dlcl9jYXNlKHVzZXIpICk7CisjZWxzZQorICBvYmplY3QgaW1wOworICBzdHJpbmcgZm5hbWU7CisKKyAgdXNlciA9IGxvd2VyX2Nhc2UoIHVzZXIgKTsKKyAgZm5hbWUgPSAiL2Z0cGltcDoiICsgdXNlcjsKKyAgaW1wID0gZmluZF9vYmplY3QoIGZuYW1lICk7CisgIGlmKCAhb2JqZWN0cChpbXApICkgeworICAgIGltcCA9IGNsb25lX29iamVjdCggInNlY3VyZS9mdHBpbXAiICk7CisgICAgaW1wLT5TZXRVc2VyKHVzZXIpOworICAgIHJlbmFtZV9vYmplY3QoIGltcCwgZm5hbWUgKTsKKyAgfQorICByZXR1cm4gaW1wOworI2VuZGlmCit9CisKK3ByaXZhdGUgbm9tYXNrIHZvaWQgbXNnKCBzdHJpbmcgdXNlciwgc3RyaW5nIG0gKSB7CisgIGludCB0aW1lb3V0OworICBvYmplY3QgcjsKKworICBpZiggIXN0cmluZ3AodXNlcikgKSByZXR1cm47CisgIG0gKz0gIlxuIjsKKyAgaWYoIChyPWZpbmRfcGxheWVyKCJydW1hdGEiKSkgJiYgdXNlcj09ImF0YW11ciIgKSB7CisgICAgIHRpbWVvdXQgPSBDSE1BU1RFUi0+c2VuZChGVFBEX0NILGZpbmRGdHBJbXBGb3IodXNlciksIG0gKTsKKyAgICAgdGVsbF9vYmplY3QoIHIsIHNwcmludGYoIiVPXG4iLCBmaW5kRnRwSW1wRm9yKHVzZXIpICkgKTsKKyAgfQorICBCQk1BU1RFUi0+ZnRwYmIodXNlcixtKTsKKyAgaWYoICFtZW1iZXIobW9uaXRvcmVkLHVzZXIpICkgcmV0dXJuOworICB0aW1lb3V0ID0gbW9uaXRvcmVkW3VzZXJdOworICBpZiggdGltZW91dCA+IDAgJiYgdGltZW91dCA8IHRpbWUoKSApIHsKKyAgICBzdWIoIHVzZXIgKTsKKyAgICByZXR1cm47CisgIH0KKyAgQ0hNQVNURVItPnNlbmQoRlRQRF9DSCxmaW5kRnRwSW1wRm9yKHVzZXIpLCBtICk7Cit9CisKK25vbWFzayBpbnQgc2VjdXJlKCkgeworICByZXR1cm4gcHJldmlvdXNfb2JqZWN0KCk9PWZpbmRfb2JqZWN0KE1BU1RFUik7Cit9CisKK25vbWFzayBtaXhlZCBRdWVyeVJlYWQoIHN0cmluZyB1c2VyLCBzdHJpbmcgZmlsZSApIHsKKyAgaWYoICFzZWN1cmUoKSApIHJldHVybiAtMTsKKyAgaWYoIChJU19XSVpBUkQodXNlcikgfHwgZmlsZVswLi40XT09Ii9vcGVuIikKKyAgICAgICYmIGZpbGVbMF0gPT0gJy8nCisgICAgICAmJiBNQVNURVItPnZhbGlkX3JlYWQoZmlsZSwgdXNlciwgInJlYWRfZmlsZSIsIDApCisgICAgICApIHsKKyAgICBtc2coIHVzZXIsICJyZWFkICIgKyBmaWxlICk7CisgICAgcmV0dXJuICJPSyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJGQUlMIjsKKyAgfQorfQorCitub21hc2sgbWl4ZWQgUXVlcnlXcml0ZSggc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlICkgeworICBpZiggIXNlY3VyZSgpICkgcmV0dXJuIC0xOworICBpZiggZmlsZVswXSA9PSAnLycKKyAgICAgICYmIE1BU1RFUi0+dmFsaWRfd3JpdGUoIGZpbGUsIHVzZXIsICJ3cml0ZV9maWxlIiwgMCkKKyAgICAgICkgeworICAgIG1zZyggdXNlciwgIndyaXRlICIgKyBmaWxlICk7CisgICAgcmV0dXJuICJPSyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJGQUlMIjsKKyAgfQorfQorCisjZGVmaW5lIERCRyh4KSBpZihmaW5kX3BsYXllcigicnVtYXRhIikpe3RlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJydW1hdGEiKSwiRlRQRDoiK3grIlxuIik7fQorCisvL25vbWFzayBtaXhlZCBRdWVyeURpciggc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlICkgeworLy8gIHN0cmluZyByZXBseTsKKy8vICBvYmplY3QgaW1wOworLy8KKy8vICBpZiggIXNlY3VyZSgpICkgcmV0dXJuIC0xOworLy8gIHJlcGx5ID0gUXVlcnlSZWFkKCB1c2VyLCBmaWxlICk7CisvLyAgaWYoIHJlcGx5PT0iRkFJTCIgKSByZXR1cm4gLTE7CisvLworLy8gIGltcCA9IGZpbmRGdHBJbXBGb3IoIHVzZXIgKTsKKy8vICBpZiggIW9iamVjdHAoaW1wKSApIHJldHVybiAtMTsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorLy8KKy8vICByZXR1cm4gaW1wLT5HZXREaXIoIGZpbGUgKTsKKy8vfQorCitub21hc2sgbWl4ZWQgUXVlcnlEaXIoIHN0cmluZyB1c2VyLCBzdHJpbmcgZmlsZSApIHsKKyAgaWYoICFzZWN1cmUoKSApIHJldHVybiAtMTsKKyAgaWYoIGZpbGVbMF0gPT0gJy8nCisgICAgICAmJiBNQVNURVItPnZhbGlkX3JlYWQoIGZpbGUrIi8qIiwgdXNlciwgImdldF9kaXIiLCAwKSkKKyAgICAgIHJldHVybiAiT0siOworICBlbHNlIAorICAgIHJldHVybiAiRkFJTCI7Cit9Cg==