ZGlmZiAtLWdpdCBhL2FuZHJvaWQvMS4wL0FHbnNzLmNwcCBiL2FuZHJvaWQvMS4wL0FHbnNzLmNwcAppbmRleCBmYWFmNzVlLi43OWY2NjVjIDEwMDY0NAotLS0gYS9hbmRyb2lkLzEuMC9BR25zcy5jcHAKKysrIGIvYW5kcm9pZC8xLjAvQUduc3MuY3BwCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogICAgIEFncHNDYkluZm8gY2JJbmZvID0ge307CiAgICAgY2JJbmZvLnN0YXR1c1Y0Q2IgPSAodm9pZCopYWduc3NTdGF0dXNJcFY0Q2I7Ci0gICAgY2JJbmZvLmNiUHJpb3JpdHkgPSBBR1BTX0NCX1BSSU9SSVRZX0xPVzsKKyAgICBjYkluZm8uYXRsVHlwZSA9IEFHUFNfQVRMX1RZUEVfU1VQTCB8IEFHUFNfQVRMX1RZUEVfU1VQTF9FUzsKIAogICAgIG1HbnNzLT5nZXRHbnNzSW50ZXJmYWNlKCktPmFncHNJbml0KGNiSW5mbyk7CiAgICAgcmV0dXJuIFZvaWQoKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvMS4wL2FuZHJvaWQuaGFyZHdhcmUuZ25zc0AxLjAtc2VydmljZS1xdGkucmMgYi9hbmRyb2lkLzEuMC9hbmRyb2lkLmhhcmR3YXJlLmduc3NAMS4wLXNlcnZpY2UtcXRpLnJjCmluZGV4IGI1ZGE2ZjkuLjFmYmQ4OTMgMTAwNjQ0Ci0tLSBhL2FuZHJvaWQvMS4wL2FuZHJvaWQuaGFyZHdhcmUuZ25zc0AxLjAtc2VydmljZS1xdGkucmMKKysrIGIvYW5kcm9pZC8xLjAvYW5kcm9pZC5oYXJkd2FyZS5nbnNzQDEuMC1zZXJ2aWNlLXF0aS5yYwpAQCAtMSw0ICsxLDQgQEAKIHNlcnZpY2UgZ25zc19zZXJ2aWNlIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZ25zc0AxLjAtc2VydmljZS1xdGkKICAgICBjbGFzcyBoYWwKICAgICB1c2VyIGdwcwotICAgIGdyb3VwIHN5c3RlbSBncHMgcmFkaW8KKyAgICBncm91cCBzeXN0ZW0gZ3BzIHJhZGlvIHZlbmRvcl9xdGlfZGlhZwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC8xLjEvQUduc3MuY3BwIGIvYW5kcm9pZC8xLjEvQUduc3MuY3BwCmluZGV4IGZlNTBjOWEuLmQ4Zjk3MDYgMTAwNjQ0Ci0tLSBhL2FuZHJvaWQvMS4xL0FHbnNzLmNwcAorKysgYi9hbmRyb2lkLzEuMS9BR25zcy5jcHAKQEAgLTEwNSw3ICsxMDUsNyBAQAogCiAgICAgQWdwc0NiSW5mbyBjYkluZm8gPSB7fTsKICAgICBjYkluZm8uc3RhdHVzVjRDYiA9ICh2b2lkKilhZ25zc1N0YXR1c0lwVjRDYjsKLSAgICBjYkluZm8uY2JQcmlvcml0eSA9IEFHUFNfQ0JfUFJJT1JJVFlfTE9XOworICAgIGNiSW5mby5hdGxUeXBlID0gQUdQU19BVExfVFlQRV9TVVBMIHwgQUdQU19BVExfVFlQRV9TVVBMX0VTOwogCiAgICAgbUduc3MtPmdldEduc3NJbnRlcmZhY2UoKS0+YWdwc0luaXQoY2JJbmZvKTsKICAgICByZXR1cm4gVm9pZCgpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC8xLjEvYW5kcm9pZC5oYXJkd2FyZS5nbnNzQDEuMS1zZXJ2aWNlLXF0aS5yYyBiL2FuZHJvaWQvMS4xL2FuZHJvaWQuaGFyZHdhcmUuZ25zc0AxLjEtc2VydmljZS1xdGkucmMKaW5kZXggNDFiMTA1Yi4uYmQ2NTU4NCAxMDA2NDQKLS0tIGEvYW5kcm9pZC8xLjEvYW5kcm9pZC5oYXJkd2FyZS5nbnNzQDEuMS1zZXJ2aWNlLXF0aS5yYworKysgYi9hbmRyb2lkLzEuMS9hbmRyb2lkLmhhcmR3YXJlLmduc3NAMS4xLXNlcnZpY2UtcXRpLnJjCkBAIC0xLDQgKzEsNCBAQAogc2VydmljZSBnbnNzX3NlcnZpY2UgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5nbnNzQDEuMS1zZXJ2aWNlLXF0aQogICAgIGNsYXNzIGhhbAogICAgIHVzZXIgZ3BzCi0gICAgZ3JvdXAgc3lzdGVtIGdwcyByYWRpbworICAgIGdyb3VwIHN5c3RlbSBncHMgcmFkaW8gdmVuZG9yX3F0aV9kaWFnCmRpZmYgLS1naXQgYS9hbmRyb2lkLzIuMC9BR25zcy5jcHAgYi9hbmRyb2lkLzIuMC9BR25zcy5jcHAKaW5kZXggN2JkMDE1ZS4uYTQ4ZjFhMCAxMDA2NDQKLS0tIGEvYW5kcm9pZC8yLjAvQUduc3MuY3BwCisrKyBiL2FuZHJvaWQvMi4wL0FHbnNzLmNwcApAQCAtMTA3LDcgKzEwNyw3IEBACiAKICAgICBBZ3BzQ2JJbmZvIGNiSW5mbyA9IHt9OwogICAgIGNiSW5mby5zdGF0dXNWNENiID0gKHZvaWQqKWFnbnNzU3RhdHVzSXBWNENiOwotICAgIGNiSW5mby5jYlByaW9yaXR5ID0gQUdQU19DQl9QUklPUklUWV9ISUdIOworICAgIGNiSW5mby5hdGxUeXBlID0gQUdQU19BVExfVFlQRV9TVVBMIHwgQUdQU19BVExfVFlQRV9TVVBMX0VTOwogCiAgICAgbUduc3MtPmdldEduc3NJbnRlcmZhY2UoKS0+YWdwc0luaXQoY2JJbmZvKTsKICAgICByZXR1cm4gVm9pZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9Db250ZXh0QmFzZS5jcHAgYi9jb3JlL0NvbnRleHRCYXNlLmNwcAppbmRleCAwODRiNmJmLi5kNWMzMTA4IDEwMDY0NAotLS0gYS9jb3JlL0NvbnRleHRCYXNlLmNwcAorKysgYi9jb3JlL0NvbnRleHRCYXNlLmNwcApAQCAtNDAsNiArNDAsMTAgQEAKIAogbmFtZXNwYWNlIGxvY19jb3JlIHsKIAorI2RlZmluZSBTTExfTE9DX0FQSV9MSUJfTkFNRSAibGlic3luZXJneV9sb2NfYXBpLnNvIgorI2RlZmluZSBMT0NfQVBJVjJfMF9MSUJfTkFNRSAibGlibG9jX2FwaV92MDIuc28iCisjZGVmaW5lIElTX1NTNV9IV19FTkFCTEVEICAxCisKIGxvY19ncHNfY2ZnX3NfdHlwZSBDb250ZXh0QmFzZTo6bUdwc19jb25mIHt9OwogbG9jX3NhcF9jZmdfc190eXBlIENvbnRleHRCYXNlOjptU2FwX2NvbmYge307CiBib29sIENvbnRleHRCYXNlOjpzSXNFbmdpbmVDYXBhYmlsaXRpZXNLbm93biA9IGZhbHNlOwpAQCAtODAsNiArODQsNyBAQAogICB7IlBPU0lUSU9OX0FTU0lTVEVEX0NMT0NLX0VTVElNQVRPUl9FTkFCTEVEIiwgICZtR3BzX2NvbmYuUE9TSVRJT05fQVNTSVNURURfQ0xPQ0tfRVNUSU1BVE9SX0VOQUJMRUQsIE5VTEwsICduJ30sCiAgIHsiUFJPWFlfQVBQX1BBQ0tBR0VfTkFNRSIsICAgICAgICAgJm1HcHNfY29uZi5QUk9YWV9BUFBfUEFDS0FHRV9OQU1FLCAgICAgICAgIE5VTEwsICdzJyB9LAogICB7IkNQX01UTFJfRVMiLCAgICAgICAgICAgICAgICAgICAgICZtR3BzX2NvbmYuQ1BfTVRMUl9FUywgICAgICAgICAgICAgICAgICAgICBOVUxMLCAnbicgfSwKKyAgeyJHTlNTX0RFUExPWU1FTlQiLCAgJm1HcHNfY29uZi5HTlNTX0RFUExPWU1FTlQsIE5VTEwsICduJ30sCiB9OwogCiBjb25zdCBsb2NfcGFyYW1fc190eXBlIENvbnRleHRCYXNlOjptU2FwX2NvbmZfdGFibGVbXSA9CkBAIC0xNzEsMTAgKzE3NiwxNiBAQAogICAgICAgICBtR3BzX2NvbmYuQ09OU1RSQUlORURfVElNRV9VTkNFUlRBSU5UWV9FTkVSR1lfQlVER0VUID0gMDsKICAgICAgICAgLyogZGVmYXVsdCBjb25maWd1cmF0aW9uIHZhbHVlIG9mIHBvc2l0aW9uIGFzc2lzdGVkIGNsb2NrIGVzdGltYXRvciBtb2RlICovCiAgICAgICAgIG1HcHNfY29uZi5QT1NJVElPTl9BU1NJU1RFRF9DTE9DS19FU1RJTUFUT1JfRU5BQkxFRCA9IDA7CisgICAgICAgIC8qIGRlZmF1bHQgY29uZmlndXJhdGlvbiBRVEkgR05TUyBIL1cgKi8KKyAgICAgICAgbUdwc19jb25mLkdOU1NfREVQTE9ZTUVOVCA9IDA7CiAKICAgICAgICAgVVRJTF9SRUFEX0NPTkYoTE9DX1BBVEhfR1BTX0NPTkYsIG1HcHNfY29uZl90YWJsZSk7CiAgICAgICAgIFVUSUxfUkVBRF9DT05GKExPQ19QQVRIX1NBUF9DT05GLCBtU2FwX2NvbmZfdGFibGUpOwogCisgICAgICAgIExPQ19MT0dJKCIlc10gR05TUyBEZXBsb3ltZW50OiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAoKG1HcHNfY29uZi5HTlNTX0RFUExPWU1FTlQgPT0gMSkgPyAiU1M1IiA6CisgICAgICAgICAgICAgICAgKChtR3BzX2NvbmYuR05TU19ERVBMT1lNRU5UID09IDIpID8gIlFGVVNJT04iIDogIlFHTlNTIikpKTsKKwogICAgICAgICBzd2l0Y2ggKGdldFRhcmdldEduc3NUeXBlKGxvY19nZXRfdGFyZ2V0KCkpKSB7CiAgICAgICAgICAgY2FzZSBHTlNTX0dTUzoKICAgICAgICAgICBjYXNlIEdOU1NfQVVUTzoKQEAgLTIzMSwxOSArMjQyLDI0IEBACiBMb2NBcGlCYXNlKiBDb250ZXh0QmFzZTo6Y3JlYXRlTG9jQXBpKExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXhNYXNrKQogewogICAgIExvY0FwaUJhc2UqIGxvY0FwaSA9IE5VTEw7CisgICAgY29uc3QgY2hhciogbGlibmFtZSA9IExPQ19BUElWMl8wX0xJQl9OQU1FOwogCiAgICAgLy8gQ2hlY2sgdGhlIHRhcmdldAogICAgIGlmIChUQVJHRVRfTk9fR05TUyAhPSBsb2NfZ2V0X3RhcmdldCgpKXsKIAogICAgICAgICBpZiAoTlVMTCA9PSAobG9jQXBpID0gbUxCU1Byb3h5LT5nZXRMb2NBcGkoZXhNYXNrLCB0aGlzKSkpIHsKICAgICAgICAgICAgIHZvaWQgKmhhbmRsZSA9IE5VTEw7Ci0gICAgICAgICAgICAvL3RyeSB0byBzZWUgaWYgTG9jQXBpVjAyIGlzIHByZXNlbnQKLSAgICAgICAgICAgIGlmICgoaGFuZGxlID0gZGxvcGVuKCJsaWJsb2NfYXBpX3YwMi5zbyIsIFJUTERfTk9XKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIExPQ19MT0dEKCIlczolZF06IGxpYmxvY19hcGlfdjAyLnNvIGlzIHByZXNlbnQiLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisgICAgICAgICAgICBpZiAoSVNfU1M1X0hXX0VOQUJMRUQgPT0gbUdwc19jb25mLkdOU1NfREVQTE9ZTUVOVCkgeworICAgICAgICAgICAgICAgIGxpYm5hbWUgPSBTTExfTE9DX0FQSV9MSUJfTkFNRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChoYW5kbGUgPSBkbG9wZW4obGlibmFtZSwgUlRMRF9OT1cpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogJXMgaXMgcHJlc2VudCIsIF9fZnVuY19fLCBfX0xJTkVfXywgbGlibmFtZSk7CiAgICAgICAgICAgICAgICAgZ2V0TG9jQXBpX3QqIGdldHRlciA9IChnZXRMb2NBcGlfdCopIGRsc3ltKGhhbmRsZSwgImdldExvY0FwaSIpOwogICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBnZXR0ZXIgaXMgbm90IE5VTEwgZm9yIExvY0FwaVYwMiIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogZ2V0dGVyIGlzIG5vdCBOVUxMIG9mICVzIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGxpYm5hbWUpOwogICAgICAgICAgICAgICAgICAgICBsb2NBcGkgPSAoKmdldHRlcikoZXhNYXNrLCB0aGlzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL0NvbnRleHRCYXNlLmggYi9jb3JlL0NvbnRleHRCYXNlLmgKaW5kZXggYWI2MWEwOC4uNWRhNzZlMiAxMDA2NDQKLS0tIGEvY29yZS9Db250ZXh0QmFzZS5oCisrKyBiL2NvcmUvQ29udGV4dEJhc2UuaApAQCAtNzMsNiArNzMsNyBAQAogICAgIHVpbnQzMl90ICAgICAgIFBPU0lUSU9OX0FTU0lTVEVEX0NMT0NLX0VTVElNQVRPUl9FTkFCTEVEOwogICAgIGNoYXIgICAgICAgICAgIFBST1hZX0FQUF9QQUNLQUdFX05BTUVbTE9DX01BWF9QQVJBTV9TVFJJTkddOwogICAgIHVpbnQzMl90ICAgICAgIENQX01UTFJfRVM7CisgICAgdWludDMyX3QgICAgICAgR05TU19ERVBMT1lNRU5UOwogfSBsb2NfZ3BzX2NmZ19zX3R5cGU7CiAKIC8qIE5PVEU6IHRoZSBpbXBsZW1lbnRhaXRvbiBvZiB0aGUgcGFyc2VyIGNhc3RzIG51bWJlcgpkaWZmIC0tZ2l0IGEvY29yZS9FbmdpbmVIdWJQcm94eUJhc2UuaCBiL2NvcmUvRW5naW5lSHViUHJveHlCYXNlLmgKaW5kZXggNDIzOWE1MC4uZWM4ODFmNiAxMDA2NDQKLS0tIGEvY29yZS9FbmdpbmVIdWJQcm94eUJhc2UuaAorKysgYi9jb3JlL0VuZ2luZUh1YlByb3h5QmFzZS5oCkBAIC0xMDMsMTIgKzEwMyw4IEBACiAgICAgfQogfTsKIAotdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgVWxwTG9jYXRpb24mIHVscExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3BzTG9jYXRpb25FeHRlbmRlZCYgbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1Bvc1RlY2hNYXNrIHRlY2hNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tRW5naW5lSHViKT4KLSAgICAgICAgR25zc0FkYXB0ZXJSZXBvcnRQb3NpdGlvbkV2ZW50Q2I7Cit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQgY291bnQsIEVuZ2luZUxvY2F0aW9uSW5mbyogbG9jYXRpb25BcnIpPgorICAgICAgICBHbnNzQWRhcHRlclJlcG9ydEVuZ2luZVBvc2l0aW9uc0V2ZW50Q2I7CiAKIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEduc3NTdk5vdGlmaWNhdGlvbiYgc3ZOb3RpZnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21FbmdpbmVIdWIpPgpAQCAtMTE5LDExICsxMTUsMTIgQEAKIAogLy8gcG90ZW50aWFsIHBhcmFtZXRlcnM6IG1lc3NhZ2UgcXVldWU6IE1zZ1Rhc2sgKiBtc2dUYXNrOwogLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVwb3J0IGJhY2sgZHIgYW5kIHBwZSBwb3NpdGlvbiBhbmQgc3YgcmVwb3J0Ci10eXBlZGVmIEVuZ2luZUh1YlByb3h5QmFzZSogKGdldEVuZ0h1YlByb3h5Rm4pKGNvbnN0IE1zZ1Rhc2sgKiBtc2dUYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT3NPYnNlcnZlciogb3NPYnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR25zc0FkYXB0ZXJSZXBvcnRQb3NpdGlvbkV2ZW50Q2IgcG9zaXRpb25FdmVudENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbnNzQWRhcHRlclJlcG9ydFN2RXZlbnRDYiBzdkV2ZW50Q2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEduc3NBZGFwdGVyUmVxQWlkaW5nRGF0YUNiIHJlcUFpZGluZ0RhdGFDYik7Cit0eXBlZGVmIEVuZ2luZUh1YlByb3h5QmFzZSogKGdldEVuZ0h1YlByb3h5Rm4pKAorICAgICAgICBjb25zdCBNc2dUYXNrICogbXNnVGFzaywKKyAgICAgICAgSU9zT2JzZXJ2ZXIqIG9zT2JzZXJ2ZXIsCisgICAgICAgIEduc3NBZGFwdGVyUmVwb3J0RW5naW5lUG9zaXRpb25zRXZlbnRDYiBwb3NpdGlvbkV2ZW50Q2IsCisgICAgICAgIEduc3NBZGFwdGVyUmVwb3J0U3ZFdmVudENiIHN2RXZlbnRDYiwKKyAgICAgICAgR25zc0FkYXB0ZXJSZXFBaWRpbmdEYXRhQ2IgcmVxQWlkaW5nRGF0YUNiKTsKIAogfSAvLyBuYW1lc3BhY2UgbG9jX2NvcmUKIApkaWZmIC0tZ2l0IGEvY29yZS9Mb2NBZGFwdGVyQmFzZS5jcHAgYi9jb3JlL0xvY0FkYXB0ZXJCYXNlLmNwcAppbmRleCBmZmQzZDVhLi4xYjg0NGU1IDEwMDY0NAotLS0gYS9jb3JlL0xvY0FkYXB0ZXJCYXNlLmNwcAorKysgYi9jb3JlL0xvY0FkYXB0ZXJCYXNlLmNwcApAQCAtODEsNyArODEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3BzTG9jYXRpb25FeHRlbmRlZCYgbG9jYXRpb25FeHRlbmRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgIExvY1Bvc1RlY2hNYXNrIGxvY190ZWNobm9sb2d5X21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qZnJvbUVuZ2luZUh1YiovLAogICAgICAgICAgICAgICAgICAgICAgICAgR25zc0RhdGFOb3RpZmljYXRpb24qIHBEYXRhTm90aWZ5LAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zSW5XZWVrKQogewpkaWZmIC0tZ2l0IGEvY29yZS9Mb2NBZGFwdGVyQmFzZS5oIGIvY29yZS9Mb2NBZGFwdGVyQmFzZS5oCmluZGV4IGI5YjFmMWUuLjkwOWI2ZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvTG9jQWRhcHRlckJhc2UuaAorKysgYi9jb3JlL0xvY0FkYXB0ZXJCYXNlLmgKQEAgLTE1MSw5ICsxNTEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHcHNMb2NhdGlvbkV4dGVuZGVkJiBsb2NhdGlvbkV4dGVuZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NQb3NUZWNoTWFzayBsb2NfdGVjaG5vbG9neV9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUVuZ2luZUh1YiA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEduc3NEYXRhTm90aWZpY2F0aW9uKiBwRGF0YU5vdGlmeSA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zSW5XZWVrID0gLTEpOworICAgIHZpcnR1YWwgdm9pZCByZXBvcnRFbmdpbmVQb3NpdGlvbnNFdmVudCh1bnNpZ25lZCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZUxvY2F0aW9uSW5mbyogbG9jYXRpb25BcnIpIHsKKyAgICAgICAgKHZvaWQpY291bnQ7CisgICAgICAgICh2b2lkKWxvY2F0aW9uQXJyOworICAgIH0KICAgICB2aXJ0dWFsIHZvaWQgcmVwb3J0U3ZFdmVudChjb25zdCBHbnNzU3ZOb3RpZmljYXRpb24mIHN2Tm90aWZ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUVuZ2luZUh1Yj1mYWxzZSk7CiAgICAgdmlydHVhbCB2b2lkIHJlcG9ydERhdGFFdmVudChjb25zdCBHbnNzRGF0YU5vdGlmaWNhdGlvbiYgZGF0YU5vdGlmeSwgaW50IG1zSW5XZWVrKTsKZGlmZiAtLWdpdCBhL2NvcmUvTG9jQXBpQmFzZS5jcHAgYi9jb3JlL0xvY0FwaUJhc2UuY3BwCmluZGV4IGVmMjA0ZWMuLjhjNzljZjcgMTAwNjQ0Ci0tLSBhL2NvcmUvTG9jQXBpQmFzZS5jcHAKKysrIGIvY29yZS9Mb2NBcGlCYXNlLmNwcApAQCAtMTQ4LDcgKzE0OCw4IEBACiAgICAgfQogfTsKIAotTXNnVGFzayogTG9jQXBpQmFzZTo6bU1zZ1Rhc2s7CitNc2dUYXNrKiBMb2NBcGlCYXNlOjptTXNnVGFzayA9IG51bGxwdHI7Cit2b2xhdGlsZSBpbnQzMl90IExvY0FwaUJhc2U6Om1Nc2dUYXNrUmVmQ291bnQgPSAwOwogCiBMb2NBcGlCYXNlOjpMb2NBcGlCYXNlKExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXhjbHVkZWRNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0QmFzZSogY29udGV4dCkgOgpAQCAtMTU3LDYgKzE1OCw3IEBACiB7CiAgICAgbWVtc2V0KG1Mb2NBZGFwdGVycywgMCwgc2l6ZW9mKG1Mb2NBZGFwdGVycykpOwogCisgICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtTXNnVGFza1JlZkNvdW50KTsKICAgICBpZiAobnVsbHB0ciA9PSBtTXNnVGFzaykgewogICAgICAgICBtTXNnVGFzayA9IG5ldyBNc2dUYXNrKCJMb2NBcGlNc2dUYXNrIiwgZmFsc2UpOwogICAgIH0KQEAgLTIzMCw3ICsyMzIsNyBAQAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0FEQVBURVJTICYmIG1Mb2NBZGFwdGVyc1tpXSAhPSBhZGFwdGVyOyBpKyspIHsKICAgICAgICAgaWYgKG1Mb2NBZGFwdGVyc1tpXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtTG9jQWRhcHRlcnNbaV0gPSBhZGFwdGVyOwotICAgICAgICAgICAgbU1zZ1Rhc2stPnNlbmRNc2cobmV3IExvY09wZW5Nc2codGhpcywgIGFkYXB0ZXIpKTsKKyAgICAgICAgICAgIHNlbmRNc2cobmV3IExvY09wZW5Nc2codGhpcywgIGFkYXB0ZXIpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMjYzLDEwICsyNjUsMTAgQEAKIAogICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBlbXB0eSBsaXN0IG9mIGFkYXB0ZXJzCiAgICAgICAgICAgICBpZiAoMCA9PSBpKSB7Ci0gICAgICAgICAgICAgICAgbU1zZ1Rhc2stPnNlbmRNc2cobmV3IExvY0Nsb3NlTXNnKHRoaXMpKTsKKyAgICAgICAgICAgICAgICBzZW5kTXNnKG5ldyBMb2NDbG9zZU1zZyh0aGlzKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGVsc2Ugd2UgbmVlZCB0byByZW1vdmUgdGhlIGJpdAotICAgICAgICAgICAgICAgIG1Nc2dUYXNrLT5zZW5kTXNnKG5ldyBMb2NPcGVuTXNnKHRoaXMpKTsKKyAgICAgICAgICAgICAgICBzZW5kTXNnKG5ldyBMb2NPcGVuTXNnKHRoaXMpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI3NCw3ICsyNzYsNyBAQAogCiB2b2lkIExvY0FwaUJhc2U6OnVwZGF0ZUV2dE1hc2soKQogewotICAgIG1Nc2dUYXNrLT5zZW5kTXNnKG5ldyBMb2NPcGVuTXNnKHRoaXMpKTsKKyAgICBzZW5kTXNnKG5ldyBMb2NPcGVuTXNnKHRoaXMpKTsKIH0KIAogdm9pZCBMb2NBcGlCYXNlOjp1cGRhdGVObWVhTWFzayh1aW50MzJfdCBtYXNrKQpAQCAtMjk4LDcgKzMwMCw3IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgbU1zZ1Rhc2stPnNlbmRNc2cobmV3IExvY1NldE5tZWFNc2codGhpcywgbWFzaykpOworICAgIHNlbmRNc2cobmV3IExvY1NldE5tZWFNc2codGhpcywgbWFzaykpOwogfQogCiB2b2lkIExvY0FwaUJhc2U6OmhhbmRsZUVuZ2luZVVwRXZlbnQoKQpAQCAtMzQzLDcgKzM0NSw2IEBACiAgICAgVE9fQUxMX0xPQ0FEQVBURVJTKAogICAgICAgICBtTG9jQWRhcHRlcnNbaV0tPnJlcG9ydFBvc2l0aW9uRXZlbnQobG9jYXRpb24sIGxvY2F0aW9uRXh0ZW5kZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGxvY190ZWNobm9sb2d5X21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm90aWZ5LCBtc0luV2VlaykKICAgICApOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9Mb2NBcGlCYXNlLmggYi9jb3JlL0xvY0FwaUJhc2UuaAppbmRleCA4Yzg4NWY3Li42ZGFjNTg1IDEwMDY0NAotLS0gYS9jb3JlL0xvY0FwaUJhc2UuaAorKysgYi9jb3JlL0xvY0FwaUJhc2UuaApAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGdwc19leHRlbmRlZC5oPgogI2luY2x1ZGUgPExvY2F0aW9uQVBJLmg+CiAjaW5jbHVkZSA8TXNnVGFzay5oPgorI2luY2x1ZGUgPExvY1NoYXJlZExvY2suaD4KICNpbmNsdWRlIDxsb2dfdXRpbC5oPgogCiBuYW1lc3BhY2UgbG9jX2NvcmUgewpAQCAtMTA3LDYgKzEwOCw3IEBACiAgICAgZnJpZW5kIHN0cnVjdCBMb2NLaWxsTXNnOwogICAgIGZyaWVuZCBjbGFzcyBDb250ZXh0QmFzZTsKICAgICBzdGF0aWMgTXNnVGFzayogbU1zZ1Rhc2s7CisgICAgc3RhdGljIHZvbGF0aWxlIGludDMyX3QgbU1zZ1Rhc2tSZWZDb3VudDsKICAgICBMb2NBZGFwdGVyQmFzZSogbUxvY0FkYXB0ZXJzW01BWF9BREFQVEVSU107CiAKIHByb3RlY3RlZDoKQEAgLTEyMSw3ICsxMjMsOCBAQAogICAgIExvY0FwaUJhc2UoTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleGNsdWRlZE1hc2ssCiAgICAgICAgICAgICAgICBDb250ZXh0QmFzZSogY29udGV4dCA9IE5VTEwpOwogICAgIGlubGluZSB2aXJ0dWFsIH5Mb2NBcGlCYXNlKCkgewotICAgICAgICBpZiAobnVsbHB0ciAhPSBtTXNnVGFzaykgeworICAgICAgICBhbmRyb2lkX2F0b21pY19kZWMoJm1Nc2dUYXNrUmVmQ291bnQpOworICAgICAgICBpZiAobnVsbHB0ciAhPSBtTXNnVGFzayAmJiAwID09IG1Nc2dUYXNrUmVmQ291bnQpIHsKICAgICAgICAgICAgIG1Nc2dUYXNrLT5kZXN0cm95KCk7CiAgICAgICAgICAgICBtTXNnVGFzayA9IG51bGxwdHI7CiAgICAgICAgIH0KQEAgLTEzMiw3ICsxMzUsOSBAQAogCiBwdWJsaWM6CiAgICAgaW5saW5lIHZvaWQgc2VuZE1zZyhjb25zdCBMb2NNc2cqIG1zZykgY29uc3QgewotICAgICAgICBtTXNnVGFzay0+c2VuZE1zZyhtc2cpOworICAgICAgICBpZiAobnVsbHB0ciAhPSBtTXNnVGFzaykgeworICAgICAgICAgICAgbU1zZ1Rhc2stPnNlbmRNc2cobXNnKTsKKyAgICAgICAgfQogICAgIH0KICAgICBpbmxpbmUgdm9pZCBkZXN0cm95KCkgewogICAgICAgICBjbG9zZSgpOwpkaWZmIC0tZ2l0IGEvY29yZS9TeXN0ZW1TdGF0dXNPc09ic2VydmVyLmNwcCBiL2NvcmUvU3lzdGVtU3RhdHVzT3NPYnNlcnZlci5jcHAKaW5kZXggM2ZkYjUxMy4uMDQyNzM4MCAxMDA2NDQKLS0tIGEvY29yZS9TeXN0ZW1TdGF0dXNPc09ic2VydmVyLmNwcAorKysgYi9jb3JlL1N5c3RlbVN0YXR1c09zT2JzZXJ2ZXIuY3BwCkBAIC00NDgsNyArNDQ4LDcgQEAKICAgICB9CiB9CiAKLSNpZmRlZiBVU0VfUUNNQVAKKyNpZmRlZiBVU0VfR0xJQgogYm9vbCBTeXN0ZW1TdGF0dXNPc09ic2VydmVyOjpjb25uZWN0QmFja2hhdWwoKQogewogICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CmRpZmYgLS1naXQgYS9jb3JlL1N5c3RlbVN0YXR1c09zT2JzZXJ2ZXIuaCBiL2NvcmUvU3lzdGVtU3RhdHVzT3NPYnNlcnZlci5oCmluZGV4IDg3MTA5NzYuLmZkNjA2MDYgMTAwNjQ0Ci0tLSBhL2NvcmUvU3lzdGVtU3RhdHVzT3NPYnNlcnZlci5oCisrKyBiL2NvcmUvU3lzdGVtU3RhdHVzT3NPYnNlcnZlci5oCkBAIC04NCw3ICs4NCw3IEBACiAgICAgICAgICAgICBtU3lzdGVtU3RhdHVzKHN5c3RlbXN0YXR1cyksIG1Db250ZXh0KG1zZ1Rhc2ssIHRoaXMpLAogICAgICAgICAgICAgbUFkZHJlc3MoIlN5c3RlbVN0YXR1c09zT2JzZXJ2ZXIiKSwKICAgICAgICAgICAgIG1DbGllbnRUb0RhdGFJdGVtcyhNQVhfREFUQV9JVEVNX0lEKSwgbURhdGFJdGVtVG9DbGllbnRzKE1BWF9EQVRBX0lURU1fSUQpCi0jaWZkZWYgVVNFX1FDTUFQCisjaWZkZWYgVVNFX0dMSUIKICAgICAgICAgICAgICwgbUJhY2tIYXVsQ29ubmVjdFJlcUNvdW50KDApCiAjZW5kaWYKICAgICB7CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAvLyBUbyBzZXQgdGhlIGZyYW1ld29yayBhY3Rpb24gcmVxdWVzdCBvYmplY3QKICAgICBpbmxpbmUgdm9pZCBzZXRGcmFtZXdvcmtBY3Rpb25SZXFPYmooSUZyYW1ld29ya0FjdGlvblJlcSogZnJhbWV3b3JrQWN0aW9uUmVxT2JqKSB7CiAgICAgICAgIG1Db250ZXh0Lm1GcmFtZXdvcmtBY3Rpb25SZXFPYmogPSBmcmFtZXdvcmtBY3Rpb25SZXFPYmo7Ci0jaWZkZWYgVVNFX1FDTUFQCisjaWZkZWYgVVNFX0dMSUIKICAgICAgICAgaWYgKG1CYWNrSGF1bENvbm5lY3RSZXFDb3VudCA+IDApIHsKICAgICAgICAgICAgIGNvbm5lY3RCYWNraGF1bCgpOwogICAgICAgICAgICAgbUJhY2tIYXVsQ29ubmVjdFJlcUNvdW50ID0gMDsKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgIC8vIElGcmFtZXdvcmtBY3Rpb25SZXEgT3ZlcnJpZGVzCiAgICAgdmlydHVhbCB2b2lkIHR1cm5PbihEYXRhSXRlbUlkIGRpdCwgaW50IHRpbWVPdXQgPSAwKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgdHVybk9mZihEYXRhSXRlbUlkIGRpdCkgb3ZlcnJpZGU7Ci0jaWZkZWYgVVNFX1FDTUFQCisjaWZkZWYgVVNFX0dMSUIKICAgICB2aXJ0dWFsIGJvb2wgY29ubmVjdEJhY2toYXVsKCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBib29sIGRpc2Nvbm5lY3RCYWNraGF1bCgpOwogI2VuZGlmCkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAvLyBDYWNoZSB0aGUgc3Vic2NyaWJlIGFuZCByZXF1ZXN0RGF0YSB0aWxsIHN1YnNjcmlwdGlvbiBvYmogaXMgb2J0YWluZWQKICAgICB2b2lkIGNhY2hlT2JzZXJ2ZXJSZXF1ZXN0KE9ic2VydmVyUmVxQ2FjaGUmIHJlcUNhY2hlLAogICAgICAgICAgICAgY29uc3QgbGlzdDxEYXRhSXRlbUlkPiYgbCwgSURhdGFJdGVtT2JzZXJ2ZXIqIGNsaWVudCk7Ci0jaWZkZWYgVVNFX1FDTUFQCisjaWZkZWYgVVNFX0dMSUIKICAgICAvLyBDYWNoZSB0aGUgZnJhbWV3b3JrIGFjdGlvbiByZXF1ZXN0IGZvciBjb25uZWN0L2Rpc2Nvbm5lY3QKICAgICBpbnQgICAgICAgICBtQmFja0hhdWxDb25uZWN0UmVxQ291bnQ7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvb2JzZXJ2ZXIvSUZyYW1ld29ya0FjdGlvblJlcS5oIGIvY29yZS9vYnNlcnZlci9JRnJhbWV3b3JrQWN0aW9uUmVxLmgKaW5kZXggYTRjY2FkOC4uNGJlOTQ3ZiAxMDA2NDQKLS0tIGEvY29yZS9vYnNlcnZlci9JRnJhbWV3b3JrQWN0aW9uUmVxLmgKKysrIGIvY29yZS9vYnNlcnZlci9JRnJhbWV3b3JrQWN0aW9uUmVxLmgKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgdHVybk9mZiAoRGF0YUl0ZW1JZCBkaXQpID0gMDsKIAotI2lmZGVmIFVTRV9RQ01BUAorI2lmZGVmIFVTRV9HTElCCiAgICAgLyoqCiAgICAgICogQGJyaWVmIFNldHVwIFdXQU4gYmFja2hhdWwKICAgICAgKiBAZGV0YWlscyAgU2V0dXAgV1dBTiBiYWNraGF1bApkaWZmIC0tZ2l0IGEvZXRjL2dwcy5jb25mIGIvZXRjL2dwcy5jb25mCmluZGV4IDM1YTBhN2UuLmZjMzc2NTMgMTAwNjQ0Ci0tLSBhL2V0Yy9ncHMuY29uZgorKysgYi9ldGMvZ3BzLmNvbmYKQEAgLTI0LDEzICsyNCw2IEBACiAjIEludGVybWVkaWF0ZSBwb3NpdGlvbiByZXBvcnQsIDE9ZW5hYmxlLCAwPWRpc2FibGUKIElOVEVSTUVESUFURV9QT1M9MAogCi0jIEJlbG93IGJpdCBtYXNrIGNvbmZpZ3VyZXMgaG93IEdQUyBmdW5jdGlvbmFsaXRpZXMKLSMgc2hvdWxkIGJlIGxvY2tlZCB3aGVuIHVzZXIgdHVybnMgb2ZmIEdQUyBvbiBTZXR0aW5ncwotIyBTZXQgYml0IDB4MSBpZiBNTyBHUFMgZnVuY3Rpb25hbGl0aWVzIGFyZSB0byBiZSBsb2NrZWQKLSMgU2V0IGJpdCAweDIgaWYgTkkgR1BTIGZ1bmN0aW9uYWxpdGllcyBhcmUgdG8gYmUgbG9ja2VkCi0jIGRlZmF1bHQgliBib3RoIE1PIGFuZCBOSSBsb2NrZWQgZm9yIG1heGltYWwgcHJpdmFjeQotI0dQU19MT0NLID0gMwotCiAjIHN1cGwgdmVyc2lvbiAxLjAKIFNVUExfVkVSPTB4MTAwMDAKIApAQCAtMTI0LDcgKzExNyw3IEBACiAjIDB4MjogV0xBTiBBUCBNZWFzdXJlbWVudHMgZm9yIExQUGUgQ1AKICMgMHg0OiBTUk4gQVAgbWVhc3VyZW1lbnQgZm9yIENQCiAjIDB4ODogU2Vuc29yIEJhcm9tZXRlciBNZWFzdXJlbWVudCBMUFBlIENQCi1MUFBFX0NQX1RFQ0hOT0xPR1kgPSAwCisjTFBQRV9DUF9URUNITk9MT0dZID0gMAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBTZWxlY3QgdGVjaG5vbG9neSBmb3IgTFBQZSBVc2VyIFBsYW5lCkBAIC0xMzMsNyArMTI2LDcgQEAKICMgMHgyOiBXTEFOIEFQIE1lYXN1cmVtZW50cyBmb3IgTFBQZSBVUAogIyAweDQ6IFNSTiBBUCBtZWFzdXJlbWVudCBmb3IgVVAKICMgMHg4OiBTZW5zb3IgQmFyb21ldGVyIE1lYXN1cmVtZW50IExQUGUgVVAKLUxQUEVfVVBfVEVDSE5PTE9HWSA9IDAKKyNMUFBFX1VQX1RFQ0hOT0xPR1kgPSAwCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEFHUFNfQ09ORklHX0lOSkVDVApAQCAtMjk0LDMgKzI4NywxMyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBDUCBNVExSIEVTLCAxPWVuYWJsZSwgMD1kaXNhYmxlCiBDUF9NVExSX0VTPTAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR05TU19ERVBMT1lNRU5UCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAwIDogRW5hYmxlIFFUSSBHTlNTIChkZWZhdWx0KQorIyAxIDogRW5hYmxlIFFDU1IgU1M1CisjIFRoaXMgc2V0dGluZyB1c2UgdG8gc2VsZWN0IGJldHdlZW4gUVRJIEdOU1MKKyMgYW5kIFFDU1IgU1M1IGhhcmR3YXJlIHJlY2VpdmVyLgorIyBCeSBkZWZhdWx0IFFUSSBHTlNTIHJlY2VpdmVyIGlzIGVuYWJsZWQuCisjIEdOU1NfREVQTE9ZTUVOVCA9IDAKZGlmZiAtLWdpdCBhL2dlb2ZlbmNlL0dlb2ZlbmNlQWRhcHRlci5jcHAgYi9nZW9mZW5jZS9HZW9mZW5jZUFkYXB0ZXIuY3BwCmluZGV4IGI4NzQ2ZmIuLmUyOTk1ODkgMTAwNjQ0Ci0tLSBhL2dlb2ZlbmNlL0dlb2ZlbmNlQWRhcHRlci5jcHAKKysrIGIvZ2VvZmVuY2UvR2VvZmVuY2VBZGFwdGVyLmNwcApAQCAtMjQyLDMwICsyNDIsMzMgQEAKICAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBtSWRzIHx8IE5VTEwgPT0gbU9wdGlvbnMgfHwgTlVMTCA9PSBtSW5mb3MpIHsKICAgICAgICAgICAgICAgICAgICAgZXJyc1tpXSA9IExPQ0FUSU9OX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BcGkuYWRkR2VvZmVuY2UobUlkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9wdGlvbnNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbmZvc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY0FwaVJlc3BvbnNlRGF0YTxMb2NBcGlHZW9mZW5jZURhdGE+KCptQWRhcHRlci5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJm1BZGFwdGVyID0gbUFkYXB0ZXIsIG1PcHRpb25zID0gbU9wdGlvbnMsIG1DbGllbnQgPSBtQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvdW50ID0gbUNvdW50LCBtSWRzID0gbUlkcywgbUluZm9zID0gbUluZm9zLCBlcnJzLCBpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExvY2F0aW9uRXJyb3IgZXJyLCBMb2NBcGlHZW9mZW5jZURhdGEgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FUSU9OX0VSUk9SX1NVQ0NFU1MgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFkYXB0ZXIuc2F2ZUdlb2ZlbmNlSXRlbShtQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuaHdJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcHRpb25zW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluZm9zW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVycnNbaV0gPSBlcnI7CisgICAgICAgICAgICAgICAgICAgIG1BcGkuYWRkVG9DYWxsUXVldWUobmV3IExvY0FwaVJlc3BvbnNlKCptQWRhcHRlci5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZtQWRhcHRlciA9IG1BZGFwdGVyLCBtQ291bnQgPSBtQ291bnQsIG1DbGllbnQgPSBtQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcHRpb25zID0gbU9wdGlvbnMsIG1JbmZvcyA9IG1JbmZvcywgbUlkcyA9IG1JZHMsICZtQXBpID0gbUFwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJzLCBpXSAoTG9jYXRpb25FcnJvciBlcnIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXBpLmFkZEdlb2ZlbmNlKG1JZHNbaV0sIG1PcHRpb25zW2ldLCBtSW5mb3NbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jQXBpUmVzcG9uc2VEYXRhPExvY0FwaUdlb2ZlbmNlRGF0YT4oKm1BZGFwdGVyLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmbUFkYXB0ZXIgPSBtQWRhcHRlciwgbU9wdGlvbnMgPSBtT3B0aW9ucywgbUNsaWVudCA9IG1DbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgPSBtQ291bnQsIG1JZHMgPSBtSWRzLCBtSW5mb3MgPSBtSW5mb3MsIGVycnMsIGldCisgICAgICAgICAgICAgICAgICAgICAgICAoTG9jYXRpb25FcnJvciBlcnIsIExvY0FwaUdlb2ZlbmNlRGF0YSBkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FUSU9OX0VSUk9SX1NVQ0NFU1MgPT0gZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZGFwdGVyLnNhdmVHZW9mZW5jZUl0ZW0obUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlkc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5od0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3B0aW9uc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluZm9zW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyc1tpXSA9IGVycjsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBhZ2dyZWdhdGVkIHJlc3BvbnNlIG9uIGxhc3QgaXRlbSBhbmQgY2xlYW51cAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gbUNvdW50LTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWRhcHRlci5yZXBvcnRSZXNwb25zZShtQ2xpZW50LCBtQ291bnQsIGVycnMsIG1JZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGVycnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gbUlkczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBtT3B0aW9uczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBtSW5mb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBhZ2dyZWdhdGVkIHJlc3BvbnNlIG9uIGxhc3QgaXRlbSBhbmQgY2xlYW51cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IG1Db3VudC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZGFwdGVyLnJlcG9ydFJlc3BvbnNlKG1DbGllbnQsIG1Db3VudCwgZXJycywgbUlkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGVycnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIG1JZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIG1PcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBtSW5mb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ25zcy9BZ3BzLmNwcCBiL2duc3MvQWdwcy5jcHAKaW5kZXggNzkzMWQwYy4uOTI1NWY4OCAxMDA2NDQKLS0tIGEvZ25zcy9BZ3BzLmNwcAorKysgYi9nbnNzL0FncHMuY3BwCkBAIC0zMDQsNyArMzA0LDcgQEAKICAgICAgICAgbmlmUmVxdWVzdC5zdGF0dXMgPSBMT0NfR1BTX1JFTEVBU0VfQUdQU19EQVRBX0NPTk47CiAgICAgfQogCi0gICAgbUFncHNNYW5hZ2VyLT5tRnJhbWV3b3JrU3RhdHVzVjRDYihuaWZSZXF1ZXN0KTsKKyAgICBtRnJhbWV3b3JrU3RhdHVzVjRDYihuaWZSZXF1ZXN0KTsKIH0KIAogdm9pZCBBZ3BzU3RhdGVNYWNoaW5lOjpub3RpZnlBbGxTdWJzY3JpYmVycygKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiAvKiBDUkVBVEUgQUdQUyBTVEFURSBNQUNISU5FUwogICogTXVzdCBiZSBpbnZva2VkIGluIE1zZyBIYW5kbGVyIGNvbnRleHQgKi8KLXZvaWQgQWdwc01hbmFnZXI6OmNyZWF0ZUFncHNTdGF0ZU1hY2hpbmVzKCkgewordm9pZCBBZ3BzTWFuYWdlcjo6Y3JlYXRlQWdwc1N0YXRlTWFjaGluZXMoY29uc3QgQWdwc0NiSW5mbyYgY2JJbmZvKSB7CiAKICAgICBMT0NfTE9HRCgiQWdwc01hbmFnZXI6OmNyZWF0ZUFncHNTdGF0ZU1hY2hpbmVzIik7CiAKQEAgLTUxOSwxMyArNTE5LDE2IEBACiAgICAgICAgICAgICAoKGxvY19jb3JlOjpDb250ZXh0QmFzZTo6bUdwc19jb25mLkNBUEFCSUxJVElFUyAmIExPQ19HUFNfQ0FQQUJJTElUWV9NU0EpIHx8CiAgICAgICAgICAgICAgICAgICAgIChsb2NfY29yZTo6Q29udGV4dEJhc2U6Om1HcHNfY29uZi5DQVBBQklMSVRJRVMgJiBMT0NfR1BTX0NBUEFCSUxJVFlfTVNCKSk7CiAKLSAgICBpZiAoTlVMTCA9PSBtSW50ZXJuZXROaWYpIHsKKyAgICBpZiAoTlVMTCA9PSBtSW50ZXJuZXROaWYgJiYgKGNiSW5mby5hdGxUeXBlICYgQUdQU19BVExfVFlQRV9XV0FOKSkgewogICAgICAgICBtSW50ZXJuZXROaWYgPSBuZXcgQWdwc1N0YXRlTWFjaGluZSh0aGlzLCBMT0NfQUdQU19UWVBFX1dXQU5fQU5ZKTsKKyAgICAgICAgbUludGVybmV0TmlmLT5yZWdpc3RlckZyYW1ld29ya1N0YXR1c0NhbGxiYWNrKChBZ25zc1N0YXR1c0lwVjRDYiljYkluZm8uc3RhdHVzVjRDYik7CiAgICAgICAgIExPQ19MT0dEKCJJbnRlcm5ldCBOSUY6ICVwIiwgbUludGVybmV0TmlmKTsKICAgICB9CiAgICAgaWYgKGFncHNDYXBhYmxlKSB7Ci0gICAgICAgIGlmIChOVUxMID09IG1BZ25zc05pZikgeworICAgICAgICBpZiAoTlVMTCA9PSBtQWduc3NOaWYgJiYgKGNiSW5mby5hdGxUeXBlICYgQUdQU19BVExfVFlQRV9TVVBMKSAmJgorICAgICAgICAgICAgICAgIChjYkluZm8uYXRsVHlwZSAmIEFHUFNfQVRMX1RZUEVfU1VQTF9FUykpIHsKICAgICAgICAgICAgIG1BZ25zc05pZiA9IG5ldyBBZ3BzU3RhdGVNYWNoaW5lKHRoaXMsIExPQ19BR1BTX1RZUEVfU1VQTCk7CisgICAgICAgICAgICBtQWduc3NOaWYtPnJlZ2lzdGVyRnJhbWV3b3JrU3RhdHVzQ2FsbGJhY2soKEFnbnNzU3RhdHVzSXBWNENiKWNiSW5mby5zdGF0dXNWNENiKTsKICAgICAgICAgICAgIExPQ19MT0dEKCJBR05TUyBOSUY6ICVwIiwgbUFnbnNzTmlmKTsKICAgICAgICAgfQogICAgIH0KQEAgLTU0NCw2ICs1NDcsMTEgQEAKICAgICAgICAgICAgICAgICBMT0NfTE9HRSgiTlVMTCBBR05TUyBOSUYgISIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1BZ25zc05pZjsKKyAgICAgICAgY2FzZSBMT0NfQUdQU19UWVBFX1dXQU5fQU5ZOgorICAgICAgICAgICAgaWYgKG1JbnRlcm5ldE5pZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9DX0xPR0UoIk5VTEwgSW50ZXJuZXQgTklGICEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtSW50ZXJuZXROaWY7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gbUludGVybmV0TmlmOwogICAgIH0KZGlmZiAtLWdpdCBhL2duc3MvQWdwcy5oIGIvZ25zcy9BZ3BzLmgKaW5kZXggODI5Y2JkNS4uZDU1OTM3NyAxMDA2NDQKLS0tIGEvZ25zcy9BZ3BzLmgKKysrIGIvZ25zcy9BZ3BzLmgKQEAgLTEzNyw2ICsxMzcsNyBAQAogICAgIC8qIEN1cnJlbnQgc3RhdGUgZm9yIHRoaXMgc3RhdGUgbWFjaGluZSAqLwogICAgIEFncHNTdGF0ZSBtU3RhdGU7CiAKKyAgICBBZ25zc1N0YXR1c0lwVjRDYiAgICAgbUZyYW1ld29ya1N0YXR1c1Y0Q2I7CiBwcml2YXRlOgogICAgIC8qIEFHUFMgVHlwZSBmb3IgdGhpcyBzdGF0ZSBtYWNoaW5lCiAgICAgICAgTE9DX0FHUFNfVFlQRV9BTlkgICAgICAgICAgIDAKQEAgLTE1NCw2ICsxNTUsNyBAQAogcHVibGljOgogICAgIC8qIENPTlNUUlVDVE9SICovCiAgICAgQWdwc1N0YXRlTWFjaGluZShBZ3BzTWFuYWdlciogYWdwc01hbmFnZXIsIEFHcHNFeHRUeXBlIGFncHNUeXBlKToKKyAgICAgICAgbUZyYW1ld29ya1N0YXR1c1Y0Q2IoTlVMTCksCiAgICAgICAgIG1BZ3BzTWFuYWdlcihhZ3BzTWFuYWdlciksIG1TdWJzY3JpYmVyTGlzdCgpLAogICAgICAgICBtQ3VycmVudFN1YnNjcmliZXIoTlVMTCksIG1TdGF0ZShBR1BTX1NUQVRFX1JFTEVBU0VEKSwKICAgICAgICAgbUFncHNUeXBlKGFncHNUeXBlKSwgbUFQTihOVUxMKSwgbUFQTkxlbigwKSwKQEAgLTE3NSw2ICsxNzcsMTAgQEAKICAgICBpbmxpbmUgdm9pZCBzZXRDdXJyZW50U3Vic2NyaWJlcihBZ3BzU3Vic2NyaWJlciogc3Vic2NyaWJlcikKICAgICB7IG1DdXJyZW50U3Vic2NyaWJlciA9IHN1YnNjcmliZXI7IH0KIAorICAgIGlubGluZSB2b2lkIHJlZ2lzdGVyRnJhbWV3b3JrU3RhdHVzQ2FsbGJhY2soQWduc3NTdGF0dXNJcFY0Q2IgZnJhbWV3b3JrU3RhdHVzVjRDYikgeworICAgICAgICBtRnJhbWV3b3JrU3RhdHVzVjRDYiA9IGZyYW1ld29ya1N0YXR1c1Y0Q2I7CisgICAgfQorCiAgICAgLyogRmV0Y2ggc3Vic2NyaWJlciB3aXRoIHNwZWNpZmllZCBoYW5kbGUgKi8KICAgICBBZ3BzU3Vic2NyaWJlciogZ2V0U3Vic2NyaWJlcihpbnQgY29ubkhhbmRsZSk7CiAKQEAgLTIzNCw3ICsyNDAsNiBAQAogcHVibGljOgogICAgIC8qIENPTlNUUlVDVE9SICovCiAgICAgQWdwc01hbmFnZXIoKToKLSAgICAgICAgbUZyYW1ld29ya1N0YXR1c1Y0Q2IoTlVMTCksCiAgICAgICAgIG1BdGxPcGVuU3RhdHVzQ2IoKSwgbUF0bENsb3NlU3RhdHVzQ2IoKSwKICAgICAgICAgbUFnbnNzTmlmKE5VTEwpLCBtSW50ZXJuZXROaWYoTlVMTCkvKiwgbURzTmlmKE5VTEwpKi8ge30KIApAQCAtMjQ2LDEyICsyNTEsMTEgQEAKICAgICAgICAgbUF0bENsb3NlU3RhdHVzQ2IgPSBhdGxDbG9zZVN0YXR1c0NiOwogICAgIH0KIAotICAgIGlubGluZSB2b2lkIHJlZ2lzdGVyRnJhbWV3b3JrU3RhdHVzQ2FsbGJhY2soQWduc3NTdGF0dXNJcFY0Q2IgZnJhbWV3b3JrU3RhdHVzVjRDYikgewotICAgICAgICBtRnJhbWV3b3JrU3RhdHVzVjRDYiA9IGZyYW1ld29ya1N0YXR1c1Y0Q2I7Ci0gICAgfQorICAgIC8qIENoZWNrIGlmIEFHUFMgY2xpZW50IGlzIHJlZ2lzdGVyZWQgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1JlZ2lzdGVyZWQoKSB7IHJldHVybiBudWxscHRyICE9IG1BZ25zc05pZiB8fCBudWxscHRyICE9IG1JbnRlcm5ldE5pZjsgfQogCiAgICAgLyogQ3JlYXRlIGFsbCBBR1BTIHN0YXRlIG1hY2hpbmVzICovCi0gICAgdm9pZCBjcmVhdGVBZ3BzU3RhdGVNYWNoaW5lcygpOworICAgIHZvaWQgY3JlYXRlQWdwc1N0YXRlTWFjaGluZXMoY29uc3QgQWdwc0NiSW5mbyYgY2JJbmZvKTsKIAogICAgIC8qIFByb2Nlc3MgaW5jb21pbmcgQVRMIHJlcXVlc3RzICovCiAgICAgdm9pZCByZXF1ZXN0QVRMKGludCBjb25uSGFuZGxlLCBBR3BzRXh0VHlwZSBhZ3BzVHlwZSwgTG9jQXBuVHlwZU1hc2sgYXBuVHlwZU1hc2spOwpAQCAtMjY2LDcgKzI3MCw2IEBACiAgICAgdm9pZCBoYW5kbGVNb2RlbVNTUigpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgQWduc3NTdGF0dXNJcFY0Q2IgICAgIG1GcmFtZXdvcmtTdGF0dXNWNENiOwogCiAgICAgQWdwc0F0bE9wZW5TdGF0dXNDYiAgIG1BdGxPcGVuU3RhdHVzQ2I7CiAgICAgQWdwc0F0bENsb3NlU3RhdHVzQ2IgIG1BdGxDbG9zZVN0YXR1c0NiOwpkaWZmIC0tZ2l0IGEvZ25zcy9HbnNzQWRhcHRlci5jcHAgYi9nbnNzL0duc3NBZGFwdGVyLmNwcAppbmRleCBmM2I0NTljLi5hZDg2NjA2IDEwMDY0NAotLS0gYS9nbnNzL0duc3NBZGFwdGVyLmNwcAorKysgYi9nbnNzL0duc3NBZGFwdGVyLmNwcApAQCAtODAsNyArODAsNiBAQAogICAgIG1HbnNzU3ZUeXBlQ29uZmlnQ2IobnVsbHB0ciksCiAgICAgbU5pRGF0YSgpLAogICAgIG1BZ3BzTWFuYWdlcigpLAotICAgIG1BZ3BzQ2JJbmZvKCksCiAgICAgbU9kY3BpUmVxdWVzdENiKG51bGxwdHIpLAogICAgIG1PZGNwaVJlcXVlc3RBY3RpdmUoZmFsc2UpLAogICAgIG1PZGNwaVRpbWVyKHRoaXMpLApAQCAtNDg1LDYgKzQ4NCwxNiBAQAogICAgICAgICBvdXQuZmxhZ3MgfD0gR05TU19MT0NBVElPTl9JTkZPX0NBTElCUkFUSU9OX1NUQVRVU19CSVQ7CiAgICAgICAgIG91dC5jYWxpYnJhdGlvblN0YXR1cyA9IGxvY2F0aW9uRXh0ZW5kZWQuY2FsaWJyYXRpb25TdGF0dXM7CiAgICAgfQorCisgICAgaWYgKEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfT1VUUFVUX0VOR19UWVBFICYgbG9jYXRpb25FeHRlbmRlZC5mbGFncykgeworICAgICAgICBvdXQuZmxhZ3MgfD0gR05TU19MT0NBVElPTl9JTkZPX09VVFBVVF9FTkdfVFlQRV9CSVQ7CisgICAgICAgIG91dC5sb2NPdXRwdXRFbmdUeXBlID0gbG9jYXRpb25FeHRlbmRlZC5sb2NPdXRwdXRFbmdUeXBlOworICAgIH0KKworICAgIGlmIChHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX09VVFBVVF9FTkdfTUFTSyAmIGxvY2F0aW9uRXh0ZW5kZWQuZmxhZ3MpIHsKKyAgICAgICAgb3V0LmZsYWdzIHw9IEdOU1NfTE9DQVRJT05fSU5GT19PVVRQVVRfRU5HX01BU0tfQklUOworICAgICAgICBvdXQubG9jT3V0cHV0RW5nTWFzayA9IGxvY2F0aW9uRXh0ZW5kZWQubG9jT3V0cHV0RW5nTWFzazsKKyAgICB9CiB9CiAKIApAQCAtNzIyLDggKzczMSw2IEBACiAgICAgLy9jYWNoZSB0aGUgaW5qZWN0ZWQgY29uZmlndXJhdGlvbiB3aXRoIEduc3NDb25maWdSZXF1ZXN0ZWQgc3RydWN0CiAgICAgR25zc0NvbmZpZyBnbnNzQ29uZmlnUmVxdWVzdGVkID0ge307CiAgICAgZ25zc0NvbmZpZ1JlcXVlc3RlZC5mbGFncyB8PSBHTlNTX0NPTkZJR19GTEFHU19HUFNfTE9DS19WQUxJRF9CSVQgfAotICAgICAgICAgICAgR05TU19DT05GSUdfRkxBR1NfTFBQRV9DT05UUk9MX1BMQU5FX1ZBTElEX0JJVCB8Ci0gICAgICAgICAgICBHTlNTX0NPTkZJR19GTEFHU19MUFBFX1VTRVJfUExBTkVfVkFMSURfQklUIHwKICAgICAgICAgICAgIEdOU1NfQ09ORklHX0ZMQUdTX0JMQUNLTElTVEVEX1NWX0lEU19CSVQ7CiAgICAgLyogSGVyZSB3ZSBwcm9jZXNzIGFuIFNTUi4gV2UgbmVlZCB0byBzZXQgdGhlIEdQU19MT0NLIHRvIHRoZSBwcm9wZXIgdmFsdWVzLCBhcyBmb2xsb3dzOgogICAgIDEuIFEgYmVoYXZpb3IuIFRoaXMgaXMgaWRlbnRpZmllZCBieSBtU3VwcG9ydE5md0NvbnRyb2wgYmVpbmcgMS4gSW4gdGhpcyBjYXNlCkBAIC03NTYsMTAgKzc2MywxNyBAQAogICAgICAgICBnbnNzQ29uZmlnUmVxdWVzdGVkLmFHbG9uYXNzUG9zaXRpb25Qcm90b2NvbE1hc2sgPQogICAgICAgICAgICAgICAgIGdwc0NvbmYuQV9HTE9OQVNTX1BPU19QUk9UT0NPTF9TRUxFQ1Q7CiAgICAgfQotICAgIGduc3NDb25maWdSZXF1ZXN0ZWQubHBwZUNvbnRyb2xQbGFuZU1hc2sgPQotICAgICAgICAgICAgbUxvY0FwaS0+Y29udmVydExwcGVDcChncHNDb25mLkxQUEVfQ1BfVEVDSE5PTE9HWSk7Ci0gICAgZ25zc0NvbmZpZ1JlcXVlc3RlZC5scHBlVXNlclBsYW5lTWFzayA9Ci0gICAgICAgICAgICBtTG9jQXBpLT5jb252ZXJ0THBwZVVwKGdwc0NvbmYuTFBQRV9VUF9URUNITk9MT0dZKTsKKyAgICBpZiAoZ3BzQ29uZi5MUFBFX0NQX1RFQ0hOT0xPR1kpIHsKKyAgICAgICAgZ25zc0NvbmZpZ1JlcXVlc3RlZC5mbGFncyB8PSBHTlNTX0NPTkZJR19GTEFHU19MUFBFX0NPTlRST0xfUExBTkVfVkFMSURfQklUOworICAgICAgICBnbnNzQ29uZmlnUmVxdWVzdGVkLmxwcGVDb250cm9sUGxhbmVNYXNrID0KKyAgICAgICAgICAgICAgICBtTG9jQXBpLT5jb252ZXJ0THBwZUNwKGdwc0NvbmYuTFBQRV9DUF9URUNITk9MT0dZKTsKKyAgICB9CisKKyAgICBpZiAoZ3BzQ29uZi5MUFBFX1VQX1RFQ0hOT0xPR1kpIHsKKyAgICAgICAgZ25zc0NvbmZpZ1JlcXVlc3RlZC5mbGFncyB8PSBHTlNTX0NPTkZJR19GTEFHU19MUFBFX1VTRVJfUExBTkVfVkFMSURfQklUOworICAgICAgICBnbnNzQ29uZmlnUmVxdWVzdGVkLmxwcGVVc2VyUGxhbmVNYXNrID0KKyAgICAgICAgICAgICAgICBtTG9jQXBpLT5jb252ZXJ0THBwZVVwKGdwc0NvbmYuTFBQRV9VUF9URUNITk9MT0dZKTsKKyAgICB9CiAgICAgZ25zc0NvbmZpZ1JlcXVlc3RlZC5ibGFja2xpc3RlZFN2SWRzLmFzc2lnbihtQmxhY2tsaXN0ZWRTdklkcy5iZWdpbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsYWNrbGlzdGVkU3ZJZHMuZW5kKCkpOwogICAgIG1Mb2NBcGktPnNlbmRNc2cobmV3IExvY0FwaU1zZygKQEAgLTIwNzksMTAgKzIwOTMsOSBAQAogICAgICAgICAgICAgICAgIG1hc2spOwogICAgIH0KIAotICAgIGlmIChtQWdwc0NiSW5mby5zdGF0dXNWNENiICE9IE5VTEwpIHsKKyAgICBpZiAobUFncHNNYW5hZ2VyLmlzUmVnaXN0ZXJlZCgpKSB7CiAgICAgICAgIG1hc2sgfD0gTE9DX0FQSV9BREFQVEVSX0JJVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVDsKICAgICB9Ci0KICAgICAvLyBBZGQgT0RDUEkgaGFuZGxpbmcKICAgICBpZiAobnVsbHB0ciAhPSBtT2RjcGlSZXF1ZXN0Q2IpIHsKICAgICAgICAgbWFzayB8PSBMT0NfQVBJX0FEQVBURVJfQklUX1JFUVVFU1RfV0lGSTsKQEAgLTMwNTIsMzIgKzMwNjUsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdwc0xvY2F0aW9uRXh0ZW5kZWQmIGxvY2F0aW9uRXh0ZW5kZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGxvY19zZXNzX3N0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NQb3NUZWNoTWFzayB0ZWNoTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUVuZ2luZUh1YiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEduc3NEYXRhTm90aWZpY2F0aW9uKiBwRGF0YU5vdGlmeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc0luV2VlaykKIHsKLSAgICAvLyBpZiB0aGlzIGV2ZW50IGlzIGNhbGxlZCBmcm9tIFFNSSBMT0MgQVBJLCB0aGVuIHNlbmQgcmVwb3J0IHRvIGVuZ2luZSBodWIKKyAgICAvLyB0aGlzIHBvc2l0aW9uIGlzIGZyb20gUU1JIExPQyBBUEksIHRoZW4gc2VuZCByZXBvcnQgdG8gZW5naW5lIGh1YgogICAgIC8vIGlmIHNlbmRpbmcgaXMgc3VjY2Vzc2Z1bCwgd2UgcmV0dXJuIGFzIHdlIHdpbGwgd2FpdCBmb3IgZmluYWwgcmVwb3J0IGZyb20gZW5naW5lIGh1YgogICAgIC8vIGlmIHRoZSBwb3NpdGlvbiBpcyBjYWxsZWQgZnJvbSBlbmdpbmUgaHViLCB0aGVuIHNlbmQgaXQgb3V0IGRpcmVjdGx5Ci0gICAgaWYgKCFmcm9tRW5naW5lSHViKSB7Ci0gICAgICAgIC8vIHJlcG9ydCBRTUkgcG9zaXRpb24gKGJvdGggcHJvcGFnYXRlZCBhbmQgdW5wcm9wYWdhdGVkKSB0byBlbmdpbmUgaHViLAotICAgICAgICAvLyBhbmQgZW5naW5lIGh1YiB3aWxsIGJlIGRpc3RyaWJ1dGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBwbHVnaW5zCisKKyAgICBpZiAodHJ1ZSA9PSBpbml0RW5nSHViUHJveHkoKSl7CiAgICAgICAgIG1FbmdIdWJQcm94eS0+Z25zc1JlcG9ydFBvc2l0aW9uKHVscExvY2F0aW9uLCBsb2NhdGlvbkV4dGVuZGVkLCBzdGF0dXMpOwotCi0gICAgICAgIGlmICh0cnVlID09IHVscExvY2F0aW9uLnVucHJvcGFnYXRlZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlbmdpbmUgaHViIGlzIGxvYWRlZCwgZG8gbm90IHJlcG9ydCBxbWkgcG9zaXRpb24gdG8gY2xpZW50IGFzCi0gICAgICAgIC8vIGZpbmFsIHBvc2l0aW9uIHJlcG9ydCBzaG91bGQgY29tZSBmcm9tIGVuZ2luZSBodWIKLSAgICAgICAgaWYgKHRydWUgPT0gaW5pdEVuZ0h1YlByb3h5KCkpewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBmb3IgYWxsIG90aGVyIGNhc2VzOgotICAgIC8vIGNhc2UgMTogZml4IGlzIGZyb20gZW5naW5lIGh1YiwgcXVldWUgdGhlIG1zZwotICAgIC8vIGNhc2UgMjogZml4IGlzIG5vdCBmcm9tIGVuZ2luZSBodWIsIGUuZy4gZnJvbSBRTUksIGFuZCBpdCBpcyBub3QgYW4KKyAgICBpZiAodHJ1ZSA9PSB1bHBMb2NhdGlvbi51bnByb3BhZ2F0ZWRQb3NpdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRml4IGlzIGZyb20gUU1JLCBhbmQgaXQgaXMgbm90IGFuCiAgICAgLy8gdW5wcm9wYWdhdGVkIHBvc2l0aW9uIGFuZCBlbmdpbmUgaHViIGlzIG5vdCBsb2FkZWQsIHF1ZXVlIHRoZSBtc2cKICAgICAvLyB3aGVuIG1lc3NhZ2UgaXMgcXVldWVkLCB0aGUgcG9zaXRpb24gY2FuIGJlIGRpc3BhdGNoZWQgdG8gcmVxdWVzdGluZyBjbGllbnQKICAgICBzdHJ1Y3QgTXNnUmVwb3J0UG9zaXRpb24gOiBwdWJsaWMgTG9jTXNnIHsKQEAgLTMxMzQsNiArMzEzOCwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm90aWZ5LCBtc0luV2VlaykpOwogfQogCit2b2lkCitHbnNzQWRhcHRlcjo6cmVwb3J0RW5naW5lUG9zaXRpb25zRXZlbnQodW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZUxvY2F0aW9uSW5mbyogbG9jYXRpb25BcnIpCit7CisgICAgc3RydWN0IE1zZ1JlcG9ydEVuZ2luZVBvc2l0aW9ucyA6IHB1YmxpYyBMb2NNc2cgeworICAgICAgICBHbnNzQWRhcHRlciYgbUFkYXB0ZXI7CisgICAgICAgIHVuc2lnbmVkIGludCBtQ291bnQ7CisgICAgICAgIEVuZ2luZUxvY2F0aW9uSW5mbyBtRW5nTG9jSW5mb1tMT0NfT1VUUFVUX0VOR0lORV9DT1VOVF07CisgICAgICAgIGlubGluZSBNc2dSZXBvcnRFbmdpbmVQb3NpdGlvbnMoR25zc0FkYXB0ZXImIGFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZUxvY2F0aW9uSW5mbyogbG9jYXRpb25BcnIpIDoKKyAgICAgICAgICAgIExvY01zZygpLAorICAgICAgICAgICAgbUFkYXB0ZXIoYWRhcHRlciksCisgICAgICAgICAgICBtQ291bnQoY291bnQpIHsKKyAgICAgICAgICAgIGlmIChtQ291bnQgPiBMT0NfT1VUUFVUX0VOR0lORV9DT1VOVCkgeworICAgICAgICAgICAgICAgIG1Db3VudCA9IExPQ19PVVRQVVRfRU5HSU5FX0NPVU5UOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Db3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkobUVuZ0xvY0luZm8sIGxvY2F0aW9uQXJyLCBzaXplb2YoRW5naW5lTG9jYXRpb25JbmZvKSptQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0IHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnJlcG9ydEVuZ2luZVBvc2l0aW9ucyhtQ291bnQsIG1FbmdMb2NJbmZvKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzZW5kTXNnKG5ldyBNc2dSZXBvcnRFbmdpbmVQb3NpdGlvbnMoKnRoaXMsIGNvdW50LCBsb2NhdGlvbkFycikpOworfQorCiBib29sCiBHbnNzQWRhcHRlcjo6bmVlZFJlcG9ydEZvckduc3NDbGllbnQoY29uc3QgVWxwTG9jYXRpb24mIHVscExvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKQEAgLTMxODgsOSArMzIyMSwyMCBAQAogCiAgICAgICAgIGZvciAoYXV0byBpdD1tQ2xpZW50RGF0YS5iZWdpbigpOyBpdCAhPSBtQ2xpZW50RGF0YS5lbmQoKTsgKytpdCkgewogICAgICAgICAgICAgaWYgKChyZXBvcnRUb0ZscENsaWVudCAmJiBpc0ZscENsaWVudChpdC0+c2Vjb25kKSkgfHwKLSAgICAgICAgICAgICAgIChyZXBvcnRUb0duc3NDbGllbnQgJiYgIWlzRmxwQ2xpZW50KGl0LT5zZWNvbmQpKSkgeworICAgICAgICAgICAgICAgICAgICAocmVwb3J0VG9HbnNzQ2xpZW50ICYmICFpc0ZscENsaWVudChpdC0+c2Vjb25kKSkpIHsKICAgICAgICAgICAgICAgICBpZiAobnVsbHB0ciAhPSBpdC0+c2Vjb25kLmduc3NMb2NhdGlvbkluZm9DYikgewogICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmduc3NMb2NhdGlvbkluZm9DYihsb2NhdGlvbkluZm8pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG51bGxwdHIgIT0gaXQtPnNlY29uZC5lbmdpbmVMb2NhdGlvbnNJbmZvQ2IpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoZmFsc2UgPT0gaW5pdEVuZ0h1YlByb3h5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGVuZ2luZSBodWIgaXMgZGlzYWJsZWQsIHRoaXMgaXMgU1BFIGZpeCBmcm9tIG1vZGVtCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFyayBvbmUgY29weSBtYXJrZWQgYXMgZnVzZWQgYW5kIG9uZSBjb3B5IG1hcmtlZCBhcyBQUEUKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRpc3BhdGNoIGl0IHRvIHRoZSBlbmdpbmVMb2NhdGlvbnNJbmZvQ2IKKyAgICAgICAgICAgICAgICAgICAgR25zc0xvY2F0aW9uSW5mb05vdGlmaWNhdGlvbiBlbmdMb2NhdGlvbnNJbmZvWzJdOworICAgICAgICAgICAgICAgICAgICBlbmdMb2NhdGlvbnNJbmZvWzBdID0gbG9jYXRpb25JbmZvOworICAgICAgICAgICAgICAgICAgICBlbmdMb2NhdGlvbnNJbmZvWzBdLmxvY091dHB1dEVuZ1R5cGUgPSBMT0NfT1VUUFVUX0VOR0lORV9GVVNFRDsKKyAgICAgICAgICAgICAgICAgICAgZW5nTG9jYXRpb25zSW5mb1swXS5mbGFncyB8PSBHTlNTX0xPQ0FUSU9OX0lORk9fT1VUUFVUX0VOR19UWVBFX0JJVDsKKyAgICAgICAgICAgICAgICAgICAgZW5nTG9jYXRpb25zSW5mb1sxXSA9IGxvY2F0aW9uSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5lbmdpbmVMb2NhdGlvbnNJbmZvQ2IoMiwgZW5nTG9jYXRpb25zSW5mbyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudWxscHRyICE9IGl0LT5zZWNvbmQudHJhY2tpbmdDYikgewogICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnRyYWNraW5nQ2IobG9jYXRpb25JbmZvLmxvY2F0aW9uKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zMjM5LDYgKzMyODMsNDggQEAKIH0KIAogdm9pZAorR25zc0FkYXB0ZXI6OnJlcG9ydEVuZ2luZVBvc2l0aW9ucyh1bnNpZ25lZCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVuZ2luZUxvY2F0aW9uSW5mbyogbG9jYXRpb25BcnIpCit7CisgICAgYm9vbCBuZWVkUmVwb3J0RW5naW5lUG9zaXRpb25zID0gZmFsc2U7CisgICAgZm9yIChhdXRvIGl0PW1DbGllbnREYXRhLmJlZ2luKCk7IGl0ICE9IG1DbGllbnREYXRhLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChudWxscHRyICE9IGl0LT5zZWNvbmQuZW5naW5lTG9jYXRpb25zSW5mb0NiKSB7CisgICAgICAgICAgICBuZWVkUmVwb3J0RW5naW5lUG9zaXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgR25zc0xvY2F0aW9uSW5mb05vdGlmaWNhdGlvbiBsb2NhdGlvbkluZm9bTE9DX09VVFBVVF9FTkdJTkVfQ09VTlRdID0ge307CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IEVuZ2luZUxvY2F0aW9uSW5mbyogZW5nTG9jYXRpb24gPSAobG9jYXRpb25BcnIraSk7CisgICAgICAgIC8vIGlmIGl0IGlzIGZ1c2VkL2RlZmF1bHQgbG9jYXRpb24sIGNhbGwgcmVwb3J0UG9zaXRpb24gbWFpbnRhaW4gbGVnYWN5IGJlaGF2aW9yCisgICAgICAgIGlmICgoR1BTX0xPQ0FUSU9OX0VYVEVOREVEX0hBU19PVVRQVVRfRU5HX1RZUEUgJiBlbmdMb2NhdGlvbi0+bG9jYXRpb25FeHRlbmRlZC5mbGFncykgJiYKKyAgICAgICAgICAgIChMT0NfT1VUUFVUX0VOR0lORV9GVVNFRCA9PSBlbmdMb2NhdGlvbi0+bG9jYXRpb25FeHRlbmRlZC5sb2NPdXRwdXRFbmdUeXBlKSkgeworICAgICAgICAgICAgcmVwb3J0UG9zaXRpb24oZW5nTG9jYXRpb24tPmxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5nTG9jYXRpb24tPmxvY2F0aW9uRXh0ZW5kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdMb2NhdGlvbi0+c2Vzc2lvblN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ0xvY2F0aW9uLT5sb2NhdGlvbi50ZWNoX21hc2spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRSZXBvcnRFbmdpbmVQb3NpdGlvbnMpIHsKKyAgICAgICAgICAgIGNvbnZlcnRMb2NhdGlvbkluZm8obG9jYXRpb25JbmZvW2ldLCBlbmdMb2NhdGlvbi0+bG9jYXRpb25FeHRlbmRlZCk7CisgICAgICAgICAgICBjb252ZXJ0TG9jYXRpb24obG9jYXRpb25JbmZvW2ldLmxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ0xvY2F0aW9uLT5sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdMb2NhdGlvbi0+bG9jYXRpb25FeHRlbmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdMb2NhdGlvbi0+bG9jYXRpb24udGVjaF9tYXNrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZWVkUmVwb3J0RW5naW5lUG9zaXRpb25zKSB7CisgICAgICAgIGZvciAoYXV0byBpdD1tQ2xpZW50RGF0YS5iZWdpbigpOyBpdCAhPSBtQ2xpZW50RGF0YS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKG51bGxwdHIgIT0gaXQtPnNlY29uZC5lbmdpbmVMb2NhdGlvbnNJbmZvQ2IpIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmVuZ2luZUxvY2F0aW9uc0luZm9DYihjb3VudCwgbG9jYXRpb25JbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAogR25zc0FkYXB0ZXI6OnJlcG9ydFN2RXZlbnQoY29uc3QgR25zc1N2Tm90aWZpY2F0aW9uJiBzdk5vdGlmeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUVuZ2luZUh1YikKIHsKQEAgLTQxMTIsMjcgKzQxOTgsMTcgQEAKIC8qIElOSVQgTE9DIEFHUFMgTUFOQUdFUiAqLwogCiB2b2lkIEduc3NBZGFwdGVyOjppbml0QWdwcyhjb25zdCBBZ3BzQ2JJbmZvJiBjYkluZm8pIHsKLSAgICBMT0NfTE9HRCgiJXNdOiBtQWdwc0NiSW5mby5jYlByaW9yaXR5IC0gJWQ7ICBjYkluZm8uY2JQcmlvcml0eSAtICVkIiwKLSAgICAgICAgICAgIF9fZnVuY19fLCBtQWdwc0NiSW5mby5jYlByaW9yaXR5LCBjYkluZm8uY2JQcmlvcml0eSkKKyAgICBMT0NfTE9HRCgiJXNdOmNiSW5mby5hdGxUeXBlIC0gJWQiLCBfX2Z1bmNfXywgY2JJbmZvLmF0bFR5cGUpOwogCiAgICAgaWYgKCEoKENvbnRleHRCYXNlOjptR3BzX2NvbmYuQ0FQQUJJTElUSUVTICYgTE9DX0dQU19DQVBBQklMSVRZX01TQikgfHwKICAgICAgICAgICAgIChDb250ZXh0QmFzZTo6bUdwc19jb25mLkNBUEFCSUxJVElFUyAmIExPQ19HUFNfQ0FQQUJJTElUWV9NU0EpKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKG1BZ3BzQ2JJbmZvLmNiUHJpb3JpdHkgPiBjYkluZm8uY2JQcmlvcml0eSkgewotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUFncHNDYkluZm8gPSBjYkluZm87Ci0KLSAgICAgICAgbUFncHNNYW5hZ2VyLnJlZ2lzdGVyRnJhbWV3b3JrU3RhdHVzQ2FsbGJhY2soKEFnbnNzU3RhdHVzSXBWNENiKWNiSW5mby5zdGF0dXNWNENiKTsKLQotICAgICAgICBtQWdwc01hbmFnZXIuY3JlYXRlQWdwc1N0YXRlTWFjaGluZXMoKTsKLQotICAgICAgICAvKiBSZWdpc3RlciBmb3IgQUdQUyBldmVudCBtYXNrICovCi0gICAgICAgIHVwZGF0ZUV2dE1hc2soTE9DX0FQSV9BREFQVEVSX0JJVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICBMT0NfUkVHSVNUUkFUSU9OX01BU0tfRU5BQkxFRCk7Ci0gICAgfQorICAgIG1BZ3BzTWFuYWdlci5jcmVhdGVBZ3BzU3RhdGVNYWNoaW5lcyhjYkluZm8pOworICAgIC8qIFJlZ2lzdGVyIGZvciBBR1BTIGV2ZW50IG1hc2sgKi8KKyAgICB1cGRhdGVFdnRNYXNrKExPQ19BUElfQURBUFRFUl9CSVRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1QsCisgICAgICAgICAgICBMT0NfUkVHSVNUUkFUSU9OX01BU0tfRU5BQkxFRCk7CiB9CiAKIHZvaWQgR25zc0FkYXB0ZXI6OmluaXRBZ3BzQ29tbWFuZChjb25zdCBBZ3BzQ2JJbmZvJiBjYkluZm8pewpAQCAtNDkyMSwxNSArNDk5NywxMCBAQAogCiAgICAgICAgIC8vIHByZXBhcmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucwogICAgICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZW5naW5lIGh1YiB0byByZXBvcnQgYmFjayBwb3NpdGlvbiBldmVudAotICAgICAgICBHbnNzQWRhcHRlclJlcG9ydFBvc2l0aW9uRXZlbnRDYiByZXBvcnRQb3NpdGlvbkV2ZW50Q2IgPQotICAgICAgICAgICAgW3RoaXNdKGNvbnN0IFVscExvY2F0aW9uJiB1bHBMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBHcHNMb2NhdGlvbkV4dGVuZGVkJiBsb2NhdGlvbkV4dGVuZGVkLAotICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICBMb2NQb3NUZWNoTWFzayB0ZWNoTWFzaywKLSAgICAgICAgICAgICAgICAgICBib29sIGZyb21FbmdpbmVIdWIpIHsKKyAgICAgICAgR25zc0FkYXB0ZXJSZXBvcnRFbmdpbmVQb3NpdGlvbnNFdmVudENiIHJlcG9ydFBvc2l0aW9uRXZlbnRDYiA9CisgICAgICAgICAgICBbdGhpc10oaW50IGNvdW50LCBFbmdpbmVMb2NhdGlvbkluZm8qIGxvY2F0aW9uQXJyKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydCBmcm9tIGVuZ2luZSBodWIgb24gYmVoYWxmIG9mIFBQRSB3aWxsIGJlIHRyZWF0ZWQgYXMgZnJvbVVscAotICAgICAgICAgICAgICAgICAgICByZXBvcnRQb3NpdGlvbkV2ZW50KHVscExvY2F0aW9uLCBsb2NhdGlvbkV4dGVuZGVkLCBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVjaE1hc2ssIGZyb21FbmdpbmVIdWIpOworICAgICAgICAgICAgICAgICAgICByZXBvcnRFbmdpbmVQb3NpdGlvbnNFdmVudChjb3VudCwgbG9jYXRpb25BcnIpOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZW5naW5lIGh1YiB0byByZXBvcnQgYmFjayBzdiBldmVudApkaWZmIC0tZ2l0IGEvZ25zcy9HbnNzQWRhcHRlci5oIGIvZ25zcy9HbnNzQWRhcHRlci5oCmluZGV4IGI4NGMzNjUuLjNjY2RkOTYgMTAwNjQ0Ci0tLSBhL2duc3MvR25zc0FkYXB0ZXIuaAorKysgYi9nbnNzL0duc3NBZGFwdGVyLmgKQEAgLTE2Myw3ICsxNjMsNiBAQAogICAgIC8qID09PT0gQUdQUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KICAgICAvLyBUaGlzIG11c3QgYmUgaW5pdGlhbGl6ZWQgdmlhIGluaXRBZ3BzKCkKICAgICBBZ3BzTWFuYWdlciBtQWdwc01hbmFnZXI7Ci0gICAgQWdwc0NiSW5mbyBtQWdwc0NiSW5mbzsKICAgICB2b2lkIGluaXRBZ3BzKGNvbnN0IEFncHNDYkluZm8mIGNiSW5mbyk7CiAKICAgICAvKiA9PT09IE5GVyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTM1MSw5ICszNTAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHcHNMb2NhdGlvbkV4dGVuZGVkJiBsb2NhdGlvbkV4dGVuZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NQb3NUZWNoTWFzayB0ZWNoTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21FbmdpbmVIdWIgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbnNzRGF0YU5vdGlmaWNhdGlvbiogcERhdGFOb3RpZnkgPSBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc0luV2VlayA9IC0xKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVwb3J0RW5naW5lUG9zaXRpb25zRXZlbnQodW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmdpbmVMb2NhdGlvbkluZm8qIGxvY2F0aW9uQXJyKTsKKwogICAgIHZpcnR1YWwgdm9pZCByZXBvcnRTdkV2ZW50KGNvbnN0IEduc3NTdk5vdGlmaWNhdGlvbiYgc3ZOb3RpZnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tRW5naW5lSHViPWZhbHNlKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVwb3J0Tm1lYUV2ZW50KGNvbnN0IGNoYXIqIG5tZWEsIHNpemVfdCBsZW5ndGgpOwpAQCAtMzg2LDYgKzM4Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHcHNMb2NhdGlvbkV4dGVuZGVkICZsb2NhdGlvbkV4dGVuZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBsb2Nfc2Vzc19zdGF0dXMgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgTG9jUG9zVGVjaE1hc2sgdGVjaE1hc2spOworICAgIHZvaWQgcmVwb3J0RW5naW5lUG9zaXRpb25zKHVuc2lnbmVkIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbmdpbmVMb2NhdGlvbkluZm8qIGxvY2F0aW9uQXJyKTsKICAgICB2b2lkIHJlcG9ydFN2KEduc3NTdk5vdGlmaWNhdGlvbiYgc3ZOb3RpZnkpOwogICAgIHZvaWQgcmVwb3J0Tm1lYShjb25zdCBjaGFyKiBubWVhLCBzaXplX3QgbGVuZ3RoKTsKICAgICB2b2lkIHJlcG9ydERhdGEoR25zc0RhdGFOb3RpZmljYXRpb24mIGRhdGFOb3RpZnkpOwpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vTG9jYXRpb25BUEkuY3BwIGIvbG9jYXRpb24vTG9jYXRpb25BUEkuY3BwCmluZGV4IGE0MzE3OGQuLjQzNDhjMjcgMTAwNjQ0Ci0tLSBhL2xvY2F0aW9uL0xvY2F0aW9uQVBJLmNwcAorKysgYi9sb2NhdGlvbi9Mb2NhdGlvbkFQSS5jcHAKQEAgLTg1LDYgKzg1LDcgQEAKICAgICByZXR1cm4gKGxvY2F0aW9uQ2FsbGJhY2tzLmduc3NOaUNiICE9IG51bGxwdHIgfHwKICAgICAgICAgICAgIGxvY2F0aW9uQ2FsbGJhY2tzLnRyYWNraW5nQ2IgIT0gbnVsbHB0ciB8fAogICAgICAgICAgICAgbG9jYXRpb25DYWxsYmFja3MuZ25zc0xvY2F0aW9uSW5mb0NiICE9IG51bGxwdHIgfHwKKyAgICAgICAgICAgIGxvY2F0aW9uQ2FsbGJhY2tzLmVuZ2luZUxvY2F0aW9uc0luZm9DYiAhPSBudWxscHRyIHx8CiAgICAgICAgICAgICBsb2NhdGlvbkNhbGxiYWNrcy5nbnNzTWVhc3VyZW1lbnRzQ2IgIT0gbnVsbHB0cik7CiB9CiAKZGlmZiAtLWdpdCBhL2xvY2F0aW9uL0xvY2F0aW9uQVBJQ2xpZW50QmFzZS5oIGIvbG9jYXRpb24vTG9jYXRpb25BUElDbGllbnRCYXNlLmgKaW5kZXggZmRkYWU2MC4uMDk4MDAwYyAxMDA2NDQKLS0tIGEvbG9jYXRpb24vTG9jYXRpb25BUElDbGllbnRCYXNlLmgKKysrIGIvbG9jYXRpb24vTG9jYXRpb25BUElDbGllbnRCYXNlLmgKQEAgLTQ4OCw2ICs0ODgsNyBAQAogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWRzW2ldID0gbUFQSS5tR2VvZmVuY2VCaURpY3QuZ2V0SWQoc2Vzc2lvbnNbaV0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9DX0xPR0QoIiVzOl1SZXR1cm5lZCBnZW9mZW5jZS1pZDogJWQgaW4gYWRkIGdlb2ZlbmNlIiwgX19GVU5DVElPTl9fLCAqaWRzKTsKICAgICAgICAgICAgIG1BUEkub25BZGRHZW9mZW5jZXNDYihjb3VudCwgZXJyb3JzLCBpZHMpOwogICAgICAgICAgICAgZnJlZShpZHMpOwogICAgICAgICB9CkBAIC01MDUsNiArNTA2LDcgQEAKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWRzW2ldID0gbVJlbW92ZWRHZW9mZW5jZUJpRGljdC0+Z2V0SWQoc2Vzc2lvbnNbaV0pOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0NfTE9HRCgiJXM6XVJldHVybmVkIGdlb2ZlbmNlLWlkOiAlZCBpbiByZW1vdmUgZ2VvZmVuY2UiLCBfX0ZVTkNUSU9OX18sICppZHMpOwogICAgICAgICAgICAgICAgIG1BUEkub25SZW1vdmVHZW9mZW5jZXNDYihjb3VudCwgZXJyb3JzLCBpZHMpOwogICAgICAgICAgICAgICAgIGZyZWUoaWRzKTsKICAgICAgICAgICAgICAgICBkZWxldGUobVJlbW92ZWRHZW9mZW5jZUJpRGljdCk7CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9Mb2NhdGlvbkRhdGFUeXBlcy5oIGIvbG9jYXRpb24vTG9jYXRpb25EYXRhVHlwZXMuaAppbmRleCA0OTgyMmZhLi41MDRiNWNjIDEwMDY0NAotLS0gYS9sb2NhdGlvbi9Mb2NhdGlvbkRhdGFUeXBlcy5oCisrKyBiL2xvY2F0aW9uL0xvY2F0aW9uRGF0YVR5cGVzLmgKQEAgLTE3NSw2ICsxNzUsOCBAQAogICAgIEdOU1NfTE9DQVRJT05fSU5GT19OVU1fU1ZfVVNFRF9JTl9QT1NJVElPTl9CSVQgICAgICA9ICgxPDwyNCksIC8vIG51bWJlciBvZiBTViB1c2VkIGluIHBvc2l0aW9uCiAgICAgR05TU19MT0NBVElPTl9JTkZPX0NBTElCUkFUSU9OX0NPTkZJREVOQ0VfQklUICAgICAgID0gKDE8PDI1KSwgLy8gdmFsaWQgc2Vuc29yIGNhbCBjb25maWRlbmNlCiAgICAgR05TU19MT0NBVElPTl9JTkZPX0NBTElCUkFUSU9OX1NUQVRVU19CSVQgICAgICAgICAgID0gKDE8PDI2KSwgLy8gdmFsaWQgc2Vuc29yIGNhbCBzdGF0dXMKKyAgICBHTlNTX0xPQ0FUSU9OX0lORk9fT1VUUFVUX0VOR19UWVBFX0JJVCAgICAgICAgICAgICAgPSAoMTw8MjcpLCAvLyB2YWxpZCBvdXRwdXQgZW5naW5lIHR5cGUKKyAgICBHTlNTX0xPQ0FUSU9OX0lORk9fT1VUUFVUX0VOR19NQVNLX0JJVCAgICAgICAgICAgICAgPSAoMTw8MjgpLCAvLyB2YWxpZCBvdXRwdXQgZW5naW5lIG1hc2sKIH0gR25zc0xvY2F0aW9uSW5mb0ZsYWdCaXRzOwogCiB0eXBlZGVmIGVudW0gewpAQCAtNjQ2LDYgKzY0OCwxMyBAQAogICAgIEdOU1NfTE9DX01BWF9OVU1CRVJfT0ZfU0lHTkFMX1RZUEVTID0gMjAgICAgLyoqPCAgTWF4aW11bSBudW1iZXIgb2Ygc2lnbmFsIHR5cGVzICovCiB9IEduc3NfTG9jU2lnbmFsRW51bVR5cGU7CiAKK3R5cGVkZWYgdWludDMyX3QgUG9zaXRpb25pbmdFbmdpbmVNYXNrOwordHlwZWRlZiBlbnVtIHsKKyAgICBTVEFOREFSRF9QT1NJVElPTklOR19FTkdJTkUgPSAoMSA8PCAwKSwKKyAgICBERUFEX1JFQ0tPTklOR19FTkdJTkUgICAgICAgPSAoMSA8PCAxKSwKKyAgICBQUkVDSVNFX1BPU0lUSU9OSU5HX0VOR0lORSAgPSAoMSA8PCAyKQorfSBQb3NpdGlvbmluZ0VuZ2luZUJpdHM7CisKIHR5cGVkZWYgdWludDY0X3QgR25zc0RhdGFNYXNrOwogdHlwZWRlZiBlbnVtIHsKICAgICAvLyBKYW1tZXIgSW5kaWNhdG9yIGlzIGF2YWlsYWJsZQpAQCAtNzMxLDE1ICs3NDAsMzUgQEAKICAgICBMb2NhdGlvblNwb29mTWFzayAgICAgIHNwb29mTWFzazsKIH0gTG9jYXRpb247CiAKK3R5cGVkZWYgZW51bSB7CisgICAgTE9DX1JFUV9FTkdJTkVfRlVTRURfQklUID0gKDE8PDApLAorICAgIExPQ19SRVFfRU5HSU5FX1NQRV9CSVQgICA9ICgxPDwxKSwKKyAgICBMT0NfUkVRX0VOR0lORV9QUEVfQklUICAgPSAoMTw8MiksCit9IExvY1JlcUVuZ2luZVR5cGVNYXNrOworCit0eXBlZGVmIGVudW0geworICAgIExPQ19PVVRQVVRfRU5HSU5FX0ZVU0VEICAgPSAwLAorICAgIC8qKiBUaGlzIGlzIHRoZSBHTlNTIGZpeCBmcm9tIG1vZGVtICovCisgICAgTE9DX09VVFBVVF9FTkdJTkVfU1BFICAgICA9IDEsCisgICAgLyoqIFRoaXMgaXMgdGhlIEdOU1MgZml4IHdpdGggY29ycmVjdGlvbiBQUFAvUlRLIGNvcnJlY3Rpb24gKi8KKyAgICBMT0NfT1VUUFVUX0VOR0lORV9QUEUgICAgID0gMiwKKyAgICBMT0NfT1VUUFVUX0VOR0lORV9DT1VOVCwKK30gTG9jT3V0cHV0RW5naW5lVHlwZTsKKwogc3RydWN0IExvY2F0aW9uT3B0aW9ucyB7CiAgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgLy8gc2V0IHRvIHNpemVvZihMb2NhdGlvbk9wdGlvbnMpCiAgICAgdWludDMyX3QgbWluSW50ZXJ2YWw7IC8vIGluIG1pbGxpc2Vjb25kcwogICAgIHVpbnQzMl90IG1pbkRpc3RhbmNlOyAvLyBpbiBtZXRlcnMuIGlmIG1pbkRpc3RhbmNlID4gMCwgZ25zc1N2Q2FsbGJhY2svZ25zc05tZWFDYWxsYmFjay8KICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ25zc01lYXN1cmVtZW50c0NhbGxiYWNrIG1heSBub3QgYmUgY2FsbGVkCiAgICAgR25zc1N1cGxNb2RlIG1vZGU7ICAgIC8vIFN0YW5kYWxvbmUvTVMtQmFzZWQvTVMtQXNzaXN0ZWQKKyAgICAvLyBiZWhhdmlvciB3aGVuIHRoaXMgZmllbGQgaXMgMDoKKyAgICAvLyAgaWYgZW5naW5lIGh1YiBpcyBydW5uaW5nLCB0aGlzIHdpbGwgYmUgZnVzZWQgZml4LAorICAgIC8vICBpZiBlbmdpbmUgaHViIGlzIG5vdCBydW5uaW5nLCB0aGlzIHdpbGwgYmUgU1BFIGZpeAorICAgIExvY1JlcUVuZ2luZVR5cGVNYXNrIGxvY1JlcUVuZ1R5cGVNYXNrOwogCiAgICAgaW5saW5lIExvY2F0aW9uT3B0aW9ucygpIDoKLSAgICAgICAgICAgIHNpemUoMCksIG1pbkludGVydmFsKDApLCBtaW5EaXN0YW5jZSgwKSwgbW9kZShHTlNTX1NVUExfTU9ERV9TVEFOREFMT05FKSB7fQorICAgICAgICAgICAgc2l6ZSgwKSwgbWluSW50ZXJ2YWwoMCksIG1pbkRpc3RhbmNlKDApLCBtb2RlKEdOU1NfU1VQTF9NT0RFX1NUQU5EQUxPTkUpLAorICAgICAgICAgICAgbG9jUmVxRW5nVHlwZU1hc2soKExvY1JlcUVuZ2luZVR5cGVNYXNrKTApIHt9CiB9OwogCiB0eXBlZGVmIGVudW0gewpAQCAtNzY0LDkgKzc5MywxMSBAQAogICAgIGlubGluZSBUcmFja2luZ09wdGlvbnMoY29uc3QgTG9jYXRpb25PcHRpb25zJiBvcHRpb25zKSA6CiAgICAgICAgICAgICBMb2NhdGlvbk9wdGlvbnMob3B0aW9ucyksIHBvd2VyTW9kZShHTlNTX1BPV0VSX01PREVfSU5WQUxJRCksIHRibSgwKSB7fQogICAgIGlubGluZSB2b2lkIHNldExvY2F0aW9uT3B0aW9ucyhjb25zdCBMb2NhdGlvbk9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgICAgICAgc2l6ZSA9IHNpemVvZihUcmFja2luZ09wdGlvbnMpOwogICAgICAgICBtaW5JbnRlcnZhbCA9IG9wdGlvbnMubWluSW50ZXJ2YWw7CiAgICAgICAgIG1pbkRpc3RhbmNlID0gb3B0aW9ucy5taW5EaXN0YW5jZTsKICAgICAgICAgbW9kZSA9IG9wdGlvbnMubW9kZTsKKyAgICAgICAgbG9jUmVxRW5nVHlwZU1hc2sgPSBvcHRpb25zLmxvY1JlcUVuZ1R5cGVNYXNrOwogICAgIH0KICAgICBpbmxpbmUgTG9jYXRpb25PcHRpb25zIGdldExvY2F0aW9uT3B0aW9ucygpIHsKICAgICAgICAgTG9jYXRpb25PcHRpb25zIGxvY09wdGlvbjsKQEAgLTc3NCw2ICs4MDUsNyBAQAogICAgICAgICBsb2NPcHRpb24ubWluRGlzdGFuY2UgPSBtaW5EaXN0YW5jZTsKICAgICAgICAgbG9jT3B0aW9uLm1pbkludGVydmFsID0gbWluSW50ZXJ2YWw7CiAgICAgICAgIGxvY09wdGlvbi5tb2RlID0gbW9kZTsKKyAgICAgICAgbG9jT3B0aW9uLmxvY1JlcUVuZ1R5cGVNYXNrID0gbG9jUmVxRW5nVHlwZU1hc2s7CiAgICAgICAgIHJldHVybiBsb2NPcHRpb247CiAgICAgfQogfTsKQEAgLTk5Nyw2ICsxMDI5LDE1IEBACiAgICAgdWludDhfdCBjYWxpYnJhdGlvbkNvbmZpZGVuY2U7ICAgICAgICAgICAgICAgIC8vIFNlbnNvciBjYWxpYnJhdGlvbiBjb25maWRlbmNlIHBlcmNlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHJhbmdlIG9mIFswLCAxMDBdCiAgICAgRHJDYWxpYnJhdGlvblN0YXR1c01hc2sgY2FsaWJyYXRpb25TdGF0dXM7ICAgIC8vIFNlbnNvciBjYWxpYnJhdGlvbiBzdGF0dXMKKyAgICAvLyBsb2NhdGlvbiBlbmdpbmUgdHlwZS4gV2hlbiB0aGUgZml4LiB3aGVuIHRoZSB0eXBlIGlzIHNldCB0bworICAgIC8vIExPQ19FTkdJTkVfU1JDX0ZVU0VELCB0aGUgZml4IGlzIHRoZSBwcm9wYWdhdGVkL2FnZ3JlZ2F0ZWQKKyAgICAvLyByZXBvcnRzIGZyb20gYWxsIGVuZ2luZXMgcnVubmluZyBvbiB0aGUgc3lzdGVtIChlLmcuOgorICAgIC8vIERSL1NQRS9QUEUpLiBUbyBjaGVjayB3aGljaCBsb2NhdGlvbiBlbmdpbmUgY29udHJpYnV0ZXMgdG8KKyAgICAvLyB0aGUgZnVzZWQgb3V0cHV0LCBjaGVjayBmb3IgbG9jT3V0cHV0RW5nTWFzay4KKyAgICBMb2NPdXRwdXRFbmdpbmVUeXBlIGxvY091dHB1dEVuZ1R5cGU7CisgICAgLy8gd2hlbiBsb2Mgb3V0cHV0IGVuZyB0eXBlIGlzIHNldCB0byBmdXNlZCwgdGhpcyBmaWVsZAorICAgIC8vIGluZGljYXRlcyB0aGUgc2V0IG9mIGVuZ2luZXMgY29udHJpYnV0ZSB0byB0aGUgZml4LgorICAgIFBvc2l0aW9uaW5nRW5naW5lTWFzayBsb2NPdXRwdXRFbmdNYXNrOwogfSBHbnNzTG9jYXRpb25JbmZvTm90aWZpY2F0aW9uOwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xMzE3LDYgKzEzNTgsMjAgQEAKICAgICBHbnNzTG9jYXRpb25JbmZvTm90aWZpY2F0aW9uIGduc3NMb2NhdGlvbkluZm9Ob3RpZmljYXRpb24KICk+IGduc3NMb2NhdGlvbkluZm9DYWxsYmFjazsKIAorLyogR2l2ZXMgZGVmYXVsdCBjb21iaW5lZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGFsbCBlbmdpbmVzIGFuZAorICAgbG9jYXRpb24gaW5mb3JtYXRpb24gaW5kaXZpZHVhbGx5IGZyb20gc2VsZWN0ZWQgZW5naW5lcy4KKyAgIFRoaXMgY2FsbGJhY2sgaXMgb25seSB1c2VkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVuZ2luZXMKKyAgIHJ1bm5pbmcgaW4gdGhlIHN5c3RlbS4KKworICAgb3B0aW9uYWwgY2FuIGJlIE5VTEwKKworICAgZW5naW5lTG9jYXRpb25zSW5mb0NhbGxiYWNrIGlzIGNhbGxlZCBvbmx5IGR1cmluZyBhIHRyYWNraW5nIHNlc3Npb24KKyAgIGJyb2FkY2FzdGVkIHRvIGFsbCBjbGllbnRzLCBubyBtYXR0ZXIgaWYgYSBzZXNzaW9uIGhhcyBzdGFydGVkIGJ5IGNsaWVudCAqLwordHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoCisgICAgdWludDMyX3QgY291bnQsCisgICAgR25zc0xvY2F0aW9uSW5mb05vdGlmaWNhdGlvbiogZW5naW5lTG9jYXRpb25JbmZvTm90aWZpY2F0aW9uCispPiBlbmdpbmVMb2NhdGlvbnNJbmZvQ2FsbGJhY2s7CisKIC8qIFVzZWQgZm9yIGFkZEdlb2ZlbmNlcyBBUEksIG9wdGlvbmFsIGNhbiBiZSBOVUxMCiAgICBnZW9mZW5jZUJyZWFjaENhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIGFueSBudW1iZXIgb2YgZ2VvZmVuY2VzIGhhdmUgYSBzdGF0ZSBjaGFuZ2UgKi8KIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKApAQCAtMTQwMyw2ICsxNDU4LDcgQEAKICAgICBnbnNzTWVhc3VyZW1lbnRzQ2FsbGJhY2sgZ25zc01lYXN1cmVtZW50c0NiOyAgICAgLy8gb3B0aW9uYWwKICAgICBiYXRjaGluZ1N0YXR1c0NhbGxiYWNrIGJhdGNoaW5nU3RhdHVzQ2I7ICAgICAgICAgLy8gb3B0aW9uYWwKICAgICBsb2NhdGlvblN5c3RlbUluZm9DYWxsYmFjayBsb2NhdGlvblN5c3RlbUluZm9DYjsgLy8gb3B0aW9uYWwKKyAgICBlbmdpbmVMb2NhdGlvbnNJbmZvQ2FsbGJhY2sgZW5naW5lTG9jYXRpb25zSW5mb0NiOyAgICAgLy8gb3B0aW9uYWwKIH0gTG9jYXRpb25DYWxsYmFja3M7CiAKICNlbmRpZiAvKiBMT0NBVElPTkRBVEFUWVBFU19IICovCmRpZmYgLS1naXQgYS91dGlscy9NYWtlZmlsZS5hbSBiL3V0aWxzL01ha2VmaWxlLmFtCmluZGV4IDgwNzkxNmQuLjlhOWM2N2UgMTAwNjQ0Ci0tLSBhL3V0aWxzL01ha2VmaWxlLmFtCisrKyBiL3V0aWxzL01ha2VmaWxlLmFtCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgIGdwc19leHRlbmRlZC5oIFwKICAgICAgICAgbG9jX2dwcy5oIFwKICAgICAgICAgbG9nX3V0aWwuaCBcCisgICAgICAgIExvY1NoYXJlZExvY2suaCBcCiAgICAgICAgIExvY1Vub3JkZXJlZFNldE1hcC5oCiAKIGxpYmdwc191dGlsc19sYV9jX3NvdXJjZXMgPSBcCmRpZmYgLS1naXQgYS91dGlscy9ncHNfZXh0ZW5kZWRfYy5oIGIvdXRpbHMvZ3BzX2V4dGVuZGVkX2MuaAppbmRleCBiNzQ5NzgzLi42OWE2NTllIDEwMDY0NAotLS0gYS91dGlscy9ncHNfZXh0ZW5kZWRfYy5oCisrKyBiL3V0aWxzL2dwc19leHRlbmRlZF9jLmgKQEAgLTE5NCwxNSArMTk0LDE0IEBACiAvKio8ICBEZW5vdGVzIEFQTiB0eXBlIGZvciBlbWVyZ2VuY3kgICovCiAjZGVmaW5lIExPQ19BUE5fVFlQRV9NQVNLX0VNRVJHRU5DWSAoKExvY0FwblR5cGVNYXNrKTB4MDAwMDAyMDApCiAKLXR5cGVkZWYgZW51bSB7Ci0gICAgQUdQU19DQl9QUklPUklUWV9MT1cgID0gMSwKLSAgICBBR1BTX0NCX1BSSU9SSVRZX01FRCAgPSAyLAotICAgIEFHUFNfQ0JfUFJJT1JJVFlfSElHSCA9IDMKLX0gQWdwc0NiUHJpb3JpdHk7Cit0eXBlZGVmIHVpbnQzMl90IEFHcHNUeXBlTWFzazsKKyNkZWZpbmUgQUdQU19BVExfVFlQRV9TVVBMICAgICAgICgoQUdwc1R5cGVNYXNrKTB4MDAwMDAwMDEpCisjZGVmaW5lIEFHUFNfQVRMX1RZUEVfU1VQTF9FUyAgICgoQUdwc1R5cGVNYXNrKTB4MDAwMDAwMDIpCisjZGVmaW5lIEFHUFNfQVRMX1RZUEVfV1dBTiAgICAgICAoKEFHcHNUeXBlTWFzaykweDAwMDAwMDA0KQogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgdm9pZCogc3RhdHVzVjRDYjsKLSAgICBBZ3BzQ2JQcmlvcml0eSBjYlByaW9yaXR5OworICAgIEFHcHNUeXBlTWFzayBhdGxUeXBlOwogfSBBZ3BzQ2JJbmZvOwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0zODUsNiArMzg0LDEzIEBACiAjZGVmaW5lIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfQ0FMSUJSQVRJT05fQ09ORklERU5DRSAweDgwMDAwMDAwMAogLyoqIEdwc0xvY2F0aW9uRXh0ZW5kZWQgaGFzIHNlbnNvciBjYWxpYnJhdGlvbiBzdGF0dXMgKi8KICNkZWZpbmUgR1BTX0xPQ0FUSU9OX0VYVEVOREVEX0hBU19DQUxJQlJBVElPTl9TVEFUVVMgICAgIDB4MTAwMDAwMDAwMAorLyoqIEdwc0xvY2F0aW9uRXh0ZW5kZWQgaGFzIHRoZSBlbmdpbmUgdHlwZSB0aGF0IHByb2R1Y2VkIHRoaXMKKyAqICBwb3NpdGlvbiwgdGhlIGJpdCBtYXNrIHdpbGwgb25seSBiZSBzZXQgd2hlbiB0aGVyZSBhcmUgdHdvCisgKiAgb3IgbW9yZSBwb3NpdGlvbiBlbmdpbmVzIHJ1bm5pbmcgaW4gdGhlIHN5c3RlbSAqLworI2RlZmluZSBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX09VVFBVVF9FTkdfVFlQRSAgICAgICAweDIwMDAwMDAwMDAKKyAvKiogR3BzTG9jYXRpb25FeHRlbmRlZCBoYXMgdGhlIGVuZ2luZSBtYXNrIHRoYXQgaW5kaWNhdGVzIHRoZQorICAqICAgICBzZXQgb2YgZW5naW5lcyBjb250cmlidXRlIHRvIHRoZSBmaXguICovCisjZGVmaW5lIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfT1VUUFVUX0VOR19NQVNLICAgICAgIDB4NDAwMDAwMDAwMAogCiB0eXBlZGVmIHVpbnQzMl90IExvY05hdlNvbHV0aW9uTWFzazsKIC8qIEJpdG1hc2sgdG8gc3BlY2lmeSB3aGV0aGVyIFNCQVMgaW9ub3NwaGVyaWMgY29ycmVjdGlvbiBpcyB1c2VkICAqLwpAQCAtNzk4LDYgKzgwNCwxNSBAQAogICAgIC8qKiBTZW5zb3IgY2FsaWJyYXRpb24gY29uZmlkZW5jZSBwZXJjZW50LiBSYW5nZTogMCAtIDEwMCAqLwogICAgIHVpbnQ4X3QgY2FsaWJyYXRpb25Db25maWRlbmNlOwogICAgIERyQ2FsaWJyYXRpb25TdGF0dXNNYXNrIGNhbGlicmF0aW9uU3RhdHVzOworICAgIC8qIGxvY2F0aW9uIGVuZ2luZSB0eXBlLiBXaGVuIHRoZSBmaXguIHdoZW4gdGhlIHR5cGUgaXMgc2V0IHRvCisgICAgICAgIExPQ19FTkdJTkVfU1JDX0ZVU0VELCB0aGUgZml4IGlzIHRoZSBwcm9wYWdhdGVkL2FnZ3JlZ2F0ZWQKKyAgICAgICAgcmVwb3J0cyBmcm9tIGFsbCBlbmdpbmVzIHJ1bm5pbmcgb24gdGhlIHN5c3RlbSAoZS5nLjoKKyAgICAgICAgRFIvU1BFL1BQRSkuIFRvIGNoZWNrIHdoaWNoIGxvY2F0aW9uIGVuZ2luZSBjb250cmlidXRlcyB0bworICAgICAgICB0aGUgZnVzZWQgb3V0cHV0LCBjaGVjayBmb3IgbG9jT3V0cHV0RW5nTWFzay4gKi8KKyAgICBMb2NPdXRwdXRFbmdpbmVUeXBlIGxvY091dHB1dEVuZ1R5cGU7CisgICAgLyogd2hlbiBsb2Mgb3V0cHV0IGVuZyB0eXBlIGlzIHNldCB0byBmdXNlZCwgdGhpcyBmaWVsZAorICAgICAgICBpbmRpY2F0ZXMgdGhlIHNldCBvZiBlbmdpbmVzIGNvbnRyaWJ1dGUgdG8gdGhlIGZpeC4gKi8KKyAgICBQb3NpdGlvbmluZ0VuZ2luZU1hc2sgbG9jT3V0cHV0RW5nTWFzazsKIH0gR3BzTG9jYXRpb25FeHRlbmRlZDsKIAogZW51bSBsb2Nfc2Vzc19zdGF0dXMgewpAQCAtODA2LDYgKzgyMSwxMyBAQAogICAgIExPQ19TRVNTX0ZBSUxVUkUKIH07CiAKKy8vIHN0cnVjdCB0aGF0IGNvbnRhaW5zIGNvbXBsZXRlIHBvc2l0aW9uIGluZm8gZnJvbSBlbmdpbmUKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVbHBMb2NhdGlvbiBsb2NhdGlvbjsKKyAgICBHcHNMb2NhdGlvbkV4dGVuZGVkIGxvY2F0aW9uRXh0ZW5kZWQ7CisgICAgZW51bSBsb2Nfc2Vzc19zdGF0dXMgc2Vzc2lvblN0YXR1czsKK30gRW5naW5lTG9jYXRpb25JbmZvOworCiAvLyBObWVhIHNlbnRlbmNlIHR5cGVzIG1hc2sKIHR5cGVkZWYgdWludDMyX3QgTm1lYVNlbnRlbmNlVHlwZXNNYXNrOwogI2RlZmluZSBMT0NfTk1FQV9NQVNLX0dHQV9WMDIgICAoKE5tZWFTZW50ZW5jZVR5cGVzTWFzaykweDAwMDAwMDAxKSAvKio8ICBFbmFibGUgR0dBIHR5cGUgICovCkBAIC04MjYsNiArODQ4LDIwIEBACiAjZGVmaW5lIExPQ19OTUVBX01BU0tfUFFHU0FfVjAyICgoTm1lYVNlbnRlbmNlVHlwZXNNYXNrKTB4MDAwMDgwMDApIC8qKjwgIEVuYWJsZSBQUUdTQSB0eXBlICAqLwogI2RlZmluZSBMT0NfTk1FQV9NQVNLX1BRR1NWX1YwMiAoKE5tZWFTZW50ZW5jZVR5cGVzTWFzaykweDAwMDEwMDAwKSAvKio8ICBFbmFibGUgUFFHU1YgdHlwZSAgKi8KICNkZWZpbmUgTE9DX05NRUFfTUFTS19ERUJVR19WMDIgKChObWVhU2VudGVuY2VUeXBlc01hc2spMHgwMDAyMDAwMCkgLyoqPCAgRW5hYmxlIERFQlVHIHR5cGUgICovCisjZGVmaW5lIExPQ19OTUVBX01BU0tfR1BEVE1fVjAyICgoTm1lYVNlbnRlbmNlVHlwZXNNYXNrKTB4MDAwNDAwMDApIC8qKjwgIEVuYWJsZSBHUERUTSB0eXBlICAqLworI2RlZmluZSBMT0NfTk1FQV9NQVNLX0dOR0dBX1YwMiAoKE5tZWFTZW50ZW5jZVR5cGVzTWFzaykweDAwMDgwMDAwKSAvKio8ICBFbmFibGUgR05HR0EgdHlwZSAgKi8KKyNkZWZpbmUgTE9DX05NRUFfTUFTS19HTlJNQ19WMDIgKChObWVhU2VudGVuY2VUeXBlc01hc2spMHgwMDEwMDAwMCkgLyoqPCAgRW5hYmxlIEdOUk1DIHR5cGUgICovCisjZGVmaW5lIExPQ19OTUVBX01BU0tfR05WVEdfVjAyICgoTm1lYVNlbnRlbmNlVHlwZXNNYXNrKTB4MDAyMDAwMDApIC8qKjwgIEVuYWJsZSBHTlZURyB0eXBlICAqLworI2RlZmluZSBMT0NfTk1FQV9NQVNLX0dBR05TX1YwMiAoKE5tZWFTZW50ZW5jZVR5cGVzTWFzaykweDAwNDAwMDAwKSAvKio8ICBFbmFibGUgR0FHTlMgdHlwZSAgKi8KKyNkZWZpbmUgTE9DX05NRUFfTUFTS19HQkdHQV9WMDIgKChObWVhU2VudGVuY2VUeXBlc01hc2spMHgwMDgwMDAwMCkgLyoqPCAgRW5hYmxlIEdCR0dBIHR5cGUgICovCisjZGVmaW5lIExPQ19OTUVBX01BU0tfR0JHU0FfVjAyICgoTm1lYVNlbnRlbmNlVHlwZXNNYXNrKTB4MDEwMDAwMDApIC8qKjwgIEVuYWJsZSBHQkdTQSB0eXBlICAqLworI2RlZmluZSBMT0NfTk1FQV9NQVNLX0dCR1NWX1YwMiAoKE5tZWFTZW50ZW5jZVR5cGVzTWFzaykweDAyMDAwMDAwKSAvKio8ICBFbmFibGUgR0JHU1YgdHlwZSAgKi8KKyNkZWZpbmUgTE9DX05NRUFfTUFTS19HQlJNQ19WMDIgKChObWVhU2VudGVuY2VUeXBlc01hc2spMHgwNDAwMDAwMCkgLyoqPCAgRW5hYmxlIEdCUk1DIHR5cGUgICovCisjZGVmaW5lIExPQ19OTUVBX01BU0tfR0JWVEdfVjAyICgoTm1lYVNlbnRlbmNlVHlwZXNNYXNrKTB4MDgwMDAwMDApIC8qKjwgIEVuYWJsZSBHQlZURyB0eXBlICAqLworI2RlZmluZSBMT0NfTk1FQV9NQVNLX0dRR1NWX1YwMiAoKE5tZWFTZW50ZW5jZVR5cGVzTWFzaykweDEwMDAwMDAwKSAvKio8ICBFbmFibGUgR1FHU1YgdHlwZSAgKi8KKyNkZWZpbmUgTE9DX05NRUFfTUFTS19HSUdTVl9WMDIgKChObWVhU2VudGVuY2VUeXBlc01hc2spMHgyMDAwMDAwMCkgLyoqPCAgRW5hYmxlIEdJR1NWIHR5cGUgICovCisjZGVmaW5lIExPQ19OTUVBX01BU0tfR05EVE1fVjAyICgoTm1lYVNlbnRlbmNlVHlwZXNNYXNrKTB4NDAwMDAwMDApIC8qKjwgIEVuYWJsZSBHTkRUTSB0eXBlICAqLworCiAKIC8vIGFsbCBiaXRtYXNrcyBvZiBnZW5lcmFsIHN1cHBvcnRlZCBOTUVBIHNlbnRlbnNlcyAtIGRlYnVnIGlzIG5vdCBwYXJ0IG9mIHRoaXMKICNkZWZpbmUgTE9DX05NRUFfQUxMX0dFTkVSQUxfU1VQUE9SVEVEX01BU0sgIChMT0NfTk1FQV9NQVNLX0dHQV9WMDIgfCBMT0NfTk1FQV9NQVNLX1JNQ19WMDIgfCBcCkBAIC04MzMsNyArODY5LDEyIEBACiAgICAgICAgIExPQ19OTUVBX01BU0tfUFFYRklfVjAyIHwgTE9DX05NRUFfTUFTS19QU1RJU19WMDIgfCBMT0NfTk1FQV9NQVNLX0dMR1NWX1YwMiB8IFwKICAgICAgICAgTE9DX05NRUFfTUFTS19HTkdTQV9WMDIgfCBMT0NfTk1FQV9NQVNLX0dOR05TX1YwMiB8IExPQ19OTUVBX01BU0tfR0FSTUNfVjAyIHwgXAogICAgICAgICBMT0NfTk1FQV9NQVNLX0dBR1NWX1YwMiB8IExPQ19OTUVBX01BU0tfR0FHU0FfVjAyIHwgTE9DX05NRUFfTUFTS19HQVZUR19WMDIgfCBcCi0gICAgICAgIExPQ19OTUVBX01BU0tfR0FHR0FfVjAyIHwgTE9DX05NRUFfTUFTS19QUUdTQV9WMDIgfCBMT0NfTk1FQV9NQVNLX1BRR1NWX1YwMikKKyAgICAgICAgTE9DX05NRUFfTUFTS19HQUdHQV9WMDIgfCBMT0NfTk1FQV9NQVNLX1BRR1NBX1YwMiB8IExPQ19OTUVBX01BU0tfUFFHU1ZfVjAyIHwgXAorICAgICAgICBMT0NfTk1FQV9NQVNLX0dQRFRNX1YwMiB8IExPQ19OTUVBX01BU0tfR05HR0FfVjAyIHwgTE9DX05NRUFfTUFTS19HTlJNQ19WMDIgfCBcCisgICAgICAgIExPQ19OTUVBX01BU0tfR05WVEdfVjAyIHwgTE9DX05NRUFfTUFTS19HQUdOU19WMDIgfCBMT0NfTk1FQV9NQVNLX0dCR0dBX1YwMiB8IFwKKyAgICAgICAgTE9DX05NRUFfTUFTS19HQkdTQV9WMDIgfCBMT0NfTk1FQV9NQVNLX0dCR1NWX1YwMiB8IExPQ19OTUVBX01BU0tfR0JSTUNfVjAyIHwgXAorICAgICAgICBMT0NfTk1FQV9NQVNLX0dCVlRHX1YwMiB8IExPQ19OTUVBX01BU0tfR1FHU1ZfVjAyIHwgTE9DX05NRUFfTUFTS19HSUdTVl9WMDIgfCBcCisgICAgICAgIExPQ19OTUVBX01BU0tfR05EVE1fVjAyKQogCiB0eXBlZGVmIGVudW0gewogICBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX1FVSVBDID0gMCwKZGlmZiAtLWdpdCBhL3V0aWxzL2xvY19ubWVhLmNwcCBiL3V0aWxzL2xvY19ubWVhLmNwcAppbmRleCAyMDc0ZTNlLi40MWE3MDdkIDEwMDY0NAotLS0gYS91dGlscy9sb2Nfbm1lYS5jcHAKKysrIGIvdXRpbHMvbG9jX25tZWEuY3BwCkBAIC0yMDc2LDUgKzIwNzYsMTMgQEAKICAgICAgICAgICAgIGxvY19ubWVhX3N2X21ldGFfaW5pdChzdl9tZXRhLCBzdl9jYWNoZV9pbmZvLCBHTlNTX1NWX1RZUEVfQkVJRE9VLAogICAgICAgICAgICAgR05TU19TSUdOQUxfQkVJRE9VX0IyQUksZmFsc2UpLCBubWVhQXJyYXlzdHIpOwogCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0kR0lHU1YgKE5BVklDOkw1KS0tLS0tLQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBsb2Nfbm1lYV9nZW5lcmF0ZV9HU1Yoc3ZOb3RpZnksIHNlbnRlbmNlLCBzaXplb2Yoc2VudGVuY2UpLAorICAgICAgICAgICAgbG9jX25tZWFfc3ZfbWV0YV9pbml0KHN2X21ldGEsIHN2X2NhY2hlX2luZm8sIEdOU1NfU1ZfVFlQRV9OQVZJQywKKyAgICAgICAgICAgIEdOU1NfU0lHTkFMX05BVklDX0w1LGZhbHNlKSwgbm1lYUFycmF5c3RyKTsKKwogICAgIEVYSVRfTE9HKCVkLCAwKTsKIH0K